机器学习中缺失值处理

当我们拿到一批数据的时候,往往都是“不干净”的,而缺失值是最常见也是最容易发现的。不同的缺失值处理方式对接下来的特征提取,建模等都有巨大影响。那么缺失值的处理是有一套流程的,我在这里总结总结:

发现缺失值

  1. 统计每个特征在所有个体中缺失的个数 / 缺失率
    这一点是查找缺失的特征 
    pandas 中 count() 函数为不为空数据的个数,那么将shape与count做差就得到缺失个数,缺失率。

missing

  1. 对于每个个体所缺失的特征个数
    这一点是查找缺失的个体 
    这个简单,对数据 df 转置一下即可
  1. pandas 其他缺失值函数
方法 说明
dropna 根据各标签的值中是否存在缺失数据对轴标签进行过滤, 可通过阀值调节对缺失值的容忍度
fillna 用指定值或插值方法(如ffill或bfill)填充缺失值
isnull 返回一个含有bool型的对象, 这些bool型值表示哪些是缺失值NaN, 该对象的类型与源类型一样
notnull isnull的否定式
  1. 隐藏的缺失值
    这里要理解数据集内容的含义,比如在某些情况下,0代表缺失值。因为有些值为0的变量是无意义的,可以表示为缺失值。例如:身高、体重等。

缺失机制

在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量(属性)称为完全变量,数据集中含有缺失值的变量称为不完全变量,Little 和 Rubin定义了以下三种不同的数据缺失机制:

  1. 完全随机缺失(Missing Completely at Random,MCAR)。数据的缺失与不完全变量以及完全变量都是无关的。

  2. 随机缺失(Missing at Random,MAR)。数据的缺失仅仅依赖于完全变量。

  3. 非随机、不可忽略缺失(Not Missing at Random,NMAR,or nonignorable)。不完全变量中数据的缺失依赖于不完全变量本身,这种缺失是不可忽略的。

从缺失值的所属属性上讲,如果所有的缺失值都是同一属性,那么这种缺失成为单值缺失,如果缺失值属于不同的属性,称为任意缺失。另外对于时间序列类的数据,可能存在随着时间的缺失,这种缺失称为单调缺失。

空值语义

对于某个对象的属性值未知的情况,我们称它在该属性的取值为空值(null value)。空值的来源有许多种,因此现实世界中的空值语义也比较复杂。总的说来,可以把空值分成以下三类:

  1. 不存在型空值。即无法填入的值,或称对象在该属性上无法取值,如一个未婚者的配偶姓名等。
  2. 存在型空值。即对象在该属性上取值是存在的,但暂时无法知道。一旦对象在该属性上的实际值被确知以后,人们就可以用相应的实际值来取代原来的空值,使信息趋于完全。存在型空值是不确定性的一种表征,该类空值的实际值在当前是未知的。但它有确定性的一面,诸如它的实际值确实存在,总是落在一个人们可以确定的区间内。一般情况下,空值是指存在型空值。
  3. 占位型空值。即无法确定是不存在型空值还是存在型空值,这要随着时间的推移才能够清楚,是最不确定的一类。这种空值除填充空位外,并不代表任何其他信息。

判断缺失值的重要性

对于包含有缺失值处理的算法,比如XGB或者LGB,我们可以简单的直接把训练数据扔到模型中训练,查看feature_importance。(由于XGB等属于树模型,不需要太多的数据预处理过程,比如归一化等,也能取得较好的效果,且模型参数对特征的重要性程度影响不是很大,我们只需要知道大概的结果,哪些重要,哪些不重要即可)

缺失值较多且不重要的特征

这些特征我们看情况,可以尝试着直接删除,如果不删除,缺失值又多,处理不好,可能会引来噪声。
至于为什么看情况呢,意思是,做个对比试验,一组是删除的,另一组是没删除的,进行交叉验证,如果删除后的结果比较好,那么就进行删除。

缺失值较少的特征

统计量填充

这一类特征,我们可以简单使用统计量比如:均值、中位数、众数 进行填充;
对于连续值,推荐使用 中位数 ,可以排除一些特别大或者特别小的异常值造成的影响;
对于离散值,推荐使用 众数 ,均值和中位数用不了吧,那就用众数好了。。。

特殊值填充

我们可以填一个不在正常取值范围内的数值,比如 -999 ,0 等来表示缺失值。

不处理

大家可能都有一个疑惑,为什么对很多人说XGB或者LGB对缺失值不敏感呢,当用缺失值的训练XGB时,算法不会报错,其实这个不能叫不敏感,而是算法本身自己有一套缺失值处理算法,比如XGB,它会把含有缺失值的数据分别分到左右两个子节点,然后计算着两种情况的损失,最后,选取较好的划分结果和对应的损失。XGB缺失值具体算法可以参考我之前的文章XGBoost笔记。
所以,如果遇到有缺失值的情况,最好还是根据缺失的情况,自己处理比较好。

