我们应该在工作流中的哪里处理丢失的数据?


16

我正在构建一个工作流,用于从一个非常大的数据库(这里是通过SQL和的Vertica)中提取的数据创建机器学习模型(在我的情况下,使用Python pandassklearn软件包)pyodbc,该过程中的关键步骤包括估算缺失预测值。在单个分析或统计平台(Python,R,Stata等)中,这很简单,但是我很好奇在多平台工作流程中该步骤的最佳位置。

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

我还没有找到很多指导,但是我想我们可以:

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

这是在Vertica / SQL中做的合理的事情,还是有充分的理由不打扰而只是在Python中处理它?如果是后者,是否有充分的理由在大熊猫而不是sklearn或相反的情况下这样做?谢谢!

Answers:


14

我对插补等自动化任务的强烈观点(但在这里我还可以包括缩放,居中,特征选择等),是避免以任何方式避免仔细检查您的数据。

当然,在决定采用哪种估算之后,它可以自动进行(假设新数据具有相同的形状/问题)。

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

之后,您需要了解哪种归因方法更适合给定任务的数据信息。正确地做起来往往比看起来难得多。

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


1
+1自动化并不一定会使事情变得更好,只能更加一致且通常更快!
詹姆斯

4

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.