Sklearn缺失值插值估算

在建立估算器之前估算缺失值
代码链接https://gitee.com/youryouth/mc/tree/9ccdba810aa2cd6b4c90b60c644325941b616b11/sklearn/missing_data_imputer
可以使用基本sklearn.impute.SimpleImputer将缺失值替换为平均值,中位数或最频繁的值(众数)。
在此示例中,我们将研究不同的插补技术:
填充常数0
每个特征的平均值进行归因,并结合缺失指标辅助变量
k最近邻归因
迭代插补
我们将使用两个数据集:糖尿病数据集,其中包括10个从糖尿病患者那里收集的,旨在预测疾病进展的特征变量;以及加利福尼亚住房数据集,其目标是加利福尼亚地区的平均房价。
由于这些数据集都没有缺失值,因此我们将删除一些值以使用人为缺失的数据创建新版本。 然后将RandomForestRegressor在完整原始数据集上的性能与使用不同技术估算的人工缺失值与变更后的数据集的性能进行比较。

下载数据并设置缺失值集
首先,我们下载两个数据集。 scikit-learn附带了糖尿病数据集。 它具有442个条目,每个条目具有10个特征。 加州住房数据集更大,有20640个条目和8个特征,需要下载。 为了加快计算速度,我们将仅使用前400个条目,但可以随意使用整个数据集。
X_california shape (400, 8), y_california (400,)
X_miss_california shape (400, 8), y_miss_california (400,)
X_diabetes shape (442, 10), y_diabetes (442,)
X_miss_diabetes shape (442, 10), y_miss_diabetes (442,)

插补缺失值并打分
现在,我们将编写一个函数,该函数将对不同插补数据的结果进行评分。 让我们分别看一下每个不良因素:
除了估算缺失值外,注入器还具有一个add_indicator参数,该参数标记缺失的值,其中可能包含一些信息。

使用0替换缺失值
现在,我们将在缺失值被0代替的数据上估算分数:

缺失值的kNN填补
sklearn.impute.KNNImputer使用所需的最近邻居数的加权或未加权平均值来估算缺失值。

均值填补缺失值

缺失值的迭代估算
另一个选项是sklearn.impute.IterativeImputer。 这使用循环线性回归,依次将缺少值的每个特征建模为其他特征的函数。 所实现的版本假定为高斯(输出)变量。 如果您的功能显然不正常,请考虑将其转换为看起来更正常,以潜在地提高性能。

绘制结果
最后,我们将可视化分数计算并输出:

如图,可以看出,插值填补后,经过分类器得到的MSE均大于原始数据集的MSE,尤其在Diabetes Data数据集上比较明显。

代码链接
https://gitee.com/youryouth/mc/tree/9ccdba810aa2cd6b4c90b60c644325941b616b11/sklearn/missing_data_imputer
参考原文:https://scikit-learn.org.cn/view/281.html