热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dataframescala修改值_如何填补Pandas中的缺失值(机器学习入门篇)

在使用python里的pandas库进行数据分析工作时,很多时候我们都会遇到这样一个问题:数据缺失。这也是大部分数据分析工作所会遇到的之一。而正确处理缺

d5d35d0dc6b739c7023f95b11944b751.png

在使用python里的pandas库进行数据分析工作时,很多时候我们都会遇到这样一个问题:数据缺失。这也是大部分数据分析工作所会遇到的之一。而正确处理缺失值,也是我们在数据分析中数据预处理环节的关键的一环。

在之前的文章中,我们也介绍过关于缺失值填充的一些小技巧:

侦探L:如何处理Pandas里的缺失值(入门篇2)​zhuanlan.zhihu.com
f74ed187f6e053cf634579d05b539540.png

今天我们继续讲讲填补缺失值的其它方法。

今天的主角:常用的机器学习库——sklearn库

设计的知识点:

  1. sklearn中,关于缺失值填充的impute.SimpleImputer类
  2. sklearn中,随机森林回归(RandomForestRegressor)填补缺失值

一、impute.SimpleImputer基本介绍

1、类体及主要参数:

sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0,copy=True)

它包括四个重要参数:

1ed44f42819d63ef7c013d3297f00cd5.png

2、使用方法:

实例化(和类一样)

二、举例说明

首先我们还是先创建实验用的数据表:

import pandas as pd
import numpy as np
df = pd.DataFrame([[np.nan, 2, np.nan, 0],[3, 4, np.nan, 1],[np.nan, np.nan, np.nan, 5],[np.nan, 3, np.nan, 4]],columns=list('ABCD'))
df

ae4165094b1a6db2c07240aeed330b0c.png

之后,导入我们的impute.SimpleImputer:

from sklearn.impute import SimpleImputer

PS:使用impute.SimpleImputer类进行缺失值填充前,我们先需要将其实例化。

(1)我们先尝试对整个DataFrame进行处理,这里我们用的是均值:

df_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
df = df_mean.fit_transform(df)

输出一下:

df

223c9427348a271ae8c4295e6e7a2be5.png

type(df)

b5dbc60f5751514e3eb96b72953d3319.png

注意看此时我们原来的数据表的类型!已经不再是DataFrame了,而是ndarray了。

当然,我们可以把它再转回DataFrame型:

pd.DataFrame(df)

4b609a9deb3b8f9d6f50325bbdcaa1ce.png

不过我们也可以看到,我们是用“均值”填充的,而原数据表的第‘C’列都是nan值,不存在均值,因此被默认删除了

(2)对整个数据表使用指定的数字填充,这里我们选择数字9:

df_0 = SimpleImputer(strategy="constant",fill_value=9)
df_cons = df_0.fit_transform(df)
pd.DataFrame(df_cons)

ed97c01c88be61baf4ddb98be06e134e.png

这时,数据表中只要是缺失值,都被数字9给替换了。

(3)与前面整个数据表采用同一种填补方法不同,下面,我们尝试针对不同列,采用不同的方法进行缺失值填充:

首先,我们建立一个新的数据表:

df = pd.DataFrame([[np.nan, 2, np.nan, 'a'],[3, 4, np.nan, 'a'],[np.nan, np.nan, np.nan, np.nan],[np.nan, 4, np.nan, 'b']],columns=list('ABCD'))
df

b22d762a2a2e715137e4534259d4ad88.png

可以看到,新的数据表中出现了非数值型数据。

我们的操作目标是:

  • 对A列采用均值填充;
  • 对B列采用中位数填充;
  • 对C列采用常数0填充;
  • 对D列采用众数填充。

首先,第一步,对我们要用的4种方法进行实例化:

#均值:
df_mean = SimpleImputer(missing_values=np.nan, strategy='mean',copy=False)#中位数:
df_median = SimpleImputer(missing_values=np.nan, strategy='median',copy=False)#常数0:
df_0 = SimpleImputer(strategy="constant",fill_value=0,copy=False)#众数:
df_most_frequent = SimpleImputer(missing_values=np.nan, strategy='most_frequent',copy=False)

接着,对不同的列使用不同的方法:

#A列
df_A = df.loc[:,'A'].values.reshape(-1,1)
df.loc[:,'A']=df_mean.fit_transform(df_A)#B列
df_B = df.loc[:,'B'].values.reshape(-1,1)
df.loc[:,'B']=df_median.fit_transform(df_B)#C列
df_C = df.loc[:,'C'].values.reshape(-1,1)
df.loc[:,'C']=df_0.fit_transform(df_C)#D列
df_D = df.loc[:,'D'].values.reshape(-1,1)
df.loc[:,'D']=df_most_frequent.fit_transform(df_D)

