使用MICE技术来填充缺失值

深入探讨MICE在缺失值填充中的应用,确保数据分析的准确性。

原文标题:使用MICE进行缺失值的填充处理

原文作者:数据派THU

冷月清谈:

在数据分析中,缺失值处理至关重要,因为缺失数据会影响模型的准确性和可靠性。MICE(多重插补链式方程)是一种有效的缺失值填充方法。它将每个缺失值视为待估计的参数,利用其他已知变量进行多次迭代填充,每次生成不同的数据集以反映不确定性。MICE的优势在于考虑了变量间的相关性,能够准确估计缺失值,并适应不同类型的数据。虽然MICE的计算成本相对较高,但其提供的结果质量优于其他简单方法,如删除数据或其他填充技术。因此,在处理缺失数据时,MICE是一个值得优先选择的工具。希望本文能帮助读者更好地理解和应用MICE技术进行缺失值填充。希望读者可以尝试使用一些高级的库,如fancyimpute,进一步提高数据处理效果。

怜星夜思:

1、MICE相比其他方法(如KNN)有什么优势和劣势?
2、在使用MICE时,如何选择合适的迭代次数和收敛条件?
3、有没有其他推荐的缺失值填补方法?

原文内容

图片

来源:DeepHub IMBA

本文约1700字,建议阅读5分钟

在本文中,我们重点介绍MICE。


在我们进行机器学习时,处理缺失数据是非常重要的,因为缺失数据可能会导致分析结果不准确,严重时甚至可能产生偏差。处理缺失数据是保证数据分析准确性和可靠性的重要步骤,有助于确保分析结果的可信度和可解释性。


在本文中,我们重点介绍MICE。


MICE(Multiple Imputation by Chained Equations)是一种常用的填充缺失数据的技术。它通过将待填充的数据集中的每个缺失值视为一个待估计的参数,然后使用其他观察到的变量进行预测。对于每个缺失值,通过从生成的多个填充数据集中随机选择一个值来进行填充。通常会重复这个过程多次以增加填充的稳定性。


图片


首先我们先介绍一些常用的缺失数据处理技术:


删除


处理数据是困难的,所以将缺失的数据删除是最简单的方法。


对于小数据集:


如果某列缺失值< 3%,则可以将缺失的样本删除,如果某列缺失值>40%,则可以将该列直接删除。


而对于缺失值在>3%和<40%的数据,则需要进行填充处理。


对于大数据集:


缺失值< 10%可以使用填充技术


缺失值> 10%则需要测试相关性并决定该特征是否值得用于建模后逐行删除缺失记录


删除是处理缺失数据的主要方法,但是这种方法有很大的弊端,会导致信息丢失。


填充


填充是一种简单且可能是最方便的方法。我们可以使用Scikit-learn库中的SimpleImputer进行简单的填充。



from sklearn.impute import SimpleImputer


SimpleImputer有“strategy”参数,它可以让我们选择填充的策略:比如特征是数值可以使用均值或中位数作为策略来估算值,特征是分类的可以使用众数作为策略来估算值。


K-最近邻插值算法


KNN算法是一种监督技术,它简单地找到“特定数据记录中最近的k个数数据点”,并对原始列中最近的k个数数据点的值取简单的平均值,并将输出作为填充值分配给缺失的记录。


我们可以根据现有数据的特点选择不同的距离度量——“欧几里得距离”“曼哈顿距离”“闵可夫斯基距离”等。对于数值特征,KNN插值对相邻值进行加权平均。对于分类特征,KNN取最近邻值的众数。


这里的“K”是一个超参数。


MICE


Multiple Imputation by Chained Equations的基本假设是“数据是随机丢失的,通过查看其他数据样本/记录,可以对数据的真实价值做出有根据的猜测。


看到他的英文我们就知道,他又2个主要的工作步骤:

  1. 多重插补(Multiple Imputation):MICE通过多次生成填充数据集来处理缺失数据。在每次迭代中,它将缺失值填充为估计的值,然后将完整的数据集用于下一次迭代,从而产生多个填充的数据集。

  2. 链式方程(Chained Equations):MICE使用链式方程的方法进行填充。它将待填充的缺失值视为需要估计的参数,然后使用其他已知的变量作为预测变量,通过建立一系列的预测方程来进行填充。每个变量的填充都依赖于其他变量的估计值,形成一个链式的填充过程。

