使用随机森林的基于 AUC 的特征重要性

Posted

技术标签:

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

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

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

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

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

PS : 这个问题有点像an other。

【问题讨论】:

【参考方案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

以上是关于使用随机森林的基于 AUC 的特征重要性的主要内容,如果未能解决你的问题,请参考以下文章

R语言随机森林模型:计算随机森林模型的特征重要度(feature importance)并可视化特征重要度使用少数重要特征拟合随机森林模型(比较所有特征模型和重要特征模型在测试集上的表现差异)

随机森林如何评估特征重要性

利用随机森林对特征重要性进行评估

R语言基于h2o包构建二分类模型:使用h2o.randomForest构建随机森林模型使用h2o.auc计算模型的AUC值

ML之PFI(eli5):基于mpg汽车油耗数据集利用RF随机森林算法和PFI置换特征重要性算法实现模型特征可解释性排序

随机森林进行特征重要性度量的详细说明