如何获得多标签分类问题的特征重要性?
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 中的解决方案并没有过时;相反,您需要处理的设置略有不同。
您传递给 OneVsRestClassifier
的 estimator
是 Pipeline
;在引用的 post 中,它直接是 RandomForestClassifier
。
因此,您必须访问管道的其中一个步骤才能到达 RandomForestClassifier
实例,您最终可以在该实例上访问 feature_importances_
属性。这是一种处理方式:
classifier.estimators_[0].named_steps['randomforestclassifier'].feature_importances_
最后,请注意您必须 适合 您的 OneVsRestClassifier
实例才能访问其 estimators_
属性。事实上,尽管 cross_val_predict
已经负责拟合估算器,正如您可能看到的 here,cross_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_
我正在学习如何使用 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 中的解决方案并没有过时;相反,您需要处理的设置略有不同。
您传递给 OneVsRestClassifier
的 estimator
是 Pipeline
;在引用的 post 中,它直接是 RandomForestClassifier
。
因此,您必须访问管道的其中一个步骤才能到达 RandomForestClassifier
实例,您最终可以在该实例上访问 feature_importances_
属性。这是一种处理方式:
classifier.estimators_[0].named_steps['randomforestclassifier'].feature_importances_
最后,请注意您必须 适合 您的 OneVsRestClassifier
实例才能访问其 estimators_
属性。事实上,尽管 cross_val_predict
已经负责拟合估算器,正如您可能看到的 here,cross_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_