2017-09-26 44 views
-1

我有這樣的代碼:與RandomForestClassifier奇怪的行爲estimators_

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可以發現here。 雖然隨機森林只包含一棵決策樹,其準確率爲0.97,但是當我從估計者中檢查樹的準確性時,我的準確率爲0.14。 似乎有什麼不對勁,因爲它應該是相同的決策樹..

任何人都可以幫助我理解爲什麼會發生這種情況?我如何使用來自估計器的樹來獲得相同的精度?

回答

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