使用SelectKBest做特征选择时 训练测试集用相同代码会选出相同特征吗
问题结论
- 你提供的代码无法得到一致的特征,必须进行修改。
问题原因
你分别对训练集、测试集执行了fit_transform操作,相当于用两个不同数据集独立训练了两个SelectKBest实例:
SelectKBest的fit阶段会基于输入数据和标签计算每个特征的卡方统计值,再筛选得分排名前k的特征。训练集和测试集的样本分布、特征与标签的相关性不可能完全一致,两次fit得到的特征排名规则必然不同,最终筛选出的25个特征大概率不一致。
这种写法还会导致数据泄露问题:你在特征选择阶段用到了测试集的标签信息,后续模型评估的结果会完全失真,无法反映模型的真实泛化能力。
修正后的代码
正确的逻辑是仅在训练集上训练特征选择器,再用同一个选择器处理训练集和测试集:
# 仅在训练集上fit特征选择器 selector = SelectKBest(chi2, k=25) x_tr = selector.fit_transform(x_tr, y_tr) # 直接用训练好的选择器转换测试集,不需要再次fit x_ts = selector.transform(x_ts)
内容的提问来源于stack exchange,提问作者Bhavana Yuvaraj
相关产品推荐
相关产品推荐

