我们应该在工作流程的哪个位置处理缺失数据?

数据挖掘 机器学习 Python 熊猫 scikit-学习
2021-09-26 01:14:55

我正在构建一个工作流,用于从一个非常大的数据库(这里是 Vertica 通过SQLpandas预测变量的值。这在单个分析或统计平台中很简单——无论是 Python、R、Stata 等——但我很好奇在多平台工作流中最好找到这一步。sklearnpyodbc

在 Python 中执行此操作非常简单,可以使用sklearn.preprocessing.Imputer类、使用pandas.DataFrame.fillna方法或手动(取决于所使用的插补方法的复杂性)。但由于我将在数亿条记录中使用数十或数百列,我想知道是否有更有效的方法可以提前通过 SQL 直接执行此操作。除了在像 Vertica 这样的分布式平台中执行此操作的潜在效率之外,这还有一个额外的好处,即允许我们创建一个自动化管道来构建“完整”版本的表,因此我们不需要填写新的集合每次我们想运行一个模型时从头开始的缺失值。

我还没有找到很多关于这个的指导,但我想我们可以:

  1. 为每个不完整的列创建一个替代值表(例如,平均值/中位数/众数,整体或按组)
  2. 将替换值表与原始表连接起来,为每一行和不完整的列分配一个替换值
  3. 使用一系列 case 语句来获取原始值(如果可用),否则使用替代值

这是在 Vertica/SQL 中做的合理的事情,还是有充分的理由不打扰而只在 Python 中处理它?如果是后者,是否有充分的理由在 pandas 而不是 sklearn 中执行此操作,反之亦然?谢谢!

2个回答

我对插补等自动化任务的强烈看法(但是,在这里我还可以包括缩放、居中、特征选择等)是在没有仔细检查数据的情况下以任何方式避免做这些事情。

当然,在决定应用哪种插补后,它可以自动化(假设新数据具有相同的形状/问题)。

因此,在任何事情之前,请做出明智的决定。我经常浪费时间试图自动化这些事情,破坏我的数据。我会给你一些例子: - 一个编码为 N/A 的市场,我错过了它并被认为是北美/美国 - 像 -999.0 这样的数字,因为数据生产者找不到更好的缺失数据替代品 - 像 0 这样的数字代表血压或体温,而不是丢失的数据(很难想象一个血压为零的活人) - 丢失数据的多个占位符,因为数据是从各种来源收集的

之后,您需要了解哪种插补更类似于给定任务的数据信息。这通常比看起来要难得多。

在所有这些事情之后,我的建议是将您的插补任务延迟到上层,在那里您有工具可以重现新数据并检查是否违反了新数据的假设(如果可能的话)。

Therriault,很高兴听到您在使用 Vertica!全面披露,我是那里的首席数据科学家:)。您描述的工作流程正是我经常遇到的,我坚信在任何 pyODBC 和 pandas 工作之前预处理数据库中的那些非常大的数据集。我建议通过基于文件的查询创建视图或表,以确保可重现的工作。祝你好运