使用随机森林进行AUC基础特征重要性评估

6

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

随机森林中默认的特征重要性技术是基于分类准确性(错误率),这已被证明是对于不平衡的类别是一个糟糕的度量方法(请参见herehere)。

用RF进行特征选择的两个标准VIM是Gini VIM和置换VIM。粗略地说,感兴趣的预测器的Gini VIM是在森林中由此预测器生成的Gini杂质降低的总和,每当选择它进行分裂时,按树的数量进行缩放。

我的问题是:scikit-learn中是否实现了这种方法(就像R包party中一样)?或者有其他解决方法吗?

PS:这个问题有点与另一个相关。

2个回答

4

经过一些研究,这就是我得出的结论:

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
欢迎提出所有建议/评论!

感谢分享最后一个链接。 - Simone
需要导入roc_auc_score: from sklearn.metrics import roc_auc_score - lstodd
这是标准的排列重要性 - 可以作为函数在 eli5 包中使用。 - Love-R

4

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

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


我编辑了我的初始问题,因为当时我自己也很困惑。希望现在更清晰了! - gowithefloww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接