使用随机森林的auc基础特征的重要性



我试图用随机森林和逻辑回归来预测一个二元变量。我有严重不平衡的职业(大约1.5%的Y=1)。

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

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

我的问题是:这种方法在scikit-learn中实现(就像它在R包party中一样)吗?或者是一个变通方法?

PS:这个问题和另一个问题有点关联

scoring只是测试样本中使用的一个性能评价工具,在每个分割节点处不进入内部的DecisionTreeClassifier算法。对于树算法,您只能指定criterion(每个分裂节点的内部损失函数)为giniinformation entropy

scoring可以在交叉验证上下文中使用,其目标是调优一些超参数(如max_depth)。在您的示例中,您可以使用评分函数roc_auc来使用GridSearchCV来调优您的一些超参数。

在做了一些研究之后,我得出了以下结论:

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(可变重要性度量)应用于最佳模型。

我的灵感来自这本(伟大的)笔记本。

最新更新