基于AUC的功能使用随机森林的重要性

时间:2015-07-08 09:45:31

标签: python machine-learning scikit-learn scoring

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

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

  

使用RF进行特征选择的两个标准VIM是Gini VIM和置换VIM。粗略地说,一个感兴趣的预测器的基尼VIM是森林中由该预测器产生的基尼杂质减少的总和,无论何时选择用于分裂,通过树的数量来缩放。

我的问题是:在scikit-learn中实现的那种方法(就像它在R包中party)?或者可能是一种解决方法?

PS:这个问题与an other有关。

2 个答案:

答案 0 :(得分:4)

scoring只是测试示例中使用的性能评估工具,它不会在每个拆分节点进入内部DecisionTreeClassifier算法。对于树算法,您只能将criterion(每个拆分节点的内部损失函数类型)指定为giniinformation entropy

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

答案 1 :(得分:3)

在做了一些研究之后,我就出现了这个:

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')运行gridsearch,然后将这个VIM(变量重要性测量)应用到最佳模型。

我从这个(伟大的)notebook中获取灵感。

欢迎所有建议/意见!