我可以显示 MultiOutputClassifier 的特征重要性吗?
Can I show feature importance for MultiOutputClassifier?
我正在尝试使用 RandomForest 恢复多输出分类器的特征重要性。
MultiOutput 模型没有显示任何问题:
import numpy as np
import pandas as pd
import sklearn
from sklearn.datasets import make_multilabel_classification
from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier
## Generate data
x, y = make_multilabel_classification(n_samples=1000,
n_features=15,
n_labels = 5,
n_classes=3,
random_state=12,
allow_unlabeled = True)
x_train = x[:700,:]
x_test = x[701:,:]
y_train = y[:700,:]
y_test = y[701:,:]
## Generate model
forest = RandomForestClassifier(n_estimators = 100, random_state = 1)
multi_forest = MultiOutputClassifier(forest, n_jobs = -1).fit(x_train, y_train)
## Make prediction
dfOutput_multi_forest = multi_forest.predict_proba(x_test)
预测 dfOutput_multi_forest
没有显示任何问题,但我想恢复 multi_forest 的特征重要性以解释输出。
使用 multi_forest.feature_importance_
会抛出以下错误信息:
AttributeError: 'MultiOutputClassifier' object has no attribute 'feature_importance_'
有谁知道如何检索特征重要性?
我正在使用 scikit v0.20.2
事实上,Sklearn 的 MultiOutputClassifier 似乎没有包含模型中使用的所有估计器(在您的情况下,所有 RandomForest 分类器)的特征重要性的某种合并的属性.
但是,可以访问每个 RandomForest 分类器的特征重要性,然后对它们进行平均,得到每个特征在所有 RandomForest 分类器中的平均重要性。
MultiOutputClassifier 对象有一个名为 estimators_
的属性。如果您 运行 multi_forest.estimators_
,您将获得一个列表,其中包含每个 RandomForest 分类器的对象。
对于这些 RandomForest 分类器对象中的每一个,您可以通过 feature_importances_
属性访问其特征重要性。
总而言之,这是我的方法:
feat_impts = []
for clf in multi_forest.estimators_:
feat_impts.append(clf.feature_importances_)
np.mean(feat_impts, axis=0)
我 运行 您粘贴到问题中的示例代码,然后 运行 上面的代码块输出以下 15 个平均值的列表:
array([0.09830467, 0.0912088 , 0.05738045, 0.1211305 , 0.03901933,
0.05429491, 0.06929378, 0.06404416, 0.05676634, 0.04919717,
0.05244265, 0.0509295 , 0.05615341, 0.09202444, 0.04780991])
其中包含您的 15 个特征中每个特征的平均重要性,跨越 MultiOutputClassifier 中使用的 3 个 运行dom 森林分类器中的每一个。
这至少可以帮助您了解哪些特征总体上对您的 3 个 类.
中的每一个进行预测更重要。
我正在尝试使用 RandomForest 恢复多输出分类器的特征重要性。
MultiOutput 模型没有显示任何问题:
import numpy as np
import pandas as pd
import sklearn
from sklearn.datasets import make_multilabel_classification
from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier
## Generate data
x, y = make_multilabel_classification(n_samples=1000,
n_features=15,
n_labels = 5,
n_classes=3,
random_state=12,
allow_unlabeled = True)
x_train = x[:700,:]
x_test = x[701:,:]
y_train = y[:700,:]
y_test = y[701:,:]
## Generate model
forest = RandomForestClassifier(n_estimators = 100, random_state = 1)
multi_forest = MultiOutputClassifier(forest, n_jobs = -1).fit(x_train, y_train)
## Make prediction
dfOutput_multi_forest = multi_forest.predict_proba(x_test)
预测 dfOutput_multi_forest
没有显示任何问题,但我想恢复 multi_forest 的特征重要性以解释输出。
使用 multi_forest.feature_importance_
会抛出以下错误信息:
AttributeError: 'MultiOutputClassifier' object has no attribute 'feature_importance_'
有谁知道如何检索特征重要性? 我正在使用 scikit v0.20.2
事实上,Sklearn 的 MultiOutputClassifier 似乎没有包含模型中使用的所有估计器(在您的情况下,所有 RandomForest 分类器)的特征重要性的某种合并的属性.
但是,可以访问每个 RandomForest 分类器的特征重要性,然后对它们进行平均,得到每个特征在所有 RandomForest 分类器中的平均重要性。
MultiOutputClassifier 对象有一个名为 estimators_
的属性。如果您 运行 multi_forest.estimators_
,您将获得一个列表,其中包含每个 RandomForest 分类器的对象。
对于这些 RandomForest 分类器对象中的每一个,您可以通过 feature_importances_
属性访问其特征重要性。
总而言之,这是我的方法:
feat_impts = []
for clf in multi_forest.estimators_:
feat_impts.append(clf.feature_importances_)
np.mean(feat_impts, axis=0)
我 运行 您粘贴到问题中的示例代码,然后 运行 上面的代码块输出以下 15 个平均值的列表:
array([0.09830467, 0.0912088 , 0.05738045, 0.1211305 , 0.03901933,
0.05429491, 0.06929378, 0.06404416, 0.05676634, 0.04919717,
0.05244265, 0.0509295 , 0.05615341, 0.09202444, 0.04780991])
其中包含您的 15 个特征中每个特征的平均重要性,跨越 MultiOutputClassifier 中使用的 3 个 运行dom 森林分类器中的每一个。
这至少可以帮助您了解哪些特征总体上对您的 3 个 类.
中的每一个进行预测更重要。