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

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)

我想获取所选功能的名称或列索引.关键是,第二个特征 Select 步骤获得第一个特征 Select 步骤的输出(不是原始X_序列).因此,当我在第二个特征 Select 步骤中使用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个实体的布尔array.但是,当我运行kbest.get_support()时,我得到了一个具有14个实体的布尔array.这意味着输入到第二个特征 Select 方法的数据的名称或列索引被重置,并且与输入到第一个特征 Select 方法的数据不匹配.

如何解决这个问题?

推荐答案

如果您只需要获得所选功能的名称,而不需要关心在哪个步骤**中 Select 了哪些功能,那么以下可能是一种简单的方法.

您可以通过设置为True(X, y = load_breast_cancer(return_X_y=True, as_frame=True))的参数as_frame将输入X作为数据帧返回.这将允许您以字符串形式获取特征名称,这反过来又允许方法.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

**顺便说一句,这将使您能够获得first transformer所选功能的原始名称,但不幸的是,第二个功能的原始名称不是这样的,因为数据帧同时变成了numpyarray.

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

enter image description here

Python相关问答推荐

如何比较numPy数组中的两个图像以获取它们不同的像素

连接两个具有不同标题的收件箱

韦尔福德方差与Numpy方差不同

如何在Python中并行化以下搜索?

如何使用pytest来查看Python中是否存在class attribution属性?

Python解析整数格式说明符的规则?

pandas:排序多级列

迭代嵌套字典的值

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

Pandas Loc Select 到NaN和值列表

调用decorator返回原始函数的输出

如何更改groupby作用域以找到满足掩码条件的第一个值?

具有相同图例 colored颜色 和标签的堆叠子图

PYTHON、VLC、RTSP.屏幕截图不起作用

如何强制向量中的特定元素在Gekko中处于优化解决方案中

仅使用预先计算的排序获取排序元素

如何在Airflow执行日期中保留日期并将时间转换为00:00

比较两个有条件的数据帧并删除所有不合格的数据帧

.awk文件可以使用子进程执行吗?

当lambda函数作为参数传递时,pyo3执行