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

Permutation importance using a Pipeline in SciKit-Learn

我使用的是 SciKit 中的确切示例,它将 permutation_importancetree feature_importances

进行了比较

如您所见,使用了管道:

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

permutation_importance:

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

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

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

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

tree feature_importance: 在同一个例子中,当他们使用 feature_importance 时,结果被转换为:

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

我显然可以转换我的特征然后使用permutation_importance,但是示例中呈现的步骤似乎是故意的,并且permutation_importance不转换特征应该是有原因的.

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

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

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