在 SciKit-Learn 中使用管道排列重要性
Permutation importance using a Pipeline in SciKit-Learn
我使用的是 SciKit 中的确切示例,它将 permutation_importance
与 tree 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
不转换特征应该是有原因的.
这是预期的行为。排列重要性的工作方式是打乱输入数据并将其应用于管道(或者模型,如果这是你想要的)。事实上,如果您想了解初始输入数据如何影响模型,那么您应该将其应用于管道。
如果您对预处理步骤生成的每个附加特征的特征重要性感兴趣,那么您应该生成具有列名的预处理数据集,然后将该数据应用于模型(使用排列重要性)直接代替管道。
在大多数情况下,人们对了解管道生成的次要特征的影响不感兴趣。这就是为什么他们在这里使用管道来包含预处理和建模步骤。
我使用的是 SciKit 中的确切示例,它将 permutation_importance
与 tree 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
不转换特征应该是有原因的.
这是预期的行为。排列重要性的工作方式是打乱输入数据并将其应用于管道(或者模型,如果这是你想要的)。事实上,如果您想了解初始输入数据如何影响模型,那么您应该将其应用于管道。
如果您对预处理步骤生成的每个附加特征的特征重要性感兴趣,那么您应该生成具有列名的预处理数据集,然后将该数据应用于模型(使用排列重要性)直接代替管道。
在大多数情况下,人们对了解管道生成的次要特征的影响不感兴趣。这就是为什么他们在这里使用管道来包含预处理和建模步骤。