使用scikit-learn填充缺失值
1. 单变量填充
>>> from sklearn.impute import SimpleImputer
>>> imp = SimpleImputer(missing_values=np.nan, strategy='mean')
>>> X = np.array([[np.nan, 2], [6, np.nan], [7, 6]])
>>> X
array([[nan, 2.],
[ 6., nan],
[ 7., 6.]])
>>> imp.fit_transform(X)
array([[6.5, 2. ],
[6. , 4. ],
[7. , 6. ]])
>>> imp = SimpleImputer(missing_values=np.nan, strategy='mean')
>>> imp = SimpleImputer(missing_values=np.nan, strategy='median')
>>> imp = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
>>> imp = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=3)
2. 多变量填充
这种方式在填充时会考虑多个特征之间的关系,比如针对特征A中的缺失值,会同时考虑特征A和其他特征的关系,将其他特征作为自变量,特征A作为因变量,然后建模,来预测特征A中缺失值对应的预测值,通过控制迭代次数,将最后一次迭代的预测值作为填充值。
代码如下
>>> from sklearn.experimental import enable_iterative_imputer
>>> from sklearn.impute import IterativeImputer
>>> imp = IterativeImputer(max_iter=10, random_state=0)
>>> X = np.array([[np.nan, 2], [6, np.nan], [np.nan, 6]])
>>> X
array([[nan, 2.],
[ 6., nan],
[nan, 6.]])
>>> imp.fit_transform(X)
array([[6., 2.],
[6., 4.],
[6., 6.]])
这种方式非常灵活,在拟合的时候可以选择多种模型,以决策树回归模型为例,代码如下
>>> from sklearn.tree import DecisionTreeRegressor
>>> imp = IterativeImputer(DecisionTreeRegressor(), max_iter=10, random_state=0)
3. KNN填充
K近邻填充,首先根据欧几里得距离计算与缺失值样本距离最近的K个样本,计算的时候只考虑非缺失值对应的维度,然后用这K个样本对应维度的均值来填充缺失值,代码如下
>>> from sklearn.impute import KNNImputer
>>> X = np.array([[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]])
>>> X
array([[ 1., 2., nan],
[ 3., 4., 3.],
[nan, 6., 5.],
[ 8., 8., 7.]])
>>> imputer = KNNImputer(n_neighbors=2, weights="uniform")
>>> imputer.fit_transform(X)
array([[1. , 2. , 4. ],
[3. , 4. , 3. ],
[5.5, 6. , 5. ],
[8. , 8. , 7. ]])
在实际分析中,缺失值填充的算法还有很多,但是在scikit-learn中,主要就是集成了这3种填充方法。
赞 (0)