由于各种原因,许多真实世界中的数据集都包含缺失值,这些值通常被编码为空格、NaNs或其他占位符。然而,这些数据集与scikit-learn估计器(estimators)不兼容,scikit-learn估计器(estimators)假设数组中的所有值都是数值,并且所有值都具有意义。使用不完整数据集的基本策略是放弃包含缺失值的整行和/或列,然而,这是以丢失可能有价值的数据(即使不完整)为代价的。一个更好的策略是插补(imputation)缺失值,即从数据的已知部分推断缺失值。关于插补(imputation),见 通用术语汇编和API元素 条目。
1. 单变量与多变量插补
一种插补算法是单变量算法,它只使用第i个特征维度中的非缺失值(例如:impute.SimpleImputer
)来插补第i个特征维度中的缺失值。相比之下,多变量插补算法使用一整套可用的特征来估计缺失值(例如,
impute.IterativeImputer
)。
2. 单变量特征插补
SimpleImputer
类提供了插补缺失值的基本策略。缺失值可以使用提供的常量值进行插补,也可以使用缺失值所在的每一列的统计数据(平均值、中值或最频繁值)。这个类还允许使用不同的缺失值编码方法。 以下代码段演示如何使用包含缺失值的列(axis 0)的平均值替换编码为
np.nan
的缺失值:
>>> import numpy as np
>>> from sklearn.impute import SimpleImputer
>>> imp = SimpleImputer(missing_values=np.nan, strategy='mean')
>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])
SimpleImputer()
>>> X = [[np.nan, 2], [6, np.nan], [7, 6]]
>>> print(imp.transform(X))
[[4. 2. ]
[6. 3.666...]
[7. 6. ]]
SimpleImputer
类还支持稀疏矩阵:
>>> import scipy.sparse as sp
>>> X = sp.csc_matrix([[1, 2], [0, -1], [8, 4]])
>>> imp = SimpleImputer(missing_values=-1, strategy='mean')
>>> imp.fit(X)
SimpleImputer(missing_values=-1)
>>> X_test = sp.csc_matrix([[-1, 2], [6, -1], [7, 6]])
>>> print(imp.transform(X_test).toarray())
[[3. 2.]
[6. 3.]
[7. 6.]]
请注意,此格式不能用于隐式存储矩阵中缺失的值,因为它会在转换时使其密集。编码为0的缺失值必须与密集输入一起使用。 当使用
'most_frequent'
或
'constant'
策略时,
SimpleImputer
类还支持表示为string values或pandas categoricals的分类数据:
>>> import pandas as pd
>>> df = pd.