算法工程师-机器学习模型(处理缺失值)
title: 机器学习模型–处理缺失值
tags: python,机器学习
grammar_cjkRuby: true
现实生活中的数据集中的样本通常在某系属性上是缺失的,如果属性值缺失的样本数量比较少,我们可以直接简单粗暴的把不完备的样本删除掉,但是如果有大量的样本都有属性值的缺失,那么就不能简单地删除,因为这样删除了大量的样本,对于机器学习模型而言损失了大量有用的信息,训练出来的模型性能会受到影响。数据集如下(数据集来自周志华《机器学习》)
1. 决策树处理缺失值
参考来源:http://blog.csdn.net/u012328159/article/details/79413610
在决策树中处理含有缺失值的样本的时候,需要解决两个问题:
- 如何数据缺失的情况下进行增益计算?(比如“色泽”属性有的样本在该属性上的值是缺失的,那么该如何计算“色泽”的信息增益?)
- 若样本在该属性上的值是缺失的,那么该如何对这个样本进行划分?(即到底把这个样本划分到哪个结点里?)
具体处理情况如下
- 之后子树分裂时,仍然会把权重乘进去
- 注意:训练核测试数据的处理方式时不同的,决策要用到缺失变量,决策树也可以在当前节点做多数投票来决定(选择样本数最多的特征值方向)
- 如果有单独的缺失分支,使用此分支。
- 把待分类的样本的属性a值分配一个最常出现的a的属性值,然后进行分支预测
- 根据其他属性为该待分类样本填充一个属性a值,然后进行分支处理
- 在决策树中属性a节点的分支上,遍历属性a节点的所有分支,探索可能所有的分类结果,然后把这些分类结果结合起来一起考虑,按照概率决定一个分类
- 待分类样本在到达属性a节点时就终止分类,然后根据此时a节点所覆盖的叶子节点类别状况为其分配一个发生概率最高的类
2 XGBoost处理缺失值
XGBoost模型却能够处理缺失值,也就是说模型允许缺失值存在。XGBoost处理缺失值的方法和其他树模型不同。根据原文中的介绍,XGBoost把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。
3 随机森林处理缺失值
- 方法1(快速简单但效果差):
把数值型变量中的缺失值用其所对应的类别中的中位数替换。描述型变量缺失的部分用所对应类别中出现最多的数值替代。 - 方法2(耗时费力但效果好):
虽然依然是便用中位数出现次数最多的数来进行替换,方法2引入了权重。即对需要替换的数据先和其他数据做相似度测量(proximity measurement)也就是下面公式中的Weight,在补全缺失点是相似的点的数据会有更高的权重W。以数值型变量为例:
4 什么样的模型对缺失值更敏感?
- 树模型对缺失值的敏感度低,大部分时候可以在数据缺失时使用。
- 涉及到距离度量时,如计算两个点之间的距离,缺失数据就变得比较重要。因为涉及到"距离"这个概念,那么缺失值处理不当就会导致效果很差,如K近邻算法(KNN)、支持向量机(SVM)。
- 线性模型的代价函数(loss function)往往涉及到距离(distance)的计算,计算预测值和真实值之间的差别,这容易导致对缺失值敏感.
- 神经网络的鲁棒强,对于缺失数据不是非常敏感,但一般没有那么多数据可供使用。
- 贝叶斯模型对于缺失数据也比较稳定,数据量很小的时候选贝叶斯模型。
总体来看,对于有缺失值的数据在经过缺失处理后:
- 数据量很小,朴素贝叶斯
- 数据量适中或者较大,用树横型,优先xgboost
- 数据量较大,也可以用神经网络
- 避免使用距离度量相关的模型,如KNN和SVM
5 XGBoost判断特征重要程度的三种指标
- weight - 该特征在所有树中被用作分割样本的特征的次数。
- gain - 在所有树中的平均增益。
- cover - 在树中使用该特征时的平均覆盖范围。(还不是特别明白)