【机器学习】缺失值的处理方法总结

news2024/11/17 2:54:20

目录:缺失值的处理

  • 一、总录
  • 二、引言
  • 三、数据缺失的原因
  • 四、数据缺失的类型
  • 五、数据缺失的处理方法
    • 5.1 删除记录
    • 5.2 数据填充
      • 5.2.1 替换缺失值
      • 5.2.2 拟合缺失值
      • 5.2.3 虚拟变量
    • 5.3 不处理
  • 六、实证演练
  • 七、小结

一、总录

在这里插入图片描述
在这里插入图片描述

二、引言

业界广泛流传这样一句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

若没有好的数据,那么训练得到的模型效果也不会有所提高,可见数据质量对于数据分析而言是十分重要的。当我们下载或是抓取所需的数据时,不可避免的会遇到一些缺失数据,那么对这些缺失数据该如何处理呢?

三、数据缺失的原因

在各种数据库中,属性值缺失的情况时有发生。造成数据缺失的原因是多方面的,小编认为主要可以分为以下两种:

  • 客观原因:有些信息暂时无法提取,如在短时间无法获得的临床检验结果;某些属性值本身不存在,如未婚者的配偶姓名;获取某些信息的代价太大;系统实时性能要求较高,要求在得到这些信息前做出决策。
  • 主观原因:数据在输入时由于人为因素被遗漏;被认为是无关紧要的信息。

总之,对于造成缺失值的原因,我们要明确一点:是因为工作人员疏忽造成的,还是数据本身就无法提取。只有明确数据缺失的原因,方能对症下药。

四、数据缺失的类型

明确两个概念:数据集中不含缺失值的变量称为完全变量,数据集中含有缺失值的变量称为不完全变量。从缺失的分布来看可以将缺失分为完全随机缺失随机缺失完全非随机缺失

  • 完全随机缺失:指数据的缺失是完全随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性。如家庭地址缺失。
  • 随机缺失:指数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量。如财务数据缺失,其与企业规模有关。
  • 非随机缺失:指的是数据的缺失与不完全变量自身的取值有关。如高收入人群不愿意提供家庭收入。

数据缺失的类型关乎我们如何去处理缺失数据。对于后两种情况,直接删除记录是不合适的。随机缺失可以通过已知变量对缺失值进行估计,而非随机缺失的非随机性目前还没有很好的解决办法。

五、数据缺失的处理方法

数据处理的方法又有哪些呢?

处理不完备的数据集主要分为以下三类:

  • 删除记录
  • 数据填充
  • 不处理

5.1 删除记录

该方法方便快捷,简单粗暴。但其牺牲了大量数据,可能会丢失许多隐藏重要信息,尤其是在缺失数据占比较大时,可能会直接导致数据的分布发生变化,导致得出错误的结论。该方法适用于缺失数据相对样本数据来说很少的情况。可以使用pandas中的dropna直接删除有缺失值的特征。

# 直接删除含有缺失值的行
df.dropna(how='any',axis = 0)  
df.dropna()  # 等价形式
# 直接删除含有缺失值的列
df.dropna(how='any',axis = 1) 
# 只删除全是缺失值的行
df.dropna(how = 'all')

5.2 数据填充

该方法是用一定值去填充空值,进而使数据完备。通常有以下三大类填充方法,分别为替换缺失值拟合缺失值虚拟变量

5.2.1 替换缺失值

(1)均值填充。将所有属性划分为数值属性和非数值属性,若空值是定量的,则按该属性在其他所有对象取值的均值中位数来填充;若空值是定性的,则用该属性在其他所有对象的众数来填充。此方法简单不够精准,可能会改变特征原有分布。

# 使用var1的均值/中位数对 NA进行填充
df['var1'].fillna(df['var1'].mean())
df['var1'].fillna(df['var1'].median())

(2)热卡填充。它的思想十分简单,即找一个与缺失值对象最相近的对象来进行填充。通常会找到不止一个相似对象,在所有匹配对象中没有最好的,而是从中随机挑选一个作为填充值。不同的问题可能会选用不同的标准来对相似进行判定,但定义相似标准较难,主观因素太多。