分类别填充

我们还可以根据label的类别,取值范围进行更高级的统计量填充(当然这个只适用于知道label的训练集),即取在该label下数据的中位数、均值等进行填充。

插值填充

使用线性,多项式等差值方法,对于时间序列的缺失问题,可以使用此方法。

插值填充

插补法

  1. 随机插补法----从总体中随机抽取某个样本代替缺失样本
  2. 多重插补法----通过变量之间的关系对缺失数据进行预测,利用蒙特卡洛方法生成多个完整的数据集,在对这些数据集进行分析,最后对分析结果进行汇总处理
  3. 热平台插补----指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补
    优点:简单易行,准去率较高
    缺点:变量数量较多时,通常很难找到与需要插补样本完全相同的样本。但我们可以按照某些变量将数据分层,在层中对缺失值实用均值插补
  4. 拉格朗日差值法和牛顿插值法

用预测值填充

将缺失的数据当成label,没缺失的作为训练集,缺失的作为测试集,通过某种机器学习算法进行预测,填补缺失值。下面代码以lgb为例:

缺失值比较多的样本

当样本很多的时候,而缺失值比较多的样本,且它们数目不多时,直接删掉。

###########################

插补数据vs删除数据

在讨论数据插补方法之前,我们必须了解数据丢失的原因。

1、随机丢失(MAR,Missing at Random):随机丢失意味着数据丢失的概率与丢失的数据本身无关,而仅与部分已观测到的数据有关。

2、完全随机丢失(MCAR,Missing Completely at Random):数据丢失的概率与其假设值以及其他变量值都完全无关。

3、非随机丢失(MNAR,Missing not at Random):有两种可能的情况。缺失值取决于其假设值(例如,高收入人群通常不希望在调查中透露他们的收入);或者,缺失值取决于其他变量值(假设女性通常不想透露她们的年龄,则这里年龄变量缺失值受性别变量的影响)。

在前两种情况下可以根据其出现情况删除缺失值的数据,而在第三种情况下,删除包含缺失值的数据可能会导致模型出现偏差。因此我们需要对删除数据非常谨慎。请注意,插补数据并不一定能提供更好的结果。

删除

列表删除

按列表删除(完整案例分析)会删除一行观测值,只要其包含至少一个缺失数据。你可能只需要直接删除这些观测值,分析就会很好做,尤其是当缺失数据只占总数据很小一部分的时候。然而在大多数情况下,这种删除方法并不好用。因为完全随机缺失(MCAR)的假设通常很难被满足。因此本删除方法会造成有偏差的参数与估计。

newdata <- na.omit(mydata)

# In python

mydata.dropna(inplace=True)

成对删除

在重要变量存在的情况下,成对删除只会删除相对不重要的变量行。这样可以尽可能保证充足的数据。该方法的优势在于它能够帮助增强分析效果,但是它也有许多不足。它假设缺失数据服从完全随机丢失(MCAR)。如果你使用此方法,最终模型的不同部分就会得到不同数量的观测值,从而使得模型解释非常困难。

观测行3与4将被用于计算ageNa与DV1的协方差;观测行2、3与4将被用于计算DV1与DV2的协方差。

#Pairwise Deletion

ncovMatrix <- cov(mydata, use="pairwise.complete.obs")

#Listwise Deletion

ncovMatrix <- cov(mydata, use="complete.obs")

删除变量

在我看来,保留数据总是比抛弃数据更好。有时,如果超过60%的观测数据缺失,直接删除该变量也可以,但前提是该变量无关紧要。话虽如此,插补数据总是比直接丢弃变量好一些。

df <- subset(mydata, select = -c(x,z) )

df <- mydata[ -c(1,3:4) ]

In python

del mydata.column_name

mydata.drop('column_name', axis=1, inplace=True)

Time-Series Specific Methods

时间序列分析专属方法

前推法(LOCF,Last Observation Carried Forward,将每个缺失值替换为缺失之前的最后一次观测值)与后推法(NOCB,Next Observation Carried Backward,与LOCF方向相反——使用缺失值后面的观测值进行填补)

这是分析可能缺少后续观测值的纵向重复测量数据的常用方法。纵向数据在不同时间点跟踪同一样本。当数据具有明显的趋势时,这两种方法都可能在分析中引入偏差,表现不佳。

线性插值。此方法适用于具有某些趋势但并非季节性数据的时间序列。

季节性调整+线性插值。此方法适用于具有趋势与季节性的数据。

季节性+插值法

线性插值法

LOCF插补法

均值插补法

注:以上数据来自imputeTS库的tsAirgap;插补数据被标红。

