對您的問題使用內部子預測因子時要小心。由於這不是設計的案例,你應該害怕丟失信息。
通過一些分析,你應該已經發現,這個問題來自哪裏。
一個演示:
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