(3)K最近距离邻法。先根据欧氏距离相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。

(4)使用所有可能的值填充。该方法是用空缺属性值的所有可能的属性取值来填充,能得到较好的补齐效果。但当数据量较大、遗漏的属性值较多时,其计算代价较大。

5.2.2 拟合缺失值

(1)回归。基于完整的数据集,建立回归方程。对包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。但缺点是当变量不是线性相关或预测变量高度相关时会导致有偏差的估计。

(2)期望值最大化方法。这里利用到了EM算法,分为E步和M步两个步骤,E步在给定完全数据和前一次迭代所得到的参数估计的情况下计算完全数据对应的对数似然函数的条件期望,M步是用极大化对数似然函数以确定参数的值,并用于下一步的迭代。算法在E步和M步之间不断迭代直至收敛。但该方法的缺点是可能会陷入局部极值,而且收敛速度不快,计算较为复杂。

(3)多重插补方法。该方法来源于贝叶斯估计,主要分为以下三个步骤:第一,为每个空值产生一套可能的填补值,这些值反映了无响应模型的不确定性,每个值都被用来填补数据集中的缺失值,产生若干个完整数据集合;第二,每个填补数据集合都用针对完整数据集的统计方法进行统计分析;第三,对来自各个填补数据集的结果进行综合,产生最终的统计推断,这一推断考虑到了由于数据填补而产生的不确定性。该方法将空缺值视为随机样本,这样计算出来的统计推断可能受到空缺值的不确定性的影响。该方法的缺点是计算复杂。

(4)随机森林。这是很多竞赛中大家经常使用的一种办法,同样是将缺失值作为目标变量。某案例代码如下:

# 导入随机森林模块
from sklearn.ensemble import RandomForestRegressor
# 定义函数
def set_missing_ages(df):
    #把数值型特征都放到随机森林里面去
    age_df=df[['Age','Fare','Parch','SibSp','Pclass']]
    known_age = age_df[age_df.Age.notnull()].as_matrix()
    unknown_age = age_df[age_df.Age.isnull()].as_matrix()
    y=known_age[:,0]  # y是年龄,第一列数据
    x=known_age[:,1:]  # x是特征属性值,后面几列
    rfr=RandomForestRegressor(random_state=0,n_estimators=2000,n_jobs=-1)
    #根据已有数据去拟合随机森林模型
    rfr.fit(x,y)
    #预测缺失值
    predictedAges = rfr.predict(unknown_age[:,1:])
    #填补缺失值
    df.loc[(df.Age.isnull()),'Age'] = predictedAges
    
    return df,rfr

5.2.3 虚拟变量

虚拟变量是缺失值的一种衍生变量。具体做法是通过判断特征值是否有缺失值来定义一个新的二分类变量。比如,特征为A含有缺失值,我们衍生出一个新的特征B,如果A中特征值有缺失,那么相应的B中的值为1,如果A中特征值没有缺失,那么相应的B中的值为0。某案例代码如下:

# 复制该列数据到 CabinCat
data_train['CabinCat'] = data_train['Cabin'].copy()
# 设置虚拟变量
data_train.loc[ (data_train.CabinCat.notnull()), 'CabinCat' ] = "No"
data_train.loc[ (data_train.CabinCat.isnull()), 'CabinCat' ] = "Yes"
# 查看
data_train[['Cabin','CabinCat']].head(10)

5.3 不处理

前两类方法仅仅是用我们的主观估计值填补未知值,我们或多或少地改变了原始的数据集。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。另外,有一些模型本身就足以应对具有缺失值的数据,此时无需对数据进行处理,比如XGBoost等高级模型。

六、实证演练

以下通过一个案例来简单学习一下缺失值处理常用的几种方法:

import pandas as pd
# 导入数据集
df = pd.read_csv('Data.csv',encoding = 'gbk',na_values='Na')    #为空数据赋值
df.dtypes
# 对里程数进行处理
def f(x):
    if '$' in str(x):
        x = str(x).strip('$')
        x = str(x).replace(',','')
    else:
        x = str(x).replace(',','')
    return float(x)