步骤:

  1. 初始化:首先,确定要使用的填充方法和参数,并对数据集进行初始化。

  2. 循环迭代:接下来,进行多次迭代。在每次迭代中,对每个缺失值进行填充,使用其他已知的变量来预测缺失值。

  3. 生成多个填充数据集每次迭代生成一个填充的数据集,直到达到设定的迭代次数或者满足收敛条件。

  4. 合并结果:最后,将生成的多个填充数据集进行合并,通常采用简单的方法(如取均值)来汇总结果,得到一个最终的填充数据集。

优点:

  • 考虑了变量之间的相关性,能够更准确地估计缺失值。

  • 生成了多个填充数据集,能够反映不确定性。

  • 能够灵活地处理不同类型的变量和不同分布的数据。

注意事项:

  • 对于不适用于预测的变量,需要进行预处理或者使用专门的方法进行填充。

  • 需要根据实际情况选择合适的迭代次数和收敛条件,以确保填充结果的稳定性和准确性。

  • 填充后的数据集可能会影响后续分析的结果,因此需要进行适当的验证和比较。


下面我们来使用 fancyimpute 库来进行代码显示。


fancyimpute 提供了多种高级的缺失数据填充技术,包括矩阵分解、K-最近邻、插值和矩阵完成等。它的设计目标是提供一种方便、灵活且高效的方式来处理缺失数据,以便于后续的数据分析和建模。


import pandas as pd
from sklearn.model_selection import train_test_split
from fancyimpute import IterativeImputer

.#In these steps we undertake data exploration and pre-processing
.#I intend to skip till the completion of train-test split of data
.
.
.

xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.25, random_state=101)

Initialize MICE imputer

imputer = IterativeImputer()

Fit and transform MICE imputer on training data

xtrain_imputed = imputer.fit_transform(xtrain)

Transform test data using the trained MICE imputer

xtest_imputed = imputer.transform(xtest)

这里需要注意的是,我们需要在训练集上进行拟合,然后在测试集上进行转换,这样可以保证不会有数据泄露的问题。


总结


虽然MICE带来了计算成本,需要考虑以非常接近真实的标签估算为代价,但是它可以有效地处理各种类型和分布的缺失数据,是处理缺失数据的重要工具之一。其他技术相对非常简单,但是结果的质量没有MICE那么好。


编辑:于腾凯

校对:杨学俊

MICE的优势在于它能更好地捕捉变量之间的关系,提供更准确的插补。而KNN虽然简单,但容易受噪声影响,且计算量较大。但MICE的计算成本较高,需要更长时间。

选择迭代次数和收敛条件时,可以先进行一些先验确定,比如根据数据的复杂度和缺失值的比例。在初步测试中观察填充的稳定性,一般选择10-20次迭代是常见的做法。

我觉得可以通过交叉验证来评估不同迭代次数的效果,根据模型的表现来优化调整。收敛条件可以考虑逐步改进,相信经验会帮助我们找到合适的阈值!

我建议选择较大的样本集进行实验,然后观察预测不准确的变动情况。递增迭代,直到填充结果不再显著变化为止,这样效果会更好。

我认为KNN更直观易用,适合小数据集。但MICE的多重插补策略在处理复杂数据时更加稳定。不过MICE的实现相对复杂,对新手来说不算友好。

除了MICE和KNN,大家可以尝试使用随机森林插补,它能处理复杂的特征交互。不过,随机森林对计算资源的需求较高,适合数据集较大的情况。

MICE能提供更多的不确定性评估,适合在科学研究中使用。不过在时间紧迫的项目中,KNN可能是更好的快速替代品,具体情况具体分析吧!

我个人偏爱使用因子分析或主成分分析来填补缺失值,特别是当数据集具有多维特性时。这样能以更全面的信息提升填补的质量!