缺失值插补

Beginner

This tutorial is from open-source community. Access the source code

简介

许多现实世界的数据集都包含缺失值,当使用假设数据完整且为数值型的机器学习算法时,这些缺失值可能会引发问题。在这种情况下,适当地处理缺失值以充分利用可用数据非常重要。一种常见的策略是插补,即根据数据的已知部分填充缺失值。

在本教程中,我们将探索使用 scikit-learn(Python 中一个流行的机器学习库)插补缺失值的不同策略。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会立即为你解决问题。

导入必要的模块

首先,我们需要从 scikit-learn 库中导入所需的模块。我们将使用SimpleImputer类进行单变量特征插补,使用IterativeImputer类进行多变量特征插补。

import numpy as np
from sklearn.impute import SimpleImputer, IterativeImputer

使用 SimpleImputer 进行单变量特征插补

SimpleImputer类提供了以单变量方式插补缺失值的基本策略。我们可以从不同的策略中进行选择,例如用常数值替换缺失值,或者使用每列的均值、中位数或最频繁值来插补缺失值。

让我们先考虑均值策略。我们将创建一个SimpleImputer实例,并在我们的数据上进行拟合,以学习插补策略。然后,我们可以使用transform方法根据学到的策略插补缺失值。

imp = SimpleImputer(strategy='mean')
X = [[1, 2], [np.nan, 3], [7, 6]]
imp.fit(X)
X_test = [[np.nan, 2], [6, np.nan], [7, 6]]
imputed_X_test = imp.transform(X_test)

使用 IterativeImputer 进行多变量特征插补

IterativeImputer类是一种用于插补缺失值的更高级方法。它将每个具有缺失值的特征建模为其他特征的函数,并使用该估计值进行插补。它会迭代地学习特征之间的关系,并根据这些关系插补缺失值。

imp = IterativeImputer()
X = [[1, 2], [3, 6], [4, 8], [np.nan, 3], [7, np.nan]]
imp.fit(X)
X_test = [[np.nan, 2], [6, np.nan], [np.nan, 6]]
imputed_X_test = imp.transform(X_test)

使用 KNNImputer 进行最近邻插补

KNNImputer类提供了使用 k 近邻方法填充缺失值的插补功能。它为每个有缺失值的样本找到最近邻,并根据邻居的值插补缺失的特征值。

from sklearn.impute import KNNImputer
nan = np.nan
X = [[1, 2, nan], [3, 4, 3], [nan, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2)
imputed_X = imputer.fit_transform(X)

保持特征数量不变

默认情况下,scikit-learn 插补器会删除仅包含缺失值的列。然而,在某些情况下,有必要保留空特征以保持数据的形状。我们可以通过将keep_empty_features参数设置为 True 来实现这一点。

imputer = SimpleImputer(keep_empty_features=True)
X = np.array([[np.nan, 1], [np.nan, 2], [np.nan, 3]])
imputed_X = imputer.fit_transform(X)

使用 MissingIndicator 标记插补值

MissingIndicator转换器对于指示数据集中缺失值的存在很有用。它可以与插补结合使用,以保留有关哪些值被插补的信息。此转换器返回一个二进制矩阵,指示数据集中缺失值的存在情况。

from sklearn.impute import MissingIndicator
X = np.array([[-1, -1, 1, 3], [4, -1, 0, -1], [8, -1, 1, 0]])
indicator = MissingIndicator()
mask_missing_values_only = indicator.fit_transform(X)

总结

在本教程中,我们学习了使用 scikit-learn 插补缺失值的不同策略。我们探讨了使用SimpleImputer进行单变量特征插补、使用IterativeImputer进行多变量特征插补、使用KNNImputer进行最近邻插补、保持特征数量不变以及使用MissingIndicator标记插补值。这些技术对于处理缺失数据以及确保机器学习算法能够应用于不完整数据集而言,都是非常有价值的工具。