二分类任务中如何重采样DataFrame并移除NaN值
二分类任务下高占比缺失值的处理方案
首先直接回应你关心的几个核心问题:
- 普通NN(K近邻)插值不适合直接用来填充60%占比以上的缺失值,确实存在生成误导性数据的风险:普通KNN填充是找特征空间中最近的非缺失样本值做平均/加权填充,缺失率超过60%时,可参考的非缺失样本覆盖度极低,很容易放大非缺失子集的分布偏差,如果这两个特征和标签相关性较强,填充带来的噪声会直接破坏特征和标签的真实关联。
- SMOTE类方法是用来平衡样本类别分布的,没有缺失值填充的逻辑,不要硬套在缺失处理场景。
按优先级排序的可行方案
你不想删列、也不想缩减整体数据规模,可以按下面的顺序选方案,适配非时序二分类场景:
- 第一优先级:先把缺失本身作为特征信息
高占比缺失往往不是随机出现的,本身就携带和任务相关的信息,比如对应传感器故障、特定分组未采集到数据等,这类信息对二分类任务可能有很强的预测性。
操作很简单:对这两个高缺失列,分别生成二元标记列is_missing_feat_a、is_missing_feat_b,标记每行对应位置是否为NaN,先把这部分信息保留下来,后续再做填充时,哪怕填充值有小偏差,缺失本身的信息也不会丢失。
如果你最终用的是XGBoost、LightGBM、CatBoost这类树模型,甚至不需要强行填充NaN:这类模型原生支持缺失值分裂,会自动把缺失值划归到增益最大的分支,加上缺失标记列之后直接训练,效果往往比硬填充更好。 - 第二优先级:选带约束的填充方法,替代无监督NN插值
不要用全局均值/中位数、普通KNN插值这类不参考标签的无监督填充,优先选能保留特征-标签关联的填充方式:- 首选
MissForest:基于随机森林的迭代填充算法,每轮填充时会把待填充列作为预测目标,用其余所有特征+分类标签作为输入训练模型,预测缺失位置的值,对50%~70%缺失率的场景适配性远好于普通NN插值,生成的填充值不会违背特征间、特征和标签间的现有关联。 - 如果一定要用近邻类填充方法,就做标签分层的KNN填充:先按二分类标签把数据集拆成两个子集,在每个子集内部单独训练KNN填充器做填充,不要跨标签找近邻参考值,能大幅降低填充值误导标签关联的风险,直接调用
sklearn.impute.KNNImputer分标签fit即可实现。
- 首选
- 第三优先级:用分层重采样调整样本结构,降低填充偏差
不需要直接删除所有含缺失值的行,可以做分层保留重采样:
先按两个特征的缺失状态把所有样本分成4组(feat1缺feat2不缺、feat2缺feat1不缺、两者都缺、两者都不缺),对每组单独做有放回抽样,保证抽样后每组的标签分布和原数据集整体标签分布一致,同时把「两个特征都不缺」的样本占比拉到总样本量的30%~40%,剩下的含缺失值的样本结合前面的缺失标记列+分层填充处理,既不会缩减整体数据规模,也能避免全量高比例填充带来的分布偏移。
避坑提醒
- 填充完成后一定要做校验:计算非缺失子集里这两个特征和标签的相关系数,再计算填充后全量数据里对应特征和标签的相关系数,如果两者偏差超过20%,说明填充值存在明显偏差,需要调整填充模型的参数。
- 不要为了凑“无缺失值”强行用生成模型造不符合逻辑的值:如果尝试多种填充方法后校验偏差都过大,优先用原生支持缺失值的树模型训练,不要硬填。
内容的提问来源于stack exchange,提问作者user16603056
相关产品推荐
相关产品推荐