修改成功~

查看一下我们的修改结果:

df

5655e92c54635b15d510b553fa5dbef3.png

不错~

(4)最后,给大家介绍在机器学习中,另一种缺失值填充的有效方法——随机森林回归(RandomForestRegressor)填补缺失值。

首先,新创建一个数据表:

df = pd.DataFrame({'Country':[12,34,23,45,34,23,12,2,3], 'Income':[10000, 10000, 5000, 5002, 40000, 50000, 8000, 5000,3000],'Age':[50, 43, 34, 40, 25, 25, 45, 32,12],'填充列':[2,4,7,4,5,np.nan,np.nan,np.nan,np.nan]})
df

511c98dc0630727776091e9510d93eef.png

可以看到,在‘填充列’这一列出现了较多的缺失值,其他列没有出现缺失值。

首先,导入机器学习中的随机森林回归(RandomForestRegressor)方法:

from sklearn.ensemble import RandomForestRegressor

接着,将我们的数据集分成两部分:

第一部分,不含缺失值的其他所有列:

df_full=df.drop(labels='填充列',axis=1)
df_full

59cf6e39b20f1fe92fecc59a2bfcb73c.png

第二部分,含缺失值的那一列:

df_nan=df.loc[:,'填充列']
df_nan

50e9ec288cd0aa719252de34e1cb1886.png

然后,区别测试集与训练集:

#区别我们的训练集和测试集
Ytrain = df_nan[df_nan.notnull()]
Ytest = df_nan[df_nan.isnull()]
Xtrain = df_full.iloc[Ytrain.index]
Xtest = df_full.iloc[Ytest.index]

接着,实例化,然后用随机森林回归来填补缺失值:

#用随机森林回归来填补缺失值
rfc = RandomForestRegressor(n_estimators=100)
rfc = rfc.fit(Xtrain, Ytrain)
Ypredict = rfc.predict(Xtest)

完成~

看看我们的预测结果(即代替原来缺失的结果):

Ypredict

361ddb1d78053180338bfcbad767732d.png

将结果填补到我们原来的数据表中:

df_nan[df_nan.isnull()] = Ypredict

此时,我们的填补过程已经全部结束,让我们再次看看我们数据集填补后的样子:

df

5b1e256b8915381885d712cdbe1235d6.png

成功!撒花~

(5)随机森林回归(RandomForestRegressor)填补缺失值的原理

最后,我们讲一下使用随机森林回归填补缺失值的原理。任何回归都是从特征矩阵中学习,然后求解连续型标签y的过程,之所以能够实现这个过程,是因为回归算法认为,特征矩阵和标签之前存在着某种联系。实际上,标签和特征是可以相互转换的。例如:

在一个用“工作时间、绩效、请假时长”预测“工资”的问题中,我们既可以用“工作时间"、"绩效"、"请假时长”的数据来预测“工资”,也可以反过来,用“工作时间”,“绩效”和“工资”来预测“请假时长”。而回归填补缺失值,正是利用了这种思想。对于一个有n个特征的数据来说,其中特征T有缺失值,我们就把特征T当作标签,其他的n-1个特征和原本的标签组成新的特征矩阵。那对于T来说,它没有缺失的部分,就是我们的Y_test,这部分数据既有标签也有特征,而它缺失的部分,只有特征没有标签,就是我们需要预测的部分。

  • 特征T不缺失的值对应的其他n-1个特征 + 本来的标签:X_train
  • 特征T不缺失的值:Y_train
  • 特征T缺失的值对应的其他n-1个特征 + 本来的标签:X_test
  • 特征T缺失的值:未知,我们需要预测的Y_test

这种做法,对于某一个特征大量缺失,其他特征却很完整的情况,非常适用。

注~

在本文随机森林回归那个例子中,有缺失值的那列,就相当于原理里说的标签,而其他不含缺失值的列,相当于特征矩阵~


以上便是<如何填补Pandas中的缺失值(机器学习入门篇)>的内容&#xff0c;感谢大家的细心阅读&#xff0c;同时欢迎感兴趣的小伙伴一起讨论、学习&#xff0c;想要了解更多内容的可以看我的其他文章&#xff0c;同时可以持续关注我的动态~



推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
欢颜是胖妞妞08
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有