df['Mileage'] = df['Mileage'].apply(f)
# 显示各变量缺失比例
df.apply(lambda x: sum(x.isnull())/len(x),axis= 0)
# 直接删除法——删除'Condition','Price','Mileage'三个变量含有缺失值的行
df.dropna(axis = 0,how='any',subset=['Condition','Price','Mileage'])
# 里程用均值填补
df.Mileage.fillna(df.Mileage.mean())
# 用众数填补
df.Exterior_Color.fillna(df.Exterior_Color.mode()[0]) 
# 婚姻状况使用众数填补,年龄使用均值填补,农户家庭人数使用中位数填补
df.fillna(value = {'Exterior_Color':df.Exterior_Color.mode()[0],'Mileage':df.Mileage.mean()})
# 虚拟变量法
df['Watch_Count1'] = df['Watch_Count'].copy()
df.loc[ (df.Watch_Count.notnull()), 'Watch_Count1' ] = "No"
df.loc[ (df.Watch_Count.isnull()), 'Watch_Count1' ] = "Yes"
df[['Watch_Count','Watch_Count1']].head(10)

七、小结

总的来说,大部分数据挖掘的预处理都会使用比较方便的方法来处理缺失值,比如均值法,但是效果上并一定好,因此还是需要根据不同的需要选择合适的方法,并没有万能方法。具体方法还是要从多方面考虑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java构造器2023021

构造器: 构造器是一个特殊的方法,用于创建实例时执行初始化。构造器是创建对象的重要途径(即使使用工厂模式、反射等方式创建对象,其实质依然是依赖于构造器),因此Java类必须包含一个或一个以上的构造器。 …

23种设计模式(十五)——适配器模式【接口隔离】

文章目录 意图什么时候使用适配器真实世界类比适配器模式的实现适配器模式的优缺点亦称:封装器模式、Wrapper、Adapter 意图 将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器。 什么时候使用适配器 1、系统需要使用现有的类,而这…

软件设计到底是什么?

软件设计是什么: 就是讨论要用什么技术实现功能?就是要考虑选择哪些框架和中间件?设计就是设计模式?设计就是Controller、Service加Model?…… 一百个程序员,就有一百种理解。若按照这些方式去了解“软件…

Java设计模式中状态模式介绍/状态模式怎么使用

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 6.6 状态模式 6.6.1定义 对有状态的对象,把复杂的"判断逻辑"提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变…

【C++】哈希表 | 闭散列 | 开散列 | unordered_map 和 unordered_set 的模拟实现

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉unordere…

Ubuntu20.04/22.04 安装 Arduino IDE 2.x

这周收到两片基于LGT8F328P LQFP32的Arduino Mini EVB, 机器上没有 Arduino 环境需要新安装, 正好感受一下新出的 Arduino IDE 2.x, 记录一下 Ubuntu 20.04/22.04 下安装 Arduino IDE 2.x 的过程. 下载解压 下载 访问 Arduino 的官网下载 https://www.arduino.cc/en/softwar…

2021-04-12

