在机器学习中处理缺失数据的方法

数据中包含缺失值表示我们现实世界中的数据是混乱的。可能产生的原因有:数据录入过程中的人为错误,传感器读数不正确以及数据处理管道中的软件bug等。

一般来说这是令人沮丧的事情。缺少数据可能是代码中最常见的错误来源,也是大部分进行异常处理的原因。如果你删除它们,可能会大大减少可用的数据量,而在机器学习中数据不足的是最糟糕的情况。

但是,在缺少数据点的情况下,通常还存在隐藏的模式。它们可以提供有助于解决你正尝试解决问题的更多信息。

我们对待数据中的缺失值就如同对待音乐中的停顿一样 – 表面上它可能被认为是负面的(不提供任何信息),但其内部隐藏着巨大的潜力。

方法

注意:我们将使用Python和人口普查数据集(针对本教程的目的进行修改)

你可能会惊讶地发现处理缺失数据的方法非常多。这证明了这一问题的重要性,也这证明创造性解决问题的潜力很大。

你要做的第一件事是统计你有多少人,并试着想象他们的分布。为了使这一步正常工作,你应该手动检查数据(或者至少检查它的一个子集),以确定它们是如何被指定的(即确定它们是何种缺失)。可能的情况有哦:“NaN”,“NA”,“None”,“ ”,“?”等等。如果除了NaN以外,你应该使用np.nan来标准化它们。为了可视化,我们在这里使用missingno包。

import missingno as msno
msno.matrix(census_data)

缺失数据的可视化 白色的地方表示NA的字段

import pandas as pd
census_data.isnull().sum()
age                325
workclass         2143
fnlwgt             325
education          325
education.num      325
marital.status     325
occupation        2151
relationship       326
race               326
sex                326
capital.gain       326
capital.loss       326
hours.per.week     326
native.country     906
income             326
dtype: int64

我们从最简单的事情开始:删除。正如前面提到的,虽然这是一个快速的解决方案。但是,除非你的缺失值的比例相对较低(<10%),否则,在大多数情况下,删除会使你损失大量的数据。想象一下,仅仅因为你的某个特征中缺少值,你就要删除整个观察记录,即使其余的特征都完全填充并且包含大量的信息!

import numpy as np
census_data = census_data.replace('np.nan', 0)

第二糟糕的方法是用0(或-1)替换。虽然这能够帮助你顺利运行模型,但这种方法可能非常危险的。原因是有时候这个价可能会让人产生误解。设想在回归问题中出现负值(如预测温度),在这种情况下,这个值会成为一个实际的数据点。

现在我们已经有了这些,让我们变得更有创意。我们可以按其父数据类型拆分缺失值的类型:

数字NaN

一个标准的,通常非常好的方法是用均值,中位数或众数替换缺失值。对于数值,一半来说你应该使用平均值。如果有一些离群值的话,可以试试使用中位数(因为中位数对离群值的不那么敏感)。

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values=np.nan, strategy='median', axis=0)
census_data[['fnlwgt']] = imputer.fit_transform(census_data[['fnlwgt']])

分类NaN

分类值可能比较麻烦,所以在编辑之后,你一定要注意模型性能指标(比较之前和之后看看是否有异常情况)。标准的做法是用最常见的条目替换缺失的条目:

census_data['marital.status'].value_counts()
Married-civ-spouse       14808
Never-married            10590
Divorced                  4406
Separated                 1017
Widowed                    979
Married-spouse-absent      413
Married-AF-spouse           23
Name: marital.status, dtype: int64
def replace_most_common(x):
    if pd.isnull(x):
        return most_common
    else:
        return x
census_data = census_data['marital.status'].map(replace_most_common)

结论

我想要表达的关键是,你需要寻找到不同的方法从缺失的数据中获得更多的信息,更重要的是培养你洞察力的机会,而不是烦恼。要快乐的编程。

高级方法和可视化

你可以理论上通过拟合一个回归模型(比如线性回归或kNN算法)来估算缺失值。剩下的实现是留给读者的示例。

kNN可视化示例

下面是一些能在missingno包中找到的可视化的图像,它可以以相关矩阵或树状图的方式帮助你了解缺失值之间的关系:

缺失值的相关矩阵 经常同时缺失的值可以帮助你解决问题

缺失值的树状图

或者,你也可以考虑选择一个处理缺失值的算法(例如,Boosting算法)。

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2017-12-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏量子位

有记忆会推理的可微分神经计算机,DeepMind现在开源了代码

王新民 编译自 GitHub 量子位 报道 | 公众号 QbitAI ? 去年10月,Google旗下DeepMind在《Nature》上发布第三篇论文,宣布搞...

3386
来自专栏机器学习算法与Python学习

5月,机器学习开源新项目Top-10

1254
来自专栏IT派

从Brain.js到Mind,一文收录11个移动端Javascript机器学习库

当我第一次和我们的 NLP 主要研究人员谈起这个概念时,她的原话是这样的。可能她是对的,但它也是一个非常有趣的概念,最近在 Javascript 领域得到了越来...

740
来自专栏机器之心

资源 | 从Brain.js到Mind,一文收录11个移动端Javascript机器学习库

选自blog.bitsrc.io 作者:Jonathan Saring 机器之心编译 参与:程耀彤、黄小天 本文作者在构建 Bit 的过程中探索和尝试了把 Ja...

3436
来自专栏机器学习算法与Python学习

超参数优化,这些策略了解一下!

当然,并非所有变量对模型的学习过程都一样重要,但是,鉴于这种额外的复杂性,在这样一个高维空间中找到这些变量的最佳配置显然是一个不小的挑战。

933
来自专栏AI科技大本营的专栏

手动特征工程已经OUT了!自动特征工程才是改进机器学习的方式

【导读】近年来,我们在自动模型选择和超参数调优方面取得了进展,但机器学习流程中最重要的方面-- 特征工程,在很大程度上被我们所忽略。在本文中,我们将使用 Fea...

1163
来自专栏大数据文摘

资源 | 吴恩达斯坦福CS230深度学习课程补充资料放出

还记的吴恩达在斯坦福最新的深度学习课程么?那是继deeplearning.ai深度学习专项课程之后吴恩达的又一神作。

550
来自专栏ATYUN订阅号

使用深度学习训练聊天机器人与人对话

聊天机器人是“通过听觉或文本方法进行对话的计算机程序”,苹果的Siri, 微软的Cortana, 谷歌助手和亚马逊的Alexa是当下最流行的四种会话代理,它们能...

41810
来自专栏AI科技评论

谷歌机器学习白皮书全解析 43条黄金法则(三)

AI科技评论按:此白皮书为谷歌总结的机器学习(ML)最优实践方法,浓缩了其多年技术积累与经验,尤其是 YouTube、Google Play 和 Google+...

3758
来自专栏ATYUN订阅号

2018年8月机器学习Github开源项目TOP 10

在此期间,我们将项目与新的或主要版本进行了比较。Mybridge AI根据各种因素对项目进行排名,以衡量专业人员的质量。

1026

扫码关注云+社区