library(imputeTS)

na.random(mydata) # Random Imputation

na.locf(mydata, option = "locf") # Last Obs. Carried Forward

na.locf(mydata, option = "nocb") # Next Obs. Carried Backward

na.interpolation(mydata) # Linear Interpolation

na.seadec(mydata, algorithm = "interpolation") # Seasonal Adjustment then Linear Interpolation

均值,中位数与众数

计算整体均值、中位数或众数是一种非常基本的插补方法,它是唯一没有利用时间序列特征或变量关系的测试函数。该方法计算起来非常快速,但它也有明显的缺点。其中一个缺点就是,均值插补会减少数据的变化差异(方差)。

library(imputeTS)

na.mean(mydata, option = "mean") # Mean Imputation

na.mean(mydata, option = "median") # Median Imputation

na.mean(mydata, option = "mode") # Mode Imputation

In Python

from sklearn.preprocessing importImputer

values = mydata.values

imputer = Imputer(missing_values=’NaN’, strategy=’mean’)

transformed_values = imputer.fit_transform(values)

# strategy can be changed to "median"and “most_frequent”

线性回归

首先,使用相关系数矩阵能够选出一些缺失数据变量的预测变量。从中选择最靠谱的预测变量,并将其用于回归方程中的自变量。缺失数据的变量则被用于因变量。自变量数据完整的那些观测行被用于生成回归方程;其后,该方程则被用于预测缺失的数据点。在迭代过程中,我们插入缺失数据变量的值,再使用所有数据行来预测因变量。重复这些步骤,直到上一步与这一步的预测值几乎没有什么差别,也即收敛。

该方法“理论上”提供了缺失数据的良好估计。然而,它有几个缺点可能比优点还值得关注。首先,因为替换值是根据其他变量预测的,他们倾向于“过好”地组合在一起,因此标准差会被缩小。我们还必须假设回归用到的变量之间存在线性关系——而实际上他们之间可能并不存在这样的关系。

多重插补

1、插补:将不完整数据集缺失的观测行估算填充m次(图中m=3)。请注意,填充值是从某种分布中提取的。模拟随机抽取并不包含模型参数的不确定性。更好的方法是采用马尔科夫链蒙特卡洛模拟(MCMC,Markov Chain Monte Carlo Simulation)。这一步骤将生成m个完整的数据集。

2、分析:分别对(m个)每一个完整数据集进行分析。

3、合并:将m个分析结果整合为最终结果。

来源:

http://www.stefvanbuuren.nl/publications/mice%20in%20r%20-%20draft.pdf

# We will be usingmice library in r

library(mice)

# Deterministic regression imputation via mice

imp <- mice(mydata, method = "norm.predict", m = 1)

# Store data

data_imp <- complete(imp)

# Multiple Imputation

imp <- mice(mydata, m = 5)

#build predictive model

fit <- with(data = imp, lm(y ~ x + z))

#combine results of all 5 models

combine <- pool(fit)

这是迄今为止最优选的插补方法,因为它非常易于使用,并且在插补模型正确的情况下它不会引入偏差。

分类变量插补

1、众数插补法算是一个法子,但它肯定会引入偏差。

2、缺失值可以被视为一个单独的分类类别。我们可以为它们创建一个新类别并使用它们。这是最简单的方法了。

3、预测模型:这里我们创建一个预测模型来估算用来替代缺失数据位置的值。这种情况下,我们将数据集分为两组:一组剔除缺少数据的变量(训练组),而另一组则包括缺失变量(测试组)。我们可以用逻辑回归和ANOVA等方法来进行预测。

4、多重插补法。

KNN(K近邻)

能够用于数据插补的机器学习方法有很多,比如XGBoost与Random Forest,但在这里我们讨论KNN方法,因为它被广泛应用。在本方法中,我们根据某种距离度量选择出k个“邻居”,他们的均值就被用于插补缺失数据。这个方法要求我们选择k的值(最近邻居的数量),以及距离度量。KNN既可以预测离散属性(k近邻中最常见的值)也可以预测连续属性(k近邻的均值)。

根据数据类型的不同,距离度量也不尽相同:

1、连续数据:最常用的距离度量有欧氏距离,曼哈顿距离以及余弦距离。

2、分类数据:汉明(Hamming)距离在这种情况比较常用。对于所有分类属性的取值,如果两个数据点的值不同,则距离加一。汉明距离实际上与属性间不同取值的数量一致。

KNN算法最吸引人的特点之一在于,它易于理解也易于实现。其非参数的特性在某些数据非常“不寻常”的情况下非常有优势。

KNN算法的一个明显缺点是,在分析大型数据集时会变得非常耗时,因为它会在整个数据集中搜索相似数据点。此外,在高维数据集中,最近与最远邻居之间的差别非常小,因此KNN的准确性会降低。

