python - 在 SciKit-Learn 中使用管道排列重要性

标签 python machine-learning scikit-learn pipeline

我正在使用来自 SciKit 的确切示例,它将 permutation_importancetree feature_importances

进行比较

如你所见,使用了一个管道:

rf = Pipeline([
    ('preprocess', preprocessing),
    ('classifier', RandomForestClassifier(random_state=42))
])
rf.fit(X_train, y_train)

permutation_importance:

现在,当您拟合一个管道时,它将一个接一个地拟合所有变换并变换数据,然后使用最终估计器拟合变换后的数据。

在示例的后面,他们在拟合模型上使用了 permutation_importance:

result = permutation_importance(rf, X_test, y_test, n_repeats=10,
                                random_state=42, n_jobs=2)

问题:我不明白的是,result 中的特征仍然是原始的未转换特征。为什么会这样?这工作正常吗?那么 Pipeline 的目的是什么?

enter image description here

树 feature_importance: 在同一示例中,当他们使用 feature_importance 时,结果会发生转换:

tree_feature_importances = (
    rf.named_steps['classifier'].feature_importances_)

enter image description here

我显然可以转换我的特征,然后使用 permutation_importance,但示例中的步骤似乎是有意为之的,permutation_importance 这样做应该是有原因的不改变特征。

最佳答案

这是预期的行为。排列重要性的工作方式是打乱输入数据并将其应用于管道(或者模型,如果这是你想要的)。事实上,如果您想了解初始输入数据如何影响模型,那么您应该将其应用于管道。

如果您对预处理步骤生成的每个附加特征的特征重要性感兴趣,那么您应该生成具有列名的预处理数据集,然后将该数据直接应用于模型(使用排列重要性)管道。

在大多数情况下,人们对了解管道生成的次要特征的影响不感兴趣。这就是为什么他们在这里使用管道来包含预处理和建模步骤。

关于python - 在 SciKit-Learn 中使用管道排列重要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62106204/

相关文章:

python - Scikit-learn:如何计算真负

python - scikit-learn, linearsvc - 如何从经过训练的 SVM 中获取支持向量?

python - 无需 OAuth 且只需 API key 即可获取 Youtube Analytics

python - 找到两个地理数据点之间的交集

python - 没有这样的包 'slim' : BUILD file not found - Tensorflow

python - 分类中的目标变量是否需要数值编码?

Python:将带有参数的函数传递给函数

python - 如何避免在 Python 代码中存储密码

python - Sqlalchemy - 向查询添加列

python - 为什么我在 Keras 中得到负的 false_negative 计数(例如 -10)?