我使用了来自SciKit的精确示例,该示例将permutation_importance
与tree feature_importances
进行了比较
如你所见,使用了Pipeline:
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
不转换特征应该是有原因的。
回答:
这是预期的行为。排列重要性的工作方式是打乱输入数据并将其应用于Pipeline(或者如果您想要的话,应用于模型)。事实上,如果您想了解初始输入数据如何影响模型,那么您应该将其应用于Pipeline。
如果您对由预处理步骤生成的每个额外特征的重要性感兴趣,那么您应该生成带有列名的预处理数据集,然后直接将该数据应用于模型(使用排列重要性)而不是Pipeline。
在大多数情况下,人们并不关心学习Pipeline生成的次要特征的影响。这就是为什么他们在这里使用Pipeline来包含预处理和建模步骤的原因。