Python 使用SciKit中的管道排列重要性
我使用的正是来自的示例,它将Python 使用SciKit中的管道排列重要性,python,machine-learning,scikit-learn,feature-selection,Python,Machine Learning,Scikit Learn,Feature Selection,我使用的正是来自的示例,它将排列重要性与树特征重要性 如您所见,使用了管道: rf = Pipeline([ ('preprocess', preprocessing), ('classifier', RandomForestClassifier(random_state=42)) ]) rf.fit(X_train, y_train) 排列重要性: 现在,当您拟合管道时,它将依次拟合所有变换并变换数据,然后使用最终估计器拟合变换后的数据 在本例的后面部分,他们在拟合模型上使用
排列重要性
与树特征重要性
如您所见,使用了管道:
rf = Pipeline([
('preprocess', preprocessing),
('classifier', RandomForestClassifier(random_state=42))
])
rf.fit(X_train, y_train)
排列重要性
:
现在,当您拟合管道时,它将依次拟合所有变换并变换数据,然后使用最终估计器拟合变换后的数据
在本例的后面部分,他们在拟合模型上使用了排列重要性
:
result = permutation_importance(rf, X_test, y_test, n_repeats=10,
random_state=42, n_jobs=2)
问题:我不明白的是,结果中的特征仍然是原始的未转换特征。为什么会这样?这工作正常吗?那么,管道的目的是什么
树特征的重要性
:
在同一示例中,当他们使用功能\u重要性
时,结果将被转换:
tree_feature_importances = (
rf.named_steps['classifier'].feature_importances_)
显然,我可以转换我的功能,然后使用permutation\u importance
,但示例中的步骤似乎是有意的,应该有一个原因说明permutation\u importance
不会转换功能。这是预期的行为。排列重要性的工作方式是洗牌输入数据,并将其应用于管道(或模型,如果您需要的话)。事实上,如果您想了解初始输入数据如何影响模型,那么应该将其应用于管道
如果您对预处理步骤生成的每个附加特征的特征重要性感兴趣,则应生成具有列名的预处理数据集,然后直接将该数据应用于模型(使用排列重要性),而不是管道
在大多数情况下,人们对学习管道生成的次要特性的影响不感兴趣。这就是为什么他们在这里使用管道来包含预处理和建模步骤。我可以从代码中看到,它迭代X的原始列(用于范围内的col_idx(X.shape[1])
),并在循环内进行转换。我想不出哪种情况会出问题,但这就是发生的事情。这也让我感到沮丧。我找不到一个简单的方法来处理排列重要性,因为所有的东西都被组装到一个管道中。如果我在排列之前中断预处理器并进行转换,我会对标签的列排序感到各种各样的头疼。如果管道正确地应用在置换中,这一切都可以解决_importance@Josh是的,我也决定这么做。我对特征进行变换,然后将变换后的向量传递给管道。嗨@towi_parallelism,我发现你关于排列重要性的问题非常有趣和有用。我正在尝试获取次要功能的名称,而不是主要功能的名称。我想分享我的问题的链接,以防你能帮助我。非常感谢。谢谢你的回答。我想还有另一个原因。一个热编码会产生完美的多重共线性,向PI提供多重共线特征可能会产生误导