如何获得多标签分类问题的特征重要性?

How to get feature importances of a multi-label classification problem?

我正在学习如何使用 Scikit-Learn,我正在尝试获取多标签分类问题的特征重要性。 我按以下方式定义和训练模型:

classifier = OneVsRestClassifier(
    make_pipeline(RandomForestClassifier(random_state=42))
)
classifier.classes_ = classes
y_train_pred = cross_val_predict(classifier, X_train_prepared, y_train, cv=3)

在我尝试获取特征重要性之前,代码似乎工作正常。这是我试过的:

classifier.feature_importances_

但我收到以下错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-98-a9c91f6f2504> in <module>
----> 1 classifier.feature_importances_

AttributeError: 'OneVsRestClassifier' object has no attribute 'feature_importances_'

我也尝试了 中提出的解决方案,但我认为它已经过时了。 您能否提出一个更新的智能和优雅的解决方案来显示多标签分类问题的特征重要性?

我会说引用的 post 中的解决方案并没有过时;相反,您需要处理的设置略有不同。

您传递给 OneVsRestClassifierestimatorPipeline;在引用的 post 中,它直接是 RandomForestClassifier

因此,您必须访问管道的其中一个步骤才能到达 RandomForestClassifier 实例,您最终可以在该实例上访问 feature_importances_ 属性。这是一种处理方式:

classifier.estimators_[0].named_steps['randomforestclassifier'].feature_importances_

最后,请注意您必须 适合 您的 OneVsRestClassifier 实例才能访问其 estimators_ 属性。事实上,尽管 cross_val_predict 已经负责拟合估算器,正如您可能看到的 herecross_val_predict 并不像 .fit() 方法那样 return 估算器实例。因此,在 cross_val_predict 之外,classifier 适合的事实是未知的,这就是您无法访问 estimators_ 属性的原因。

这是一个玩具示例:

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.multiclass import OneVsRestClassifier
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_val_predict

iris = datasets.load_iris()
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=0)

classifier = OneVsRestClassifier(
    make_pipeline(RandomForestClassifier(random_state=42))
)

classifier.fit(X_train, y_train)
y_train_pred = cross_val_predict(classifier, X_train, y_train, cv=3) 
classifier.estimators_[0].named_steps['randomforestclassifier'].feature_importances_