使用随机森林的基于 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
(每个拆分节点的内部损失函数的种类)指定为 gini
或 information 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_depth
,max_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置换特征重要性算法实现模型特征可解释性排序