01填补缺失数据

Python Feature Engineering Cookbook 填补缺失数据

缺失数据(即某些观测值缺失)是大多数数据源中不可避免的问题。一些机器学习模型实现可以立即处理缺失数据。要训练其他模型,我们必须删除缺失数据的观测值或将其转换为允许的值。

删除缺失数据的观测值

完整案例分析(Complete Case Analysis, CCA),也称为按列表删除案例,包括丢弃观察结果有缺失数据。CCA 可应用于分类变量和数值变量。使用 CCA,我们可以在插补后保留变量的分布,前提是数据随机缺失且只在一小部分观察值中缺失。但是,如果许多变量的数据缺失,CCA 可能会导致删除大部分数据集。

仅当缺少少量观测值且有充分理由相信它们对模型并不重要时才使用 CCA。

寻找极值进行插补

用变量分布末尾的值(极值)替换缺失值就像用任意值替换它们,但不是手动设置任意值,而是从变量分布的末尾自动选择值。

我们可以用大于或小于变量中大多数值的值替换缺失数据。要选择更大的值,我们可以使用平均值加上标准差的一个因子。或者,我们可以将其设置为 75% 分位数 + IQR × 1.5。IQR 代表四分位距,是 75% 分位数和 25% 分位数之间的差值。要用小于其余值的值替换缺失数据,我们可以使用平均值减去标准差的一个因子,或者 25% 分位数‑ IQR × 1.5。

尾部插补可能会扭曲原始变量的分布,因此可能不适合线性模型。

标记插补值

我们可以添加缺失指标来标记存在缺失值的观察值。缺失指标是一个二进制变量,其值为 1 或 True 表示某个值是否缺失,否则为 0 或 False。通常的做法是用平均值、中位数或最常见类别替换缺失的观测值,同时用缺失指标标记这些缺失的观测值。

前向填充和后向填充

时间序列数据也显示缺失值。为了填补时间序列中的缺失数据,我们使用特定的方法。前向填充填补涉及使用数据序列中位于其前面的最新非缺失值填充数据集中的缺失值。换句话说,我们将最后看到的值向前推进到下一个有效值。后向填充填补涉及使用数据序列中位于其后面的下一个非缺失值填充缺失值。换句话说,我们将最后一个有效值向后推进到其前一个有效值。

执行插值

我们可以通过在两个非缺失数据点之间进行插值来填补时间序列中的缺失数据。插值是通过函数估计某个范围内的一个或多个值。在线性插值中,我们在最后一个观测值和下一个有效点之间拟合一个线性函数。

在样条插值中,我们在最后一个观测值和下一个观测值之间拟合一个低次多项式。使用插值的想法是为了对缺失数据进行更好的估计。

尽管与前向填充和后向填充相比,插值旨在对缺失数据进行更好的估计,但如果时间序列显示出强烈的趋势和季节性,这些估计可能仍然不准确。

通过链式方程进行多元插补

与单变量插补相反,多元插补方法使用多个变量来估计缺失值。链式方程多元插补 (Multivariate Imputation by Chained Equations, MICE) 将每个具有缺失值的变量建模为数据集中其余变量的函数。该函数的输出用于替换缺失数据。

MICE 涉及以下步骤:

  1. 首先,它对每个有缺失数据的变量进行简单的单变量插补。例如,中位数插补;
  2. 接下来,它选择一个特定的变量,比如 var_1,并将缺失值设置回缺失;
  3. 它训练模型使用其他变量作为输入特征来预测 var_1
  4. 最后,用模型的输出替换 var_1 的缺失值。

MICE 对剩余的每个变量重复步骤 2 到 4。一旦所有变量都已建模,一个归纳循环就结束了。MICE 会进行多个归纳循环,通常为 10 个。也就是说,我们对每个变量重复 10 次步骤 2 到 4。这样做的目的是,到循环结束时,我们应该已经找到了每个变量缺失数据的最佳估计值。

IterativeImputer() 只能基于数值变量估算数值变量中的缺失数据。如果要使用分类变量作为输入,则需要先对其进行编码。但是,请记住,它只会进行回归。因此,它不适合估计离散或分类变量中的缺失数据。

posted @ 2025-01-25 15:06  JPL-JUNO  阅读(76)  评论(0)    收藏  举报