Python数据插补:含多NaN值索引的线性回归缺失值处理方案
线性回归建模时的NaN缺失值处理方案
你现在直接删除含缺失值的行后仅剩余3条样本,完全无法支撑模型的泛化能力,要保留全量数据适配线性回归要求,按以下流程处理即可:
前置校验
先排查所有非NaN的异常格式值:你给出的原始数据里索引0的F_2值为1.5 -,属于带多余字符的格式错误值,先修正为数值型的1.5,再处理NaN。
同时先判断缺失类型,再选对应填充策略:
- 完全随机缺失(MCAR):缺失和所有字段取值无关,比如传感器偶发漏采
- 随机缺失(MAR):缺失和其他已观测字段的取值相关,比如F3取值超过2.8时设备自动跳过F3采集
- 非随机缺失(MNAR):缺失和字段自身取值相关,比如F1数值超出设备量程时返回NaN
可选处理方案
1. 统计量填充(适合缺失占比<20%的MCAR场景,实现最简单)
针对单个存在缺失的特征列,用列自身的统计值填充,适配线性回归对特征分布的要求:
- 优先选中位数填充:相比均值对异常值更鲁棒,不会把特征分布拉偏。比如你数据集中F1的非空值为0.5、0.8、1.2、0.7、1,中位数为0.8,直接用0.8填充F1列的所有NaN即可,F2、F3列同理。
- 禁止盲目用0填充:除非业务上NaN本身就代表“取值为0”,否则硬填0会严重干扰线性回归的系数估计。
- 可选补充缺失标记列:对每个有缺失的列新增
{列名}_is_null的0-1特征,1代表该位置原先是缺失值,0代表非空,可以把“缺失”本身携带的信息保留给模型,避免信息损耗。
2. 模型预测填充(适合MAR场景,填充精度更高)
不用全局统计量,利用特征间的关联预测缺失值,小样本场景下效果远好于统计量填充:
- 操作逻辑:对每个有缺失的列,把该列作为预测目标,用其他非空列做特征,基于所有该列非空的样本训练一个极简模型(K近邻、简单线性回归均可),用训练好的模型预测该列NaN位置的取值。
- 你当前样本量很小,选K近邻填充(n_neighbors取2~3即可)性价比最高,参考实现代码:
import numpy as np from sklearn.impute import KNNImputer # 原始数据集,已提前把F2列的格式错误值修正为1.5 raw_data = np.array([ [0.5, 1.5, 1], [0.8, 2.3, 2], [np.nan, np.nan, 3], [1.2, 3.0, np.nan], [np.nan, 1.9, 1.4], [0.7, np.nan, 1.6], [1, 2.6, 2.2] ]) # 初始化填充器,训练后输出填充完成的数组 imputer = KNNImputer(n_neighbors=2) filled_data = imputer.fit_transform(raw_data)
- 注意不要用随机森林、XGBoost这类复杂模型做填充,很容易造成标签泄露,最终模型效果虚高。
3. 选用原生支持缺失值的线性回归实现
部分改进的线性回归算法在计算损失时会自动跳过NaN位置的取值,不需要提前做填充处理,也不会引入填充带来的人为偏差。但如果是MNAR类型的缺失,还是建议补充缺失标记列,否则模型系数估计会有偏。
避坑提醒
- 如果NaN出现在你要预测的标签列上,直接删除对应行即可,不要对标签做填充,否则只会给模型引入噪声。
- 所有填充逻辑必须在训练集、测试集拆分之后执行:只用训练集的统计量、训练好的填充器处理验证集和测试集的缺失值,不要先用全量数据做填充再拆分,会造成数据泄露,模型上线后效果会大幅跳水。
内容的提问来源于stack exchange,提问作者daniltomashi
相关产品推荐
相关产品推荐

