如何获得 MLPClassifier 的功能重要性?

数据挖掘 神经网络 scikit-学习 分类器 毫升
2021-10-12 01:42:44

我使用来自 scikit learn 的 MLPClassifier。我有大约 20 个功能。是否有 scikit 方法来获取特征重要性?我发现

clf.feature_importances_

但似乎它只存在于决策树。

2个回答

简短的回答是,在 scikit-learn 中没有一种方法可以获取 MLP 特征重要性——你遇到了解释模型权重如何对分类决策做出贡献的经典问题。

然而,有几个很棒的 Python 库旨在解决这个问题——LIME、ELI5 和 Yellowbrick:

LIME (或 Local Interpretable Model-agnostic Explanations,此处为博客文章,此处为 arxiv 论文),它“通过在预测周围学习本地可解释模型,以可解释和忠实的方式解释任何分类器的预测”,或基本上解释模型输出通过使用可以解释的模型来近似分类器的结果。它在pypi上,他们的 github 页面上有示例——上手非常简单。

ELI5(或 Explain Like I'm 5)是一个“允许使用统一 API 可视化和调试各种机器学习模型的 Python 库”。尽管在 MLP 上使用 ELI5 时并非所有scikit-learn集成都存在,但Permutation Importance是一种“...提供了一种方法来计算任何黑盒估计器的特征重要性,方法是测量在特征不可用时分数如何降低",这使您免于尝试自己实现它。

Yellowbrick是“一套称为“可视化工具”的可视化诊断工具,它扩展了 Scikit-Learn API 以允许人工控制模型选择过程”,它旨在让 scikit-learn 用户感到熟悉。与此处的其他两个库相比,它在诊断功能重要性方面提供的方法不多,但对于更一般的用例,它仍然值得一提。

多层感知器没有内在特征重要性,例如决策树和随机森林。神经网络在训练阶段依赖于复杂的权重协同适应,而不是测量和比较分割的质量。

在 Scikit 中获取特征重要性的更简单方法可以使用 Perceptron 轻松实现,Perceptron是一个仅一层的神经网络。

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import Perceptron
X, y = load_breast_cancer(return_X_y=True)
clf = Perceptron(tol=1e-3, random_state=0)
clf.fit(X, y)

coeffs = clf.coef_

系数将返回用于二元分类的数组或用于多类分类的矩阵 [n_classes, n_features]。