library(DMwR)

knnOutput <- knnImputation(mydata)

In python

from fancyimpute importKNN

# Use 5nearest rows which have a feature to fill in each row's missing features

knnOutput = KNN(k=5).complete(mydata)

在上述方法中,多重插补与KNN最为广泛使用,而由于前者更为简单,因此其通常更受青睐。

参考资料

缺失值的处理 
机器学习中如何处理缺失数据? 
缺失数据

机器学习中缺失值处理相关推荐

  1. 【机器学习】机器学习中缺失值处理方法大全(附代码)

    今天我们来看看数据预处理中一个有趣的问题:数据清理中,如何处理缺失值.在我们探讨问题之前,我们一起回顾一些基本术语,帮助我们了解为什么需要关注缺失值. 目录 数据清洗简介 填补缺失值的重要性 缺失值导 ...

  2. 机器学习中缺失值处理方法大全(附代码)

    今天我们来看看数据预处理中一个有趣的问题:如何处理缺失值.在我们探讨问题之前,我们一起回顾一些基本术语,帮助我们了解为什么需要关注缺失值.本文内容较长,建议收藏后学习,喜欢点赞支持一下. 目录 数据清 ...

  3. 独家 | 在机器学习中利用统计插补来处理缺失值(附代码)

    作者:Jason Brownlee 翻译:吴振东 校对:冯羽 本文约4500字,建议阅读10分钟 本文以病马数据集为例,帮助你了解在机器学习领域如何利用统计策略来处理缺失值,对代码进行了较为详细的讲解 ...

  4. 机器学习中处理缺失值的7种方法

    机器学习中处理缺失值的7种方法 转载 |  https://cloud.tencent.com/developer/article/1680427 作者 | Satyam Kumar 编译 | VK ...

  5. 机器学习中如何处理缺失数据(NAN和Ifo)?

    机器学习中如何处理缺失数据(NAN)? 文章目录: 一.NAN 和 Inf 二.机器学习中空值的处理方法 一.NAN 和 Inf NAN(Not A number):意思:不是一个数字,是一个空值 I ...

  6. 从重采样到数据合成:如何处理机器学习中的不平衡分类问题?

    从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 2017-03-19 13:17 来源:机器之心 技术 原标题:从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 选自Analytic ...

  7. 从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 转载 2017年08月01日 17:09:03 标签: 机器学习 / 数据 719 转自:http://www.sohu.com/a/12

    从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 转载 2017年08月01日 17:09:03 标签: 机器学习 / 数据 719 转自:http://www.sohu.com/a/1293 ...

  8. 机器学习中一阶段网络是啥_机器学习项目的各个阶段

    机器学习中一阶段网络是啥 Many businesses and organizations are turning to machine learning for solutions to chal ...

  9. 机器学习集群_机器学习中的多合一集群技术在无监督学习中应该了解

    机器学习集群 Clustering algorithms are a powerful technique for machine learning on unsupervised data. The ...

最新文章

  1. jquery隐藏表格行
  2. mysql like reverse_mysql 优化like查询
  3. AjaxFileUpload 方法与原理分析
  4. vim傻瓜式配置 + git clone的速度慢到难以忍受问题的解决方法~
  5. Magento 2数据库EAV模型结构
  6. SVM 训练--在训练集上acc为94% 在测试集上为70%
  7. Java设计文本编辑器
  8. VGG16和VGG19的理解
  9. 大数据可视化技术:可视化技术概述与Echarts入门
  10. 关于NdFeB样品的测量阶段总结
  11. 《大数据原理:复杂信息的准备、共享和分析》一一1.3 自动编码 格物致知。...
  12. 如何正确使用关键路径图?
  13. 树莓派安装nexmon固件补丁步骤
  14. 拉勾网职位数据爬取与分析(一)
  15. python代码雨教程-python实例代码
  16. comfort说明书 tp1200_西门子TP1200COMfort用什么编程软件
  17. 【DP专辑】ACM动态规划总结
  18. 网站建设如何做好页面布局合理
  19. 室内定位解决方案需要满足的7个需求
  20. QlikView图表显示同比数据

热门文章

  1. 乡村振兴大数据平台架构方案(附下载)
  2. 2022年奶制品行业现状
  3. 利用爬虫对《青春有你2》选手信息爬取
  4. GUI自动测试化工具 Ranorex Studio 使用介绍
  5. 计算机视觉系列-轻松掌握 MMDetection 中 全景分割算法 MaskFormer(一)
  6. 码云 + Hexo 搭建个人博客
  7. 仿微信悬浮窗,可缩放悬浮窗,支持自定义展开布局
  8. Win10设置电脑定时关机
  9. 九思OA的十大技术特色
  10. php快手小程序微信H5支付