如何使用 scikit-multilearn 库从 RandomForest 获取特征重要性?

数据挖掘 scikit-学习 多标签分类
2021-10-12 03:02:08

我正在研究多标签分类问题,二进制情况。作为目标变量,有五列具有 0-1 值。

对于模型训练,我使用scikit-multilearn library下面是我使用 Binary Relevance 和 RandomForest 训练模型的代码。

parameters = [
{
    'classifier': [RandomForestClassifier(random_state=42)],

    'classifier__n_estimators': [50, 100, 200],
    'classifier__max_features': ['auto', 'sqrt', 'log2'],
    'classifier__max_depth' : [4, 6, 8, 10, 12],
    'classifier__criterion' :['gini', 'entropy']}]

clf = RandomizedSearchCV(BinaryRelevance(), parameters, scoring='f1_weighted', cv=5, \
n_jobs=-1, verbose=10, random_state=10)
clf.fit(X_train, y_train)

如何从模型中提取特征重要性?我是否应该从该模型中获取最佳参数,然后使用 sklearn 中的 RandomForest 分别应用于每个标签的数据?

1个回答

首先,要直接回答您的问题,使用 scikit learn 获得特征重要性的最简单方法是,model保存分类器的变量在哪里。

print(model.feature_importances_)

但是,这种方法只存在于一些Ensemble 模型上,即:

  • AdaBoost分类器
  • AdaBoost 回归器
  • ExtraTreesClassifier
  • ExtraTreesRegressor
  • 梯度提升分类器
  • GradientBoostingRegressor
  • 随机森林分类器
  • 随机森林回归器
  • 随机树嵌入

如果你想知道为什么,有一本关于可解释机器学习的很棒的免费在线书籍。这是一段摘录:

实现可解释性的最简单方法是仅使用创建可解释模型的算法子集。线性回归、逻辑回归和决策树是常用的可解释模型。

选择正确的模型后,请注意使用特征重要性! 看这里,它对随机数据的排名非常高。这篇文章建议使用置换重要性以及 Drop-Column Importance。

他们为此创建了一个名为rfpimp的库,但这里有一个来自 scikit 自己的教程,介绍如何仅使用 scikit-learn 来完成这两个任务。我从下面的教程中粘贴了排列重要性示例:

from sklearn.inspection import permutation_importance

result = permutation_importance(rf, X_test, y_test, n_repeats=10,
                                random_state=42, n_jobs=2)
sorted_idx = result.importances_mean.argsort()

fig, ax = plt.subplots()
ax.boxplot(result.importances[sorted_idx].T,
           vert=False, labels=X_test.columns[sorted_idx])
ax.set_title("Permutation Importances (test set)")
fig.tight_layout()
plt.show()