使用Scikit Learn的SelectKBest调用get_support()时遇numpy.ndarray属性错误
解决SelectKBest调用get_support()时出现的'numpy.ndarray' object has no attribute 'get_support'错误
Hey Jeff, 我来帮你搞定这个问题!你碰到的这个错误其实挺常见的,核心原因是你误把SelectKBest拟合后输出的特征矩阵(numpy数组)当成了SelectKBest的实例对象来调用get_support()方法啦。
为什么会出错?
SelectKBest的工作逻辑是这样的:你得先创建一个SelectKBest实例,然后用fit()或者fit_transform()处理数据。其中fit_transform()会直接返回筛选后的特征矩阵(这是个numpy.ndarray类型),但get_support()是属于SelectKBest实例本身的方法,根本不是这个返回数组的方法——所以直接拿数组调用肯定会报错。
正确的操作步骤&代码示例
你需要保留SelectKBest的实例对象,而不是只取它返回的特征矩阵。看下面的具体代码:
from sklearn.feature_selection import SelectKBest, f_regression import pandas as pd import numpy as np # 模拟一份测试数据集 X = pd.DataFrame({ 'feat1': np.random.rand(100), 'feat2': np.random.rand(100), 'feat3': np.random.rand(100), 'feat4': np.random.rand(100) }) y = np.random.rand(100) # 1. 先初始化SelectKBest实例 selector = SelectKBest(f_regression, k=2) # 2. 拟合数据并得到筛选后的特征矩阵 X_selected = selector.fit_transform(X, y) # 3. 用selector实例调用get_support(),而不是X_selected feature_mask = selector.get_support() # 4. 根据掩码获取对应的特征名称 selected_feature_names = X.columns[feature_mask] print("筛选出的特征名称:", selected_feature_names)
你可能踩的错误坑(对比参考)
很多人会图省事直接链式调用,结果就踩了这个坑:
# 错误示例:直接把fit_transform的返回值当成实例 X_selected = SelectKBest(f_regression, k=2).fit_transform(X, y) mask = X_selected.get_support() # 这里必然报错,因为X_selected是numpy数组
总结一下
关键就是要保留SelectKBest的实例对象,别只拿它输出的特征矩阵。只要你在代码里存好了初始化后的selector实例,就能正常调用get_support()获取特征筛选的掩码,进而轻松拿到对应的特征名称啦。
内容的提问来源于stack exchange,提问作者JeffZheng
相关产品推荐
相关产品推荐

