因为各种各样的原因,真实世界中的许多数据集都包含
缺失数据
,这类数据经常被编码成空格、NaNs,或者是其他的占位符。但是这样的数据集并不能scikit-learn
学习算法兼容,因为大多的学习算法都默认假设数组中的元素都是数值,因而所有的元素都有自己的意义。
使用不完整的数据集的一个基本策略就是舍弃掉整行或整列包含缺失值的数据。但是这样就付出了舍弃可能有价值数据(即使是不完整的 )的代价。
处理缺失数值的一个更好的策略就是从已有的数据推断出缺失的数值
。
1、单变量与多变量插补的区别
- 一种类型的插补算法是单变量算法,它只使用第i个特征维度中的非缺失值(如
impute.SimpleImputer
)来插补第i个特征维中的值。 - 相比之下,多变量插补算法使用整个可用特征维度来估计缺失的值(如
impute.IterativeImputer
)。
2、单变量插补
scikit-learn
的SimpleImputer类
提供了计算缺失值的基本策略。缺失值可以用提供的常数值计算,也可以使用缺失值所在的行/列中的统计数据(平均值、中位数或者众数)来计算。这个类也支持不同的缺失值编码。
以下代码段演示了如何使用包含缺失值的列(轴0)的平均值来替换编码为 np.nan
的缺失值:
import numpy as np
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
imp_mean.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]])
X = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]]
print(imp_mean.transform(X))
结果:
3、多变量插补
一种更复杂的方法是使用IterativeImputer
类,它将每个缺失值的特征建模为其他特征的函数,并使用该估计值进行估算。它以迭代循环方式执行:在每个步骤中,将要素目标列指定为输出y
,将其他列视为输入X
。使用一个回归器来在已知(未缺失)y
的样本上,对(X
,y
)进行拟合。然后使用这个回归器来预测缺失的y值。这是以迭代的方式对每个特征进行的,然后重复max_iter
轮。最后一轮的计算结果被返回。
注意 :这个估计器目前还处于试验阶段:预测和API可能会在没有任何弃用周期的情况下发生变化。要使用它,您需要显式地导入
enable_iterative_imputer
。
import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imp_mean = IterativeImputer(random_state=0)
imp_mean.fit([[7, 2, 3], [4, np.nan, 6], [10, 5, 9]])
X = [[np.nan, 2, 3], [4, np.nan, 6], [10, np.nan, 9]]
imp_mean.transform(X)
结果:
参考:
- http://scikitlearn.com.cn/0.21.3/41/
- https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html#sklearn.impute.SimpleImputer
- https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html#sklearn.impute.IterativeImputer