今天在练习自定义标题栏(Android初级开发(四)——补充3)的过程中遇到了隐藏系统自带标题栏的问题,现将几种去掉系统自带标题栏的方式做一总结。大体上可以分为两种方式,一种是修改xml文件(这种方…

第六层:继承

文章目录前情回顾继承继承的作用继承的基本语法继承方式公共继承保护继承私有继承继承中的对象模型继承中的构造和析构顺序继承中同名成员访问非静态成员静态成员多继承语法注意多继承中的对象模型多继承父类成员名相同菱形继承概念菱形继承出现的问题虚继承步入第七层本章知识…

【数据分析】(task3)数据重构

note 数据的合并:df自带的join方法是横向合并,append方法是纵向(上下)合并拼接;pd的merge方法是横向合并,然后用刚才的apend进行纵向合并。数据的重构:stack函数的主要作用是将原来的列转成最内…

Redis基本类型和基本操作

2.Redis常见命令 Redis是典型的key-value数据库,key一般是字符串,而value包含很多不同的数据类型: Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网( https://redis.io/commands &…

阿里云轻量服务器下>安装宝塔面板>安装使用Tomcat服务器>通过公网ip地址>直接访问网站目录下文件

第一步 阿里云开放Tomcat 8080端口号 和宝塔面板 8888端口 第二步 如果你的应用镜像 一开始在阿里云购买服务器时候没有选择宝塔应用镜像 先打开如下界面 将系统中应用镜像 确定更换为 宝塔面板镜像 第三步 请在应用详情中 走完紫色所框选的步骤 第四步 将上一步获取到的…

cadence SPB17.4 - allegro - align component by pin

文章目录cadence SPB17.4 - allegro - align component by pin概述笔记实验备注补充 - 2023_0120_2337ENDcadence SPB17.4 - allegro - align component by pin 概述 allegro自带的元件对齐, 默认是对齐元件中心的, 对齐后的效果是中心对齐. 但是为了走线能走的最短, 拉线方便…

2023年春节祝福第二弹——送你一只守护兔(下),CSS3 动画相关属性图例实例大全(82种),守护兔源代码免费下载

2023年春节祝福第二弹——送你一只守护兔(下) CSS3 动画相关属性图例实例大全(82种)、守护兔源代码免费下载 本文目录: 五、CSS3 动画相关属性实例大全 (1)、CSS3的动画基本属性 (2&#xf…

TCP/IP OSI七层模型

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.OSI七层模型 1.什么是OSI七层参考模型 2.七层每层分别的作用…

Spring热部署设置

手动热部署 热部署是指在不停止应用程序的情况下更新应用程序的功能。这样可以避免短暂的服务中断&#xff0c;并且可以更快地部署新的功能和修复问题。热部署通常适用于Web应用程序和服务器端应用程序。 在pom.xml中添加依赖&#xff1a; <dependency><groupId>…

cmake 02 hello_cmake

cmake 学习笔记 一个最小化的 cmake 项目 目录结构 F:\2023\code\cmake\hello_cmake>tree /f 卷 dox 的文件夹 PATH 列表 卷序列号为 34D2-6BE8 F:. │ CMakeLists.txt │ main.cpp │ └─.vscodelaunch.jsontasks.jsonF:\2023\code\cmake\hello_cmake>源码 main.c…

Java 集合 笔记

体系 Collection接口 List接口&#xff1a;按照顺序插入数据&#xff0c;可重复 ArrayList实现类&#xff1a;LinkedList实现类&#xff1a; Set接口&#xff1a;不可重复的集合 HashSet实现类 Queue接口&#xff1a;队列 LinkedList实现类ArrayBlockingQueue实现类PriorityQu…

Python CalmAn工具包安装及环境配置过程【Windows】

文章目录CalmAn简介安装要求我的设备1>CalmAn压缩包解压2>conda创建虚拟环境3>requirements依赖包配置&#xff08;包括tensorflow&#xff09;4>caiman安装(mamba install)5>caimanmanager.py install6>PyCharm添加解释器7>Demo演示8>遇到的问题CalmA…

DB SQL 转 ES DSL(支持多种数据库常用查询、统计、平均值、最大值、最小值、求和语法)...

1. 简介 日常开发中需要查询Elasticsearch中的数据时&#xff0c;一般会采用RestHighLevelClient高级客户端封装的API。项目中一般采用一种或多种关系型数据库(如&#xff1a;Mysql、PostgreSQL、Oracle等) NoSQL(如&#xff1a;Elasticsearch)存储方案&#xff1b;不同关系数…

【SAP Abap】X档案:SAP ABAP 中 AMDP 简介及实现方法

SAP ABAP 中 AMDP 简介及实现方法0、前言1、AMDP 简介1.1 代码下沉&#xff08;Code Pushdown&#xff09;1.2 AMDP 是托管数据库过程的容器1.3 AMDP 的优缺点1.4 几种数据库访问方式的区别1.5 几种数据库访问方式的选用1.6 使用的开发工具2、实现方法2.1 AMDP PROCEDURE&#…