缺失值处理

数据缺失的原因

缺失值的产生的原因多种多样,主要分为机械原因和人为原因。机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据


数据缺失的类型

将数据集中不含缺失值的变量称为 完全变量 ,数据集中含有缺失值的变量称为 不完全变量

完全随机缺失(MCAR)

指的是数据的缺失是随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性,如家庭地址缺失

随机缺失(MAR)

指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量,如财务数据缺失情况与企业的大小有关

非完全随机缺失(MNAR)

指的是数据的缺失依赖于不完全变量自身,如高收入人群不愿意提供家庭收入


数据缺失的处理方法

一、不处理

有一些模型自身能够处理数据缺失的情况(如随机森林、xgboost),在这种情况下不需要对缺失数据做任何的处理,这种做法的缺点是在模型的选择上有局限

二、删除

import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer
from sklearn.ensemble import RandomForestClassifier
df = pd.read_csv('person.csv')
df

删除有缺失数据的样本

df = pd.read_csv('person.csv')
df = df.dropna(how='any')
df

删除有过多缺失数据的特征

df = pd.read_csv('person.csv')
df = df.drop(['height','weight'], axis=1)
df

三、填充

固定值填充

df = pd.read_csv('person.csv')
df['sex'] = df['sex'].fillna('female')
df

均值填充

df = pd.read_csv('person.csv')
df['height'] = df['height'].fillna(df['height'].mean())
df

中位数填充

df = pd.read_csv('person.csv')
df['height'] = df['height'].fillna(df['height'].median())
df

众数填充

df = pd.read_csv('person.csv')
df['age'] = df['age'].fillna(df['age'].mode()[0]) # The mode is the value that appears most often
df

用上一个值填充

df = pd.read_csv('person.csv')
df['height'] = df['height'].ffill()
df

用下一个值填充

df = pd.read_csv('person.csv')
df['weight'] = df['weight'].bfill()
df

随机数填充

df = pd.read_csv('person.csv')
r = np.random.randint(2) % 2 # [0,2)
df['sex'] = df['sex'].fillna('female' if r == 1  else 'male')
df

插值法填充

使用插值法可以计算缺失值的估计值,所谓的插值法就是通过两点 (x0,y0)(x_0,y_0)(x0​,y0​) , (x1,y1)(x_1,y_1)(x1​,y1​) 估计中间点的值,假设 y=f(x)y=f(x)y=f(x) 是一条直线,通过已知的两点来计算函数 f(x)f(x)f(x) ,然后只要知道 xxx 就能求出 yyy ,以此方法来估计缺失值。当然我们也可以假设 f(x)f(x)f(x) 不是直线,而是其他函数

df = pd.read_csv('person.csv')
# 默认为线性插值,即在两个数据点之间连接直线,计算给定的插值点在直线上的值作为插值结果
df['age'] = df['age'].interpolate() # nan=(24+26)/2=25
df

KNN 填充

df = pd.read_csv('person.csv')
# 标签编码
df['sex'] = df['sex'].map({'female': 1,'male': 0})
df

# 可以使用交叉验证来选择k值
imputer = KNNImputer(n_neighbors=1) # 默认每个邻域中的所有点的权重均相等
df.iloc[:,1:] = imputer.fit_transform(df.iloc[:,1:])
df

建模预测

将缺失的属性作为预测目标来预测,将数据集按照是否含有特定属性的缺失值分为两类,利用现有的机器学习算法对预测数据集的缺失值进行预测。该方法的根本的缺陷是如果其他属性和缺失属性无关,则预测的结果毫无意义;但是若预测结果相当准确,则说明这个缺失属性是没必要纳入数据集中的;一般的情况是介于两者之间

下面的案例中将选择 sex 特征作为预测目标,采用随机森林进行拟合得到预测值,其他缺失特征采用均值进行填充

# 读入数据
df = pd.read_csv('person.csv')# 标签编码
df['sex'] = df['sex'].map({'female': 1,'male': 0})# 分离特征和标签
feature = df.iloc[:,2:]
df.iloc[:,2:] = feature.fillna(feature.mean()) # 其他缺失特征采用均值进行填充
feature = df.iloc[:,2:] # age height weight
label = df.iloc[:,1] # sexprint(feature)
print(label)

# 将sex非空划分为训练集
sex_is_null = df['sex'].isnull()
train_indices = sex_is_null == False
X_train = feature[train_indices]
y_train = label[train_indices]
# 将sex为空划分为测试集
X_test = feature[sex_is_null]print(X_train)
print(y_train)
print(X_test)

# 构建模型,训练并预测
rf = RandomForestClassifier(n_estimators=10, class_weight='balanced', random_state=1)
rf.fit(X_train, y_train)
predictions = rf.predict(X_test)
df.loc[sex_is_null,'sex'] = predictions
df

高维映射

将属性映射到高维空间,采用独热编码(one-hot)技术对属性进行编码。将包含 K 个离散取值范围的属性值扩展为 K+1 个属性值,若该属性值缺失,则扩展后的第 K+1 个属性值置为1。这种做法是最精确的做法,保留了所有的信息,也未添加任何额外信息,若预处理时把所有的变量都这样处理,会大大增加数据的维度。这样做的好处是完整保留了原始数据的全部信息,不用考虑缺失值;缺点是计算量大大提升,且只有在样本量非常大的时候效果才好

df = pd.read_csv('person.csv')
dummy_sex = pd.get_dummies(df['sex'], prefix='sex', dummy_na=True)
df = pd.concat([df, dummy_sex], axis=1)
df = df.drop('sex', axis=1)
df

