gpt4 book ai didi

python - 当 sklearn 管道中有多种特征选择方法时,如何获取所选特征的名称?

转载 作者:行者123 更新时间:2023-12-05 05:37:31 29 4
gpt4 key购买 nike

我想在 sklearn 管道中使用多种特征选择方法,如下所示:

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.feature_selection import VarianceThreshold
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)


model = Pipeline([('vt', VarianceThreshold(0.01)),
('kbest', SelectKBest(chi2, k=5)),
('gbc', GradientBoostingClassifier(random_state=0))])


model.fit(X_train, y_train)
y_pred = model.predict(X_test)

我想获取所选特征的名称或列索引。关键是第二个特征选择步骤获得了第一个特征选择步骤的输出(不是原始的 X_train)。因此,当我在第二个特征选择步骤中使用 get_support()get_feature_names_out() 等方法时,特征名称或索引与原始输入特征不匹配。

vt = model['vt']
vt.get_feature_names_out()
vt.get_support()


kbest = model['kbest']
kbest.get_feature_names_out()
kbest.get_support()

例如,当我运行 vt.get_support() 时,我得到一个包含 30 个整数的 bool 值数组。但是,当我运行 kbest.get_support() 时,我得到了一个包含 14 个整数的 bool 值数组。这意味着输入到第2种特征选择方法的数据的名称或列索引被重置,并且与第1种特征选择方法的输入数据不匹配。

如何解决这个问题?

最佳答案

如果您无需关心在哪个步骤中选择了哪些特征就足以获取所选特征的名称**,以下可能是一种简单的方法。

您可以通过将参数 as_frame 设置为 True (X, y = load_breast_cancer(return_X_y=True, as_frame=正确))。这将允许您将特征名称作为字符串获取,这反过来又允许方法 .get_feature_names_out() 返回具有原始名称的所选特征。如果您使用 numpy 数组,则不会发生同样的情况,因为它们没有明确的列名。

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.feature_selection import VarianceThreshold
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

X, y = load_breast_cancer(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

model = Pipeline([('vt', VarianceThreshold(0.01)),
('kbest', SelectKBest(chi2, k=5)),
('gbc', GradientBoostingClassifier(random_state=0))])

model.fit(X_train, y_train)

model[:-1].get_feature_names_out()

enter image description here

** 顺便说一句,这将使您能够为 第一个 转换器获取所选功能的原始名称,但不幸的是,对于第二个转换器则不行,因为同时数据帧变成了一个 numpy 数组。

vt = model['vt']
vt.get_feature_names_out()

enter image description here

关于python - 当 sklearn 管道中有多种特征选择方法时,如何获取所选特征的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73104051/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com