You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Ваня Пупко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:05:21