如何在sklearn中计算交叉验证的每个模型中的特征重要性

Posted

技术标签:

【中文标题】如何在sklearn中计算交叉验证的每个模型中的特征重要性【英文标题】:How to calculate feature importance in each models of cross validation in sklearn 【发布时间】:2019-08-23 06:23:41 【问题描述】:

我正在使用RandomForestClassifier()10 fold cross validation,如下所示。

clf=RandomForestClassifier(random_state = 42, class_weight="balanced")
k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
accuracy = cross_val_score(clf, X, y, cv=k_fold, scoring = 'accuracy')
print(accuracy.mean())

我想确定我的特征空间中的重要特征。获得单一分类的特征重要性似乎很简单,如下所示。

print("Features sorted by their score:")
feature_importances = pd.DataFrame(clf.feature_importances_,
                                   index = X_train.columns,
                                    columns=['importance']).sort_values('importance', ascending=False)
print(feature_importances)

但是,我在 sklearn 中找不到如何为 cross validation 执行 feature importance

总之,我想在 10 次交叉验证中找出最有效的特征(例如,通过使用 average importance score)。

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

您会获得单个拟合分类器的特征重要性。如果您进行交叉验证,您将获得多个分类器(在您的情况下为 10 个)。您是在寻找每个单独分类器或所有分类器的特征重要性吗? @kazemakase 非常感谢您的评论。我把它们放在一起看特征的重要性:) 在这种情况下,您实际上不需要交叉验证。您可以在整个数据集上拟合一个分类器并从中获取特征重要性。 【参考方案1】:

cross_val_score() 不返回每个训练测试折叠组合的估计量。

您需要使用cross_validate() 并设置return_estimator =True

这是一个工作示例:

from sklearn import datasets
from sklearn.model_selection import cross_validate
from sklearn.svm import LinearSVC
from sklearn.ensemble import  RandomForestClassifier
import pandas as pd

diabetes = datasets.load_diabetes()
X, y = diabetes.data, diabetes.target

clf=RandomForestClassifier(n_estimators =10, random_state = 42, class_weight="balanced")
output = cross_validate(clf, X, y, cv=2, scoring = 'accuracy', return_estimator =True)
for idx,estimator in enumerate(output['estimator']):
    print("Features sorted by their score for estimator :".format(idx))
    feature_importances = pd.DataFrame(estimator.feature_importances_,
                                       index = diabetes.feature_names,
                                        columns=['importance']).sort_values('importance', ascending=False)
    print(feature_importances)

输出:

Features sorted by their score for estimator 0:
     importance
s6     0.137735
age    0.130152
s5     0.114561
s2     0.113683
s3     0.112952
bmi    0.111057
bp     0.108682
s1     0.090763
s4     0.056805
sex    0.023609
Features sorted by their score for estimator 1:
     importance
age    0.129671
bmi    0.125706
s2     0.125304
s1     0.113903
bp     0.111979
s6     0.110505
s5     0.106099
s3     0.098392
s4     0.054542
sex    0.023900

【讨论】:

非常感谢您的出色回答。但是,我仍然不清楚cross_val_score()``and cross_validate(). Can we use cross_validate()` 获得准确度、精确度、召回率和 f-measure 之间的差异是什么? :) 是的,您也可以使用cross_validate() 根据您为评分设置的值获取这些值。实际上cross_val_score 在内部调用cross_validate。因此,如果您想要更多功能,请选择cross_validate @ai_learning 这真的很有帮助,谢谢。我正在尝试使用管道,因为在每个折叠中还想要进行特征选择和规范化。但是,然后我收到错误消息AttributeError: 'Pipeline' object has no attribute 'feature_importances_'。你知道我该如何解决这个问题吗? 看起来是个有趣的问题,能否添加更多详细信息并将其作为单独的问题提出? @ai_learning 太好了,谢谢,已在此处发布:***.com/questions/56562208/…。 (抱歉回复慢,错过了您的评论通知)。

以上是关于如何在sklearn中计算交叉验证的每个模型中的特征重要性的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中模型评估和预测

使用 sklearn 进行交叉验证的高级特征提取

sklearn:文本分类交叉验证中的向量化

机器学习- Sklearn (交叉验证和Pipeline)

sklearn 交叉验证中的自定义评分功能

使用sklearn进行交叉验证