【问题标题】:AUC-base Features Importance using Random Forest使用随机森林的基于 AUC 的特征重要性
【发布时间】:2015-09-26 03:32:44
【问题描述】:

我正在尝试使用随机森林和逻辑回归来预测二元变量。我有严重不平衡的类(大约 Y=1 的 1.5%)。

随机森林中的默认特征重要性技术基于分类准确度(错误率)——这已被证明是不平衡类的不好衡量标准(参见herehere)。

使用 RF 进行特征选择的两个标准 VIM 是 Gini VIM 和置换 VIM。粗略地说,感兴趣的预测器的 Gini VIM 是该预测器在被选择进行分裂时产生的 Gini 杂质减少的森林总和,并按树的数量缩放。

我的问题是:这种方法是在 scikit-learn 中实现的吗(就像在 R 包 party 中一样)?或者也许是一种解决方法?

PS : 这个问题有点像an other

【问题讨论】:

    标签: python machine-learning scikit-learn scoring


    【解决方案1】:

    scoring只是一个用于测试样本的性能评估工具,并没有在每个分裂节点进入内部DecisionTreeClassifier算法。对于树算法,您只能将 criterion(每个拆分节点的内部损失函数的种类)指定为 giniinformation entropy

    scoring 可用于交叉验证上下文,目标是调整一些超参数(如max_depth)。在您的情况下,您可以使用GridSearchCV 使用评分函数roc_auc 调整您的一些超参数。

    【讨论】:

    • 我编辑了我最初困惑的问题(因为我是我自己)。希望现在更清楚了!。
    【解决方案2】:

    在做了一些研究之后,这是我得出的结论:

    from sklearn.cross_validation import ShuffleSplit
    from collections import defaultdict
    
    names = db_train.iloc[:,1:].columns.tolist()
    
    # -- Gridsearched parameters
    model_rf = RandomForestClassifier(n_estimators=500,
                                     class_weight="auto",
                                     criterion='gini',
                                     bootstrap=True,
                                     max_features=10,
                                     min_samples_split=1,
                                     min_samples_leaf=6,
                                     max_depth=3,
                                     n_jobs=-1)
    scores = defaultdict(list)
    
    # -- Fit the model (could be cross-validated)
    rf = model_rf.fit(X_train, Y_train)
    acc = roc_auc_score(Y_test, rf.predict(X_test))
    
    for i in range(X_train.shape[1]):
        X_t = X_test.copy()
        np.random.shuffle(X_t[:, i])
        shuff_acc = roc_auc_score(Y_test, rf.predict(X_t))
        scores[names[i]].append((acc-shuff_acc)/acc)
    
    print("Features sorted by their score:")
    print(sorted([(round(np.mean(score), 4), feat) for
                  feat, score in scores.items()], reverse=True))
    
    Features sorted by their score:
    [(0.0028999999999999998, 'Var1'), (0.0027000000000000001, 'Var2'), (0.0023999999999999998, 'Var3'), (0.0022000000000000001, 'Var4'), (0.0022000000000000001, 'Var5'), (0.0022000000000000001, 'Var6'), (0.002, 'Var7'), (0.002, 'Var8'), ...]
    

    输出不是很性感,但你明白了。这种方法的缺点是特征重要性似乎非常依赖参数。我使用不同的参数(max_depthmax_features..)运行它,我得到了很多不同的结果。所以我决定对参数 (scoring = 'roc_auc') 运行网格搜索,然后将此 VIM(变量重要性度量)应用于最佳模型。

    我的灵感来自这个(很棒的)notebook

    欢迎所有建议/cmets!

    【讨论】:

    • 感谢分享最后一个链接。
    • 需要导入roc_auc_score:from sklearn.metrics import roc_auc_score
    猜你喜欢
    • 2016-02-25
    • 2021-05-09
    • 2021-08-29
    • 1970-01-01
    • 2017-10-21
    • 2015-05-12
    • 2020-05-26
    • 2019-01-28
    • 2016-04-09
    相关资源
    最近更新 更多