了解了几种处理缺失数据的技术,从简单的统计值替代到更复杂的基于模型的方法,自然会产生一个问题:你应该选择哪种方法?没有单一的“最佳”插补策略;最佳选择在很大程度上取决于你数据的性质、缺失的程度和模式,以及你机器学习任务的特定要求。让我们比较一下我们讨论过的方法,以帮助你做出决策。
比较维度
评估插补方法时,请考虑以下因素:
- 实现难度和计算成本: 该方法实现起来有多容易,以及它需要多少时间/计算资源,特别是在大型数据集上?
- 对数据分布的影响: 该方法是否会扭曲特征的原始分布,特别是其方差或与其他特征的关系?
- 特征间关系的使用: 该方法是否会使用其他特征的信息进行插补?
- 对异常值的敏感性: 该方法对数据中的极端值有多敏感?
- 对不同缺失机制的处理: 该方法在 MCAR、MAR 或潜在的 MNAR 等不同假设下表现如何?
- 对数据类型的适用性: 该方法是否适用于数值型、类别型或混合数据类型?
方法比较
让我们根据这些维度来评估我们的技术:
简单插补(均值、中位数、众数)
- 优点:
- 非常容易和快速实现(Scikit-learn 中的
SimpleImputer)。
- 可用作快速基线。
- 众数插补适用于类别型特征。
- 缺点:
- 降低插补特征的方差。
- 扭曲特征之间的关系(相关性)。
- 忽略来自其他特征的信息(单变量方法)。
- 均值插补对异常值敏感;中位数插补更有效。
- 不考虑数据缺失的原因;如果数据不是 MCAR,可能会引入偏差。
- 最适合用于: 快速初步分析、缺失值很少的数据集、计算成本是主要限制的情况,或作为用于比较的简单基线。
缺失值指示器
- 优点:
- 创建简单(例如,使用 Pandas 添加一个二进制列)。
- 明确保留了值最初缺失的信息,如果缺失机制是 MNAR,这可能具有预测性。
- 可以与任何其他插补方法结合使用。
- 缺点:
- 增加了数据集的维度。
- 实际上不填充缺失值;对于无法处理
NaN 的算法,仍然需要另一种插补方法。
- 最适合用于: 缺失本身的事实可能包含有价值的预测信息的情况(通常与 MNAR 场景相关)。常与均值/中位数/众数插补或更高级的插补方法一起使用。
K近邻 (KNN) 插补器
- 优点:
- 多变量方法:使用“邻近”样本(基于其他特征)的信息来插补值。
- 如果特征空间中局部存在相对复杂的非线性关系,可以捕捉它们。
- 可以处理数值型和(采用适当距离度量)类别型特征,尽管 Scikit-learn 的
KNNImputer 主要针对数值数据。
- 缺点:
- 计算成本高于简单方法,尤其是在大型数据集上(需要计算距离)。如果未优化,查找邻居的复杂度大约是 O(Nsamples2×Nfeatures)。
- 对 k(邻居数量)的选择和距离度量敏感。
- 在高维空间中性能可能会下降(维度灾难)。
- 对异常值敏感,因为它们会影响邻居选择和插补值(通常是邻居的均值/中位数)。通常建议事先对特征进行缩放。
- 最适合用于: 认为特征关系对插补有帮助,且增加的计算成本可以接受的数据集。当数据为 MAR 时,通常表现优于简单插补。
迭代插补器(例如 MICE)
- 优点:
- 多变量方法:将每个有缺失值的特征建模为其他特征的函数,潜在地捕捉复杂的相互作用。
- 通常被认为是最复杂和准确的插补方法之一。
- 灵活:内部可以根据特征类型使用不同的回归模型。Scikit-learn 的
IterativeImputer 默认通常使用贝叶斯岭回归。
- 在 MAR 假设下通常表现良好。
- 缺点:
- 是讨论过的方法中计算量最大的,因为它涉及迭代训练多个回归模型。
- 实现难度高于简单插补或 KNN 插补。
- 依赖于底层回归模型的假设(例如,如果使用线性回归,则需要线性假设)。
- 收敛性并非总能保证,结果可能取决于初始化和特征插补的顺序。
- 最适合用于: 插补准确性非常重要、特征交互复杂、计算资源允许且怀疑是 MAR 机制的情况。
总结与实用建议
以下是突出主要区别的摘要表:
| 特征 |
简单(均值/中位数/众数) |
指示器变量 |
KNN 插补器 |
迭代插补器 |
| 方法 |
单变量 |
元数据 |
多变量(局部) |
多变量(模型) |
| 复杂度 |
低 |
低 |
中 |
高 |
| 速度 |
快 |
快 |
中/慢 |
慢 |
| 是否使用其他特征 |
否 |
否(间接) |
是 |
是 |
| 对方差的影响 |
减少 |
不适用(添加特征) |
比简单方法减少少 |
通常保留良好 |
| 处理异常值 |
均值:差,中位数:好 |
不适用 |
敏感 |
取决于模型 |
| 处理 MAR/MNAR |
对 MAR/MNAR 效果差 |
对 MNAR 有帮助 |
对 MAR 效果更好 |
对 MAR 效果好 |
选择你的方法:
- 从简单开始: 以中位数(数值型)或众数(类别型)插补作为基线。它速度快,对异常值处理得好。评估你的模型性能。
- 考虑指示器: 如果你怀疑缺失的模式有信息量(潜在的 MNAR),可以在选择的插补方法之外,补充缺失指示器特征。
- 评估多变量方法: 如果基线性能不足,或者你认为特征之间的关系对插补很重要(可能是 MAR),请尝试
KNNImputer 或 IterativeImputer。
- 如果局部关系很强或你想使用非参数方法,
KNNImputer 可能更可取。请记住先对数据进行缩放。
IterativeImputer 通常更强大但更慢。当目标是最大化插补准确性时,这是一个有力的选择。
- 交叉验证很重要: 插补方法的真正考验在于它对下游机器学习模型性能的影响。始终在交叉验证框架内评估不同的插补策略。比较每种插补技术在保留验证集上达到的模型性能(例如,准确率、F1 分数、RMSE)。针对你的特定问题进行经验性测试是无可替代的。
请记住,插补引入了人工数据。尽管必要,但了解其潜在影响并根据你的数据特点和建模目标深思熟虑地选择方法是很重要的。