开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天
一、本篇笔记重点内容:
- 缺失值填补方法
- 基于模型的缺失值填补
二、详细知识点介绍
缺失值的简单处理
均值填补
- 含有缺失值的数据没有携带完整的信息,但简单的删除会导致已有信息的丢失
- 保留现有的数据,并对缺失值进行填补,成为合适的选择
- 通常来讲,可使用均值、中位数和众数对缺失值进行填补
根据属性的不同类型,把含缺失值的属性进行缺失值填补
数值型:使用缺失值所在列的其他数据记录取值的均值、中位数进行填补
非数值型:使用同列其他数据记录取值次数最高的数值(众数)进行填补
均值填补一般用于数值型数据
gen_data.mean()
feature1 -0.891054
feature2 -0.054773
feature3 0.149065
dtype: float64
gen_data.fillna(gen_data.mean())
中位数填补
使用缺失值所在列的中位数填充缺失值所在的位置
众数填补
众数填补一般用于非数值型数据
插值填补
- 利用函数f(x)在某个区间的特定值,计算出特定的函数
- 在区间内的其他点上使用该函数的值作为f(x)的近似值
- 使用插值法的思路,我们可以用来处理数据缺失,计算缺失值的估计值
拉格朗日插值填补
使用Scipy库的interpolate模块实现拉格朗日插值
确定非缺失值的索引
找出含有缺失值列的其他值
调用lagrange函数得出拉格朗日插值多项式的系数
输入缺失值所在索引,返回对应的插值
线性插值填补
当n = 1时,拉格朗日插值退化为线性插值法
线性插值法也称为两点插值法
使用两个已知点x0和x1确定的直线来近似区间[x0, x1]中其他点的函数值
使用Pandas库的interpolate函数实现线性插值
参数使用默认值,相当于对缺失值所在位置的前后值求均值,进行填补
特殊值填补
- 把缺失值,空值等当作特殊的属性取值来处理,区别任何其他的属性取值
- 例如,将所有的缺失位置用None, unknown等来填充
- 这种方法可能会导致严重的数据偏离,无法准确表达原始数据的含义
在Pandas库中,np.nan作为缺失值的一种表示方式
含义是Not a Number,用来表明一个缺失的浮点型数值
还可以使用Python语言中的None这个单例对象来表示缺失值
None是一个Python对象,Pandas和Numpy库的数组不能随意使用
None只能在类型为object的数据结构中出现,来表示缺失值
基于模型的缺失值填补
- 基于模型的方法将含有缺失值的变量作为预测目标
- 将数据集中其他变量或其子集作为输入变量,通过变量的非缺失值构造训练集,训练分类或回归模型
- 使用构建的模型来预测相应变量的缺失值
线性回归
- 线性回归可以用来预测响应变量,那如何用来进行缺失值填充呢?
- 含有缺失值的属性作为因变量
- 其余的属性作为多维的自变量
- 建立二者之间的线性映射关系
- 求解映射函数的系数
线性回归填补和插值法的关系:
线性回归要求
拟合函数与原始数据的误差最小,是一种整体靠近,对局部性质没有要求
插值方法要求
在原有数据之间插入数值,插值函数必须经过所有的已知数据点
KNN算法
通过计算训练集样本与目标样本的相似性,“鼓励”每个样本与目标样本去匹配
根据给定条件,选择最适合的K个样本作为目标样本的“邻居”
相似性的度量有以下选择:
主要步骤:
计算距离:给定目标样本,计算它与训练集中每个样本的距离
寻找邻居:选择距离最近的K个训练集样本,作为目标样本的近邻
分类预测:根据近邻样本的所属类别,或者属性的取值来预测目标样本的类别或者属性取值
需要注意:
- 标准KNN算法对数据样本的K个邻居赋予相同的权重,并不合理
- 一般来说,距离越远的数据样本所能施加的影响就越小
- 需要对KNN一定的改进,比如让邻居的权重与距离成反比关系