Python中SelectKBest失效:X_new与原始X长度一致问题
解决SelectKBest筛选特征后X_new和原始X"长度"相同的问题
嘿,我帮好几个开发者排查过这个问题,大概率是几个常见的小误区导致的,咱们一个个来捋:
误区1:把样本数当成了特征数
你说的"长度完全相同",是不是看了len(X_new)和len(X)?其实这俩都是样本的数量,SelectKBest本来就不会改变样本数,只会减少特征的数量!
要检查特征筛选是否生效,得看特征维度,也就是数组的第二个维度:
# 正确的检查方式 print(f"原始特征数量: {X.shape[1]}") print(f"筛选后特征数量: {X_new.shape[1]}")
如果这里显示筛选后的特征数确实和原始一样,那再看下面的原因。
原因2:没指定k值或k设置过大
SelectKBest的默认k值是10,如果你的原始特征数量≤10,那它会保留所有特征,自然看不到筛选效果。
解决方法:初始化的时候明确设置你想要保留的特征数,比如要选Top5特征:
from sklearn.feature_selection import SelectKBest, f_classif # 明确指定k=5,替换成你需要的数字 selector = SelectKBest(score_func=f_classif, k=5) X_new = selector.fit_transform(X, y)
原因3:特征得分存在大量并列最高分
这种情况比较少见,但如果多个特征的得分完全相同,且数量超过你设置的k,SelectKBest会保留所有得分最高的特征。
你可以查看每个特征的得分和被选中的索引,确认情况:
# 查看每个特征的得分 print("各特征得分:", selector.scores_) # 查看被选中的特征索引 print("选中的特征索引:", selector.get_support(indices=True))
完整的正确示例代码
from sklearn.feature_selection import SelectKBest, f_classif from sklearn.datasets import load_iris # 加载示例数据 X, y = load_iris(return_X_y=True) print(f"原始特征数: {X.shape[1]}") # 输出4 # 初始化SelectKBest,选择Top2特征 selector = SelectKBest(score_func=f_classif, k=2) X_new = selector.fit_transform(X, y) print(f"筛选后特征数: {X_new.shape[1]}") # 输出2 print(f"样本数是否一致: {len(X_new) == len(X)}") # 输出True,这是正常的!
内容的提问来源于stack exchange,提问作者Ваня Пупко
相关产品推荐
相关产品推荐

