RandomForestClassifier估算器的奇怪行为_

时间:2017-09-26 11:06:34

标签: python tree scikit-learn random-forest

我有这段代码:

      R.Time (min)  Intensity 215  Intensity 260  Intensity 280
0          0.00000              0              0              0
1          0.01067              0              0              0
2          0.02133              0              0              0
3          0.03200              0              0              0

可以找到csv here。 虽然随机森林只包含一个决策树,其准确度为0.97,但当我从估算器中检查树的准确性时,我的准确度为0.14。 似乎有些事情是错误的,因为它应该是同一个决策树。

任何人都可以帮助我理解为什么会这样吗?如何使用估算器中的树_?

获得相同的精度

1 个答案:

答案 0 :(得分:2)

在问题上使用内部子预测变量时要小心。由于这不是设计案例,您应该害怕丢失信息。

通过一些分析,您应该已经找到了这个问题的来源。

演示:

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

df = pd.read_csv('X:\musk_clean.csv')
X=df.iloc[:,0:-1]
y=df.iloc[:,-1]
clf=RandomForestClassifier(1)
clf.fit(X,y)

print('naive')
print(clf.score(X,y))
print(clf.estimators_[0].score(X,y))

print('check preds')
print(clf.predict(X))
print(clf.estimators_[0].predict(X))

输出:

naive
0.978629887845
0.144437708396
check preds
[ 1.  1.  1. ..., -1. -1. -1.]
[ 1.  1.  1. ...,  0.  0.  0.]

好的:使用内部树,您确实丢失了有关二进制类表示的信息:1 / -1或1/0 。因此,sklearn可能会在内部对其进行规范化处理,正如设计中提到的那样,它并不是内部分类器的流水线。

这可以在这里看到:

print(clf.classes_)
print(clf.estimators_[0].classes_)

输出:

[-1.  1.]
[ 0.  1.]

另一个小型演示,我们只需手动更正:

from sklearn.metrics import accuracy_score
forest_preds = clf.predict(X)
print(accuracy_score(y, forest_preds))
tree_preds = clf.estimators_[0].predict(X)
tree_preds[tree_preds == 0] = -1
print(accuracy_score(y, tree_preds))

输出:

0.977114277054
0.977114277054

编辑:令我惊讶的是,classes_不是只读的。所以以下可能是更有趣的演示:

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

df = pd.read_csv('X:\musk_clean.csv')
X=df.iloc[:,0:-1]
y=df.iloc[:,-1]
clf=RandomForestClassifier(1)
clf.fit(X,y)

tree_clf = clf.estimators_[0]
tree_clf.classes_ = clf.classes_

print(clf.score(X,y))
print(clf.estimators_[0].score(X,y))

输出:

0.985298575326
0.985298575326