在我们进行机器学习时,处理缺失数据是非常重要的,因为缺失数据可能会导致分析结果不准确,严重时甚至可能产生偏差。处理缺失数据是保证数据分析准确性和可靠性的重要步骤,有助于确保分析结果的可信度和可解释性。
在本文中,我们讲重点介绍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个主要的工作步骤:
- 多重插补(Multiple Imputation):MICE通过多次生成填充数据集来处理缺失数据。在每次迭代中,它将缺失值填充为估计的值,然后将完整的数据集用于下一次迭代,从而产生多个填充的数据集。
- 链式方程(Chained Equations):MICE使用链式方程的方法进行填充。它将待填充的缺失值视为需要估计的参数,然后使用其他已知的变量作为预测变量,通过建立一系列的预测方程来进行填充。每个变量的填充都依赖于其他变量的估计值,形成一个链式的填充过程。
步骤:
- 初始化:首先,确定要使用的填充方法和参数,并对数据集进行初始化。
- 循环迭代:接下来,进行多次迭代。在每次迭代中,对每个缺失值进行填充,使用其他已知的变量来预测缺失值。
- 生成多个填充数据集:每次迭代生成一个填充的数据集,直到达到设定的迭代次数或者满足收敛条件。
- 合并结果:最后,将生成的多个填充数据集进行合并,通常采用简单的方法(如取均值)来汇总结果,得到一个最终的填充数据集。
优点:
- 考虑了变量之间的相关性,能够更准确地估计缺失值。
- 生成了多个填充数据集,能够反映不确定性。
- 能够灵活地处理不同类型的变量和不同分布的数据。
注意事项:
- 对于不适用于预测的变量,需要进行预处理或者使用专门的方法进行填充。
- 需要根据实际情况选择合适的迭代次数和收敛条件,以确保填充结果的稳定性和准确性。
- 填充后的数据集可能会影响后续分析的结果,因此需要进行适当的验证和比较。
下面我们来使用
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那么好。
作者:Rahul Kotecha