奇怪的行为带有RandomForestClassifier估算器_



我有此代码:

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
df = pd.read_csv('musk_clean.csv')
X=df.iloc[:,0:-1]
y=df.iloc[:,-1]
clf=RandomForestClassifier(1)
clf.fit(X,y)
print(clf.score(X,y))
print(clf.estimators_[0].score(X,y))

可以在这里找到CSV。尽管随机森林仅由一个决策树组成,其准确性为0.97,但是当我检查从估算值_取的树的准确性时,我的准确性为0.14。似乎有问题,因为它应该是同一决策树。

谁能帮助我理解为什么会发生这种情况?如何使用估算器的树_?

获得相同的精度

在使用内部子申请人问题时要小心。由于这不是设计的情况,因此您应该害怕丢失信息。

有了一些分析,您应该找到,这个问题来自哪里。

演示:

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

相关内容

  • 没有找到相关文章

最新更新