【问题标题】:SKLearn - Unusually high performance with Random Forest using a single featureSKLearn - 使用单一特征的随机森林异常高性能
【发布时间】:2019-03-30 11:06:22
【问题描述】:

我使用随机森林作为数据集的二元分类器,结果似乎不可信,但我找不到问题所在。

问题在于示例显然不能通过设置阈值来分离,因为正/负示例的感兴趣特征的值是高度同质的。当只使用单个特征进行二元分类时,RF 应该只能通过设置正/负识别的绝对阈值来区分示例,对吧?如果是这样,下面的代码如何在测试集上取得完美的性能?

附:在实践中,我有比下面显示的大约 30 个示例更多的示例,但仅将这些示例作为示例。评估 >100 时的性能相同。

import numpy as np
from sklearn.ensemble import RandomForestClassifier

X_train = np.array([0.427948, 0.165065, 0.31179, 0.645415, 0.125764,
                    0.448908, 0.417467, 0.524891, 0.038428, 0.441921,
                    0.927511, 0.556332, 0.243668, 0.565939, 0.265502,
                    0.122271, 0.275983, 0.60786, 0.670742, 0.565939,
                    0.117031, 0.117031, 0.001747, 0.148472, 0.038428,
                    0.50393, 0.49607, 0.148472, 0.275983, 0.191266,
                    0.254148, 0.430568, 0.198253, 0.323144, 0.29869,
                    0.344978, 0.524891, 0.323144, 0.344978, 0.28821,
                    0.441921, 0.127511, 0.31179, 0.254148, 0, 0.001747,
                    0.243668, 0.281223, 0.281223, 0.427948, 0.548472,
                    0.927511, 0.417467, 0.282969, 0.367686, 0.198253,
                    0.572926, 0.29869, 0.570306, 0.183406, 0.310044,
                    1, 1, 0.60786, 0, 0.282969, 0.349345, 0.521106,
                    0.430568, 0.127511, 0.50393, 0.367686, 0.310044,
                    0.556332, 0.670742, 0.30393, 0.548472, 0.193886,
                    0.349345, 0.122271, 0.193886, 0.265502, 0.537991,
                    0.165065, 0.191266])
y_train = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0,
                    0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1,
                    1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0,
                    1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0,
                    1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
                    0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1,
                    0, 0, 1, 0, 0, 0, 0])


X_test = np.array((0.572926, 0.521106, 0.49607, 0.570306, 0.645415,
                   0.125764, 0.448908, 0.30393, 0.183406, 0.537991))
y_test = np.array((1, 1, 1, 0, 0, 0, 1, 1, 0, 0))

# Instantiate model and set parameters
clf = RandomForestClassifier()
clf.set_params(n_estimators=500, criterion='gini', max_features='sqrt')

# Note: reshape is because RF requires column vector format, # but 
default NumPy is row
clf.fit(X_train.reshape(-1, 1), y_train)
pred = clf.predict(X_test.reshape(-1, 1))

# sort by feature value for comparison
o = np.argsort(X_test)

print('Example#\tX\t\t\tY_test\tY_true')
    for i in o:
        print('%d\t\t\t%f\t%d\t%d' % (i, X_test[i], y_test[i], pred[i]))

然后返回:

Example#    X           Y_test  Y_true
5           0.125764    0   0
8           0.183406    0   0
7           0.303930    1   1
6           0.448908    1   1
2           0.496070    1   1
1           0.521106    1   1
9           0.537991    0   0
3           0.570306    0   0
0           0.572926    1   1
4           0.645415    0   0

具有单一特征的 RF 模型如何区分这些示例?不是有什么问题吗?我查看了分类器的配置和诸如此类的东西,但找不到任何问题。我在想这可能是一个过度拟合的问题(但是我正在做 10 倍交叉验证,所以这似乎不太可能),但后来我在 Random Forest 分类的官方网页上看到了这句话——“Random forests does不会过拟合。你可以随心所欲地运行任意数量的树。” (https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#remarks)

【问题讨论】:

    标签: python scikit-learn classification random-forest


    【解决方案1】:

    当只使用单个特征进行二元分类时,RF 应该只能通过设置正负识别的绝对阈值来区分示例,对吧?

    每个分支只能通过一个阈值来区分,但是每棵树都是由几个分支组成的。如果可以将 X 空间拆分为多个区间,使得每个区间具有相同的 y 值,那么只要分类器有足够的数据来获得这些区间的边界,它就能够预测测试集。但是,我注意到您的“测试”集似乎是您的训练集的一个子集,这违背了拥有测试集的目的。当然,如果你在数据上测试它而不是你训练的,准确度会很高。尝试按 X 值对数据进行排序,然后获取不在训练集中但位于具有不同 y 值的两个相邻 X_train 值之间的 X 值。例如,x=.001。您应该会看到准确率直线下降。

    【讨论】:

    • 感谢您的澄清!训练集和测试集实际上并不是彼此的子集,但是有些示例共享相同的特征值。我给出的示例取自用于 10 折交叉验证的第一次训练/测试拆分(新模型实例化每一折)。我应该补充的一件事是,当我使用 SVM 执行相同的任务时,性能比偶然性稍差。所以我想不通的是为什么 RF 和 SVM 之间的性能会如此不同?明明不正确,但是我找不到问题。
    • @CuChemist SVM 专为有单一阈值的情况而设计。当边界复杂时,它们表现不佳,特别是没有根据数据进行任何修改。
    猜你喜欢
    • 2014-04-17
    • 2021-05-09
    • 2020-03-12
    • 2021-08-29
    • 1970-01-01
    • 2020-08-19
    • 2020-05-16
    • 2017-10-21
    • 2016-07-23
    相关资源
    最近更新 更多