热卡填充

对于一个包含空值的对象,热卡填充法(Hot deck imputation)在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计,但缺点在于难以定义相似标准,主观因素较多

极大似然估计

在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证极大似然估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂

多重插补

多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值


总结

当我们决定采用何种缺失值处理方式时,要综合考虑数据缺失的原因、数据缺失的类型、数据缺失的处理方法的特点、样本量等因素


本文到此结束,后续将会不断更新,如果发现上述有误,请各位大佬及时指正!如果觉得写得还可以,欢迎点赞收藏加关注,谢谢!

一文搞懂机器学习中的缺失值处理(超详细)相关推荐

  1. 一文读懂机器学习中奇异值分解SVD

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目录: 矩阵分解 1.1 矩阵分解作用 1.2 矩阵分解的方法一文 ...

  2. 一文读懂机器学习中的模型偏差

    一文读懂机器学习中的模型偏差 http://blog.sina.com.cn/s/blog_cfa68e330102yz2c.html 在人工智能(AI)和机器学习(ML)领域,将预测模型参与决策过程 ...

  3. 一文搞懂Qt中的颜色渐变(QGradient Class)

    一文搞懂Qt中的颜色渐变(QGradient Class) 1, 快速开始! Qt中与颜色渐变有关的类是QGradient 其中它又有三个子类:QLinearGradient.QRadialGradi ...

  4. 【机器学习基础】一文搞懂机器学习里的L1与L2正则化

    文章来源于SAMshare,作者flora 特征锦囊:今天一起搞懂机器学习里的L1与L2正则化 今天我们来讲讲一个理论知识,也是老生常谈的内容,在模型开发相关岗位中出场率较高的,那就是L1与L2正则化 ...

  5. 一文搞懂产品中的搜索设计

    搜索功能是我们日常生活中接触最多的功能之一,它更够很好的提高用户使用产品的效率,用户对搜索功能的依赖性也比较大,所以设计好搜索功能将会很大程度上提高用户体验.本文作者通过分享这篇文章,帮我们搞懂产品中 ...

  6. 原创 | 一文读懂机器学习中的shapley值方法

    作者:贾恩东本文约2000字,建议阅读9分钟本文为你介绍更公平分配利益权重的一种算法--Shapley值方法. 本篇文章是数据派一文读懂系列的新年第一篇原创,在这里祝贺大家新年学业有新成就,生活有新气 ...

  7. 独家 | 一文读懂机器学习中的贝叶斯统计学

    作者:Matthew Stewart, PhD Researcher 翻译:吴金笛 校对:丁楠雅 本文约4300字,建议阅读15分钟. 本文主要是向新手介绍贝叶斯方法并将其与频率方法进行比较. 你有没 ...

  8. 一文搞懂Java8中表示当前的时间类Date、Instant、LocalDateTime、ZonedDateTime

    1. 概述 Java8中的时间类主要有:Date.Instant.LocalDateTime(LocalDate.LocalTime).ZonedDateTime,除去Date,java.time包下 ...

  9. 一文看懂机器学习中的常用损失函数

    作者丨stephenDC 编辑丨zandy 来源 | 大数据与人工智能(ID: ai-big-data) 导语:损失函数虽然简单,却相当基础,可以看做是机器学习的一个组件.机器学习的其他组件,还包括激 ...

  10. 彻底搞懂机器学习中的正则化

    正则化在机器学习当中是十分常见的,本次就来比较完整地总结一下~ 首先列一下本篇文章所包含的内容目录,方便各位查找: LP范数 L1范数 L2范数 L1范数和L2范数的区别 Dropout Batch ...

最新文章

  1. 使用AzureFunction开发最简单的Teams Outgoing Webhook
  2. typeorm_Nestjs 热更新 + typeorm 配置
  3. OSGi环境中的Servlet基本身份验证
  4. Iverson Bracket. 艾弗森括号
  5. for相关 java_用java编写一个程序,求2到100之间的偶数和(使用for循环)
  6. 实现 Bootstrap 基本布局
  7. LinkedList线程安全问题
  8. Spring Batch 4.2.0.M1 发布,批处理应用编写框架
  9. 20190815 On Java8 第五章 控制流
  10. 自己实现memcpy/strcpy/strcmp/strcat/strlen/strstr
  11. UDS与DoIp整理
  12. Zemax 全新 22.1 版本产品现已发布
  13. 使用RNA-seq数据通过网络熵评估肿瘤内异质性
  14. stm32:时钟系统
  15. Docker-常用基础命令整理
  16. 若A、B为同阶矩阵且A、B均可逆,则AB亦可逆
  17. model.named_parameters()与model.parameters()
  18. SPH算法简介(一): 数学基础
  19. 【Mind+】APDS9960第三方用户库实现
  20. api-proxy-house(APH)使用说明

热门文章

  1. NetApp 数据存储解决方案:广泛的全闪存、混合闪存和对象存储系统产品组合
  2. 简单学生成绩分析系统
  3. wjh2005:GitHub 上有哪些完整的 iOS-App 源码值得参考?
  4. php 扑克牌洗牌算法,随机洗牌算法 | 学步园
  5. MOSFET的特性曲线及特性方程
  6. 教您在MathType输入三角形符号
  7. win8 计算机组策略,win8打开组策略提示“无法找到组策略”的原因及解决措施
  8. 观李永乐老师讲音律有感——《管子·地员》之“三分损益法”的探究
  9. LDO稳压芯片-内部框图及选型参数
  10. DNk开发步骤与环境配置