【问题标题】:Strange behavior with RandomForestClassifier estimators_RandomForestClassifier 估计器的奇怪行为_
【发布时间】:2018-03-07 13:53:11
【问题描述】:

我有这个代码:

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))

可以在 here 找到 csv。 尽管随机森林仅包含一棵决策树,其准确度为 0.97,但当我检查取自 estimators_ 的树的准确度时,我得到的准确度为 0.14。 好像出了点问题,因为它应该是同一个决策树..

谁能帮我理解为什么会这样?如何使用 estimators_ 中的树获得相同的准确度?

【问题讨论】:

    标签: python tree scikit-learn random-forest


    【解决方案1】:

    对您的问题使用内部子预测器时要小心。由于这不是设计的情况,您应该害怕丢失信息。

    稍加分析,你应该已经找到了这个问题的根源。

    演示:

    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
    

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多