直接调用mutual_info_classif与SelectKBest得分差异原因分析
得分差异的核心原理
两次结果差异完全来自输入数据集的样本量不同,与SelectKBest框架、函数参数无关:
- 直接调用
mutual_info_classif时,输入为全量5个样本的特征与标签 - 调用
SelectKBest.fit前你执行了train_test_split,默认test_size=0.2会拆分出4个训练样本、1个测试样本,fit方法仅在4个训练样本上计算得分
注:两次计算的特征排序完全一致,仅得分数值不同,不会影响Top-K特征的筛选结果。若你将
f_selector.fit(X, y)传入全量数据,且参数完全一致,得到的得分会和直接调用mutual_info_classif完全相同。mutual_info_classif采用基于k近邻的Kraskov估计器,样本量越少估计偏差越大,因此4个训练样本上的估计值(0.83)与5个全量样本上的估计值(0.48)存在明显差异。
高维特征选择的选型建议
- 严格避免数据泄露:特征选择只能使用训练集数据,绝对不能用包含测试集的全量数据计算得分。你当前拆分训练集后再用
SelectKBest的流程符合规范,若用全量数据计算,测试集信息会被提前纳入建模,最终泛化能力评估会严重失真。 - 高维场景前置减耗:60000个特征计算互信息开销较大,可先通过方差过滤移除所有样本取值完全一致的无效特征,再计算互信息,能大幅降低计算量。
- 显式指定参数提升效率:若特征全部为连续型,显式设置
discrete_features=False;若全部为离散型,设置discrete_features=True,比auto的自动类型判断效率更高。 - 固定
random_state参数,保证特征选择结果可复现,避免实验波动。
内容的提问来源于stack exchange,提问作者Ganitph。
相关产品推荐
相关产品推荐

