基于不同尺度交叉列的NA值插补方法及标准化实现问询
问题描述
数据集
| Person | Score1 | Score2 |
|---|---|---|
| Alice | 5.6 | 3.2 |
| Bob | 9.3 | 8.7 |
| Charlie | 7.2 | NA |
| Dave | -4 | NA |
| John | NA | 10 |
| Henry | 11 | 13 |
| Jane | 3 | 8 |
现有上述数据集,多数样本拥有Score1与Score2两个不同尺度的分数。需利用样本其中一列的已知分数,插补另一列的缺失NA值,即预测该样本若参加对应测试的分数(例如,利用Charlie的Score1=7.2预测其Score2的缺失值)。
由于两列尺度不同,需先将其转换至同一尺度,且因MinMaxScaler会增加数据变异性而不考虑使用。本人尝试采用StandardScaler实现标准化,代码如下:
feature = df[['Score1']] feature2 = df[['Score2']] scaler = StandardScaler().fit(feature.values) df[['Score1']] = scaler.fit_transform(feature.values) df[['Score2']] = scaler.fit_transform(feature2.values)
请问该实现方式是否可行?或是否有更合适的NA值插补方案?
解答
你的StandardScaler实现不可行
当前代码存在两个核心问题:
- 重复拟合+错误复用Scaler:你先对
feature(Score1)拟合了Scaler,但后续又调用fit_transform重新拟合,完全冗余;更关键的是,用同一个Scaler去处理Score2是错误的——Score1和Score2是不同分布的变量,必须分别用独立的Scaler拟合,不能共用。正确的标准化方式应为:
from sklearn.preprocessing import StandardScaler scaler1 = StandardScaler() scaler2 = StandardScaler() # 仅基于非缺失值拟合,避免NA干扰 df['Score1_scaled'] = scaler1.fit_transform(df[['Score1']].dropna()) df['Score2_scaled'] = scaler2.fit_transform(df[['Score2']].dropna())
- 标准化无法直接完成插补:标准化只是统一尺度,你还需要建立两列的关联模型,才能用已知值预测缺失值。
更合适的插补方案
1. 线性回归建模插补(推荐)
你的需求本质是建立两列分数的预测关系,线性回归是最直接且准确的选择:
- 步骤1:筛选出同时拥有Score1和Score2非缺失值的样本作为训练集
- 步骤2:分别训练两个模型:用Score1预测Score2、用Score2预测Score1
- 步骤3:用对应模型插补缺失值
示例代码:
import pandas as pd from sklearn.linear_model import LinearRegression # 假设数据集已读入df train_data = df.dropna(subset=['Score1', 'Score2']) # 训练Score1→Score2的预测模型 model_1to2 = LinearRegression() model_1to2.fit(train_data[['Score1']], train_data['Score2']) # 训练Score2→Score1的预测模型 model_2to1 = LinearRegression() model_2to1.fit(train_data[['Score2']], train_data['Score1']) # 插补缺失的Score2 df.loc[df['Score2'].isna(), 'Score2'] = model_1to2.predict(df.loc[df['Score2'].isna(), ['Score1']]) # 插补缺失的Score1 df.loc[df['Score1'].isna(), 'Score1'] = model_2to1.predict(df.loc[df['Score1'].isna(), ['Score2']])
这种方法能捕捉两列之间的真实关联,插补结果更符合数据逻辑。
2. 标准化+映射关系插补(快速粗略方案)
如果数据量极小,不想建模,可以用这种简化方式:
- 对Score1和Score2分别做标准化(各用独立Scaler)
- 计算非缺失样本中,标准化后两列的均值差或比例
- 用该映射关系转换已知的标准化分数,再反标准化得到原始尺度的插补值
但这种方法准确性远低于线性回归,仅适合临时快速处理。
3. K近邻插补(多特征场景适配)
如果后续有更多样本特征,可以用KNN算法,基于相似样本的分数分布插补缺失值,但在当前仅两列的场景下,效果和线性回归差异不大。
内容的提问来源于stack exchange,提问作者bangbanggggg
相关产品推荐
相关产品推荐

