【问题标题】:How Feature Importance is calculated in sklearn's RandomForest?sklearn 的 RandomForest 中如何计算特征重要性?
【发布时间】:2021-08-22 13:48:00
【问题描述】:

来自TutorialFeature Importance
我尝试制作自己的随机森林树

data = load_breast_cancer()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target


X = df.loc[:, df.columns != 'target']
y = df.loc[:, 'target'].values


X_train, X_test, Y_train, Y_test = train_test_split(X, y, random_state=0)


rf = RandomForestClassifier(n_estimators=1,
                            max_depth=2,
                            max_features=2,
                            random_state=0)
rf.fit(X_train, Y_train)
rf.feature_importances_
array([0.        , 0.11197953, 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.88802047, 0.        , 0.        , 0.        ])
fn=data.feature_names
cn=data.target_names
fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (4,4), dpi=800)
tree.plot_tree(rf.estimators_[0],
               feature_names = fn, 
               class_names=cn,
               filled = True);
fig.savefig('rf_individualtree.png')

Feature Importance 上方手动计算Feature Importance(sklearn 0.11197953、0.88802047 的结果)

a = (192/265)*(0.262-(68/192)*0.452-(124/192)*0.103) 
b = (265/265)*(0.459-(192/265)*0.262-(73/265)*0.185)+(73/265)*(0.185-(72/73)*0.173)

print(b/(a+b))
print(a/(a+b))
0.8625754868011606
0.13742451319883947

我做错了哪一部分我的结果与 sklearn 答案不同或 sklearn 只是不遵循公式?

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    你有几个问题:

    1. 舍入错误
    2. 数学,专门计算到达节点的概率

    只要你纠正它们,你就会得到 sklearn 的结果:

    print(rf.estimators_[0].tree_.impurity)
    

    array([0.45899182, 0.26172737, 0.10250188, 0.45244126, 0.18549346,
           0.17300567, 0.        ])
    

    n1 = 0.45899182261015226 - (310/426)*0.26172736732570234 - (116/426)*0.1854934601664685
    n2 = (116/426)*0.1854934601664685 - (115/426)*0.17300567107750475
    n3 = (310/426)*0.26172736732570234 - (203/426)*0.10250188065713806 - (107/426)*0.45244126124552364
    f1 = n1+n2
    f2 = n3
    print(f1/(f1+f2), f2/(f1+f2))
    

    (0.888020474590027, 0.11197952540997297)
    

    (您可以通过阅读源代码了解更多关于如何计算重要性here 由包开发人员或here 的源代码)

    还要注意,RandomForest 认为重要的东西对于另一个模型可能并不那么重要(反之亦然),即这里的“重要性”是特定于模型的,并且可能不是人们直观地理解或期望的,他们更习惯于线性可解释性。

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 2021-07-22
      • 2021-09-02
      • 1970-01-01
      • 2021-09-07
      • 2019-08-23
      • 2021-02-04
      • 2016-12-11
      • 2019-11-05
      相关资源
      最近更新 更多