缺失值处理方法:代数/统计/机器学习算法补全数据(附Python-sklearn代码精美可视化绘图)

news2025/1/11 0:06:24

注:本期的删除或插补方法主要针对连续数据时间序列数据的插补在后续关于时间序列的博客中讲明。参考鸢尾花丛书,链接如下:

参考书籍及源代码链接icon-default.png?t=N7T8https://github.com/Visualize-ML

博客是选出自己感觉用的到的精炼部分加自己的理解,代码结果也是自己实操,部分还在学习过程增加了注释,算是笔记,科研时参考方便!!


一、删除

承接上一节的代码,继续进行处理!

1、整行整列删除

一般情况的数据集,每行代表一个样本,每列代表一个特征。处理缺失值的基本策略是舍弃包含缺失值的整行或整列,但会丢失有价值的数据。

dropna(axis = 0, how = 'any')方法,具有如下特征:

  • axis = 0 为按行删除,设置 axis = 1 表示按列删除
  • how = 'any'时,表示某行或列只要有一个缺失值,就删除该行或列
  • how = 'all' ,表示该行或列全部都为缺失值时,才删除该行或列
  • 默认 设置为 axis = 0 how = 'any'
X_NaN_drop = X_NaN.dropna(axis=0) #默认删除方式,按行any

iris_df_NaN_drop = pd.DataFrame(X_NaN_drop, columns=X_NaN.columns, index=X_NaN.index)
iris_df_NaN_drop['species'] = y
sns.pairplot(iris_df_NaN_drop, hue='species', palette = "dark")

数据减少了很多,不管是删除缺失值所在的行或 列,都会浪费大量有价值的信息


2、成对删除

一种特别的删除方式,进行多特征联立时,只删除掉 需要执行运算特征 包含的缺失数据。例如估算方差协方差矩阵时,计算X1和X3的相关性,只需要删除下面数据点:

二、插补

删除策略可能会丢失有价值的数据,更好的策略是估算缺失值,即从数据的已知部分推断出缺失值,这种方法统称插补

分类数据 连续数据 采用的方法也稍有差别。注意,选取采用插补方法要格外小心, 如果填充方法不合理,会引入数据噪音,并造成数据分析结果不准确。
时间序列数据 采用的插补方法不同于一般数据。 Pandas 数据帧有基本插补功能,特别是对于时间数据, 可以采用插值 、向前填充、向后填充。( 后续关于时间序列的博客中讲明)

1、单变量插补:统计插补

仅使用缺失值所在特征维度的非缺失值来插补,函数方法SimpleImputer()——可以使用缺失值所在的行/列中的统计数据平均值 ('mean')中位数 ('median') 或者众数 ('most_frequent') 来填充,也可以使用指定的常数 'constant'

连续数据常用平均值中位数分类数据常用众数来填充!如用中位数填充上述缺失数据集:

#单变量插补
from sklearn.impute import SimpleImputer

# The imputation strategy:
# 'mean', replace missing values using the mean along each column
# 'median', replace missing values using the median along each column
# 'most_frequent', replace missing using the most frequent value along each column
# 'constant', replace missing values with fill_value

si = SimpleImputer(strategy='median')
# impute training data
X_NaN_median = si.fit_transform(X_NaN)

iris_df_NaN_median = pd.DataFrame(X_NaN_median,
                                  columns=X_NaN.columns,
                                  index=X_NaN.index)

iris_df_NaN_median['species'] = y
sns.pairplot(iris_df_NaN_median, hue='species', palette = "dark")
plt.show()

中位数插补数据呈”十字状“,插补方法也可以通过替换注释中的字符实现。


2、K近邻插补

k 近邻算法 k -NN) 是最基本 监督学习 方法之 一,k -NN 中的 k 指的是“近邻”的数量——“近朱者赤,近墨者黑”。函数方法KNNImputer()——先给定距离 缺失值数据最近的 k 个样本,将这 k 个值等 权重平均或加权平均来插补缺失值。
## kNN插补
from sklearn.impute import KNNImputer

knni = KNNImputer(n_neighbors=5)  #创建KNN实例化对象
X_NaN_kNN = knni.fit_transform(X_NaN) #开始插补

iris_df_NaN_kNN = pd.DataFrame(X_NaN_kNN,
                               columns=X_NaN.columns,
                               index=X_NaN.index)
iris_df_NaN_kNN['species'] = y

sns.pairplot(iris_df_NaN_kNN,
             hue='species', palette = "dark")
plt.show()


3、多变量插补

对比单变量插补,不用缺失值所在特征的数据,而是使用其他特征数据来填充该缺失值缺失值建模为其他特征的函数),考虑了不同特征数据的联系!!

函数方法IterativeImputer(),整个过程用迭代循环的方式进行!

## 多变量插补
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.ensemble import RandomForestRegressor

rf_imp = IterativeImputer(estimator=
                          RandomForestRegressor(random_state=0),
                          max_iter=20)
X_NaN_RF = rf_imp.fit_transform(X_NaN)

iris_df_NaN_RF = pd.DataFrame(X_NaN_RF,
                              columns=X_NaN.columns,
                              index=X_NaN.index)
iris_df_NaN_RF['species'] = y
sns.pairplot(iris_df_NaN_RF, hue='species',
             palette = "dark")
plt.show()


IterativeImputer()多变量插补方法很灵活,也可以与决策树回归、贝叶斯岭回归等估算器联合使用:

参考资料1icon-default.png?t=N7T8https://scikit-learn.org/stable/modules/impute.html参考资料2icon-default.png?t=N7T8https://scikit-learn.org/stable/auto_examples/impute/plot_iterative_imputer_variants_comparison

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

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

相关文章

春秋云境 | 文件上传 | CVE-2022-30887

目录 靶标介绍 开启靶场 上传一句话木马 蚁剑连接 找到 flag 靶标介绍 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口,客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0…

eclipse无法使用jdk1.6编译老项目

主要修改两个地方的配置: 1、eclipse中配置的maven版本不能过高,亲测3.2.5版本是好使的。 2、修改eclipse安装目录下的eclipse.ini文件,将其中的-Dosgi.requiredJavaVersion更改为1.6即可,我得默认是1.7 最后附上maven安装包&…

AGV一体式ARM智能控制主机如何替代传统PLC、工控机等方案

工业自动化的不断发展,AGV(自动导引车)作为一种重要的物流搬运设备,在各个领域得到了广泛的应用。而 AGV 的控制主机是其核心部件之一,直接影响着 AGV 的性能和稳定性。传统的 AGV 控制主机通常采用 x86 工控机交换机i…

【密码学】密码协议的分类:②认证协议

密码协议的分类有很多种方式,这里我采取的是基于协议实现的目的来分类。可以将密码协议分成三类:认证协议、密钥建立协议、认证密钥建立协议。 一、认证协议是什么? 认证协议都在认证些什么东西呢?认证一般要认证三个东西&#x…

防止老年痴呆的小学题

直角三角形的周长为16,斜边长为7,求三角形的面积(不使用勾股定理) 答案为(9*9-7*7)/4

aria2下载器在windows端的使用

一、下载aria2 aria2aria2 is a lightweight multi-protocol & multi-source command-linedownload utility. It supports HTTP/HTTPS, FTP, SFTP,BitTorrent and Metalink. …https://aria2.github.io/打开链接,点击要下载的版本,注意windows版本跟…

k8s持久化存储PV和PVC

一、PV和PVC 1.PersistentVolume (PV) PersistentVolume (PV) 是外部存储系统中的⼀块存储空间,由管理员创建和维护。与 Volume⼀样, PV 具有持久性,⽣命周期独⽴于 Pod; 2.PersistentVolumeClaim (PVC) PersistentVolumeClaim…

MySQL的三大关键日志:Bin Log、Redo Log与Undo Log

MySQL的三大关键日志:Bin Log、Redo Log与Undo Log 1. Bin Log(二进制日志)2. Redo Log(重做日志)3. Undo Log(回滚日志) ) 💖The Begin💖点点关注,收藏不迷…

8.6 Day14 匿名用户访问ftp位置

vsftpd的端口号:tcp 20、21 vsftpd的配置文件:/etc/vsftpd/vsftpd.conf LInux系统防火墙默认不允许开启20、21端口访问 使用不同用户访问FTP 1.使用匿名用户访问FTP 匿名用户登录时,用户名为ftp,没有密码 测试匿名用户文件上传…

20240806---特征选择与稀疏学习笔记---pptp61-p92---奇异值分解/压缩感知、字典学习

一.奇异值分解 2.要进行特征分解,则矩阵A为方阵,如果矩阵 𝐴A 不是方阵(即行数和列数不同),我们仍然可以对其进行分解,这就是奇异值分解(SVD)的强大之处。 二.压缩感知 …

力扣面试经典算法150题:移除元素

移除元素 今日的题目依旧是力扣面试经典算法150题中数组相关的题目:移除元素 题目链接:https://leetcode.cn/problems/remove-element/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个排序数组 nums 和一个值 val&a…

cpu问题排查——mpstat

mpstat是sysstat包中用于linux下排查、监控cpu的一个工具。可从该工具体现出程序中断情况、cpu负载情况等。 用法 mpstat [ options ] [ <interval> [ <count> ] ] 命令参数 -P { <cpu_list> | ALL } : ALL表示所有cpu的平均损耗信息&#xff0c;<cpu_…

PXE 服务器搭建——启动界面设计实验

环境准备&#xff1a; 前期准备&#xff1a; 解决 kickstart 实验出现的 DHCP 的问题-CSDN博客 http://t.csdnimg.cn/5vZP0 当前准备&#xff1a; 两台虚拟机&#xff1a;RHEL7 OpenEuler(作为测试机器使用) ip&#xff1a;172.25.254.100 yum install syslinux.x…

Go语言标准库中的双向链表的基本用法

什么是二分查找区间&#xff1f; 什么是链表&#xff1f; 链表节点的代码实现&#xff1a; 链表的遍历&#xff1a; 链表如何插入元素&#xff1f; go语言标准库的链表&#xff1a; 练习代码&#xff1a; package mainimport ("container/list""fm…

如何在Python中诊断和解决内存溢出问题

python的内存溢出即程序在申请内存后未能正确释放&#xff0c;导致随着时间推移占用的内存越来越多&#xff0c;以下是一些可能导致内存溢出的原因&#xff1a; 1、循环引用&#xff1a;当对象之间形成循环引用&#xff0c;并且这些对象定义了__del__方法时&#xff0c;Python…

证券行业容器云平台建设之GPU池化建议

随着分布式微服务化技术的广泛使用&#xff0c;用户对于容器系统的需求急剧增加。证券行业在近几年开始着手引入企业级容器云平台。在AIGC的大环境下&#xff0c;证券行业正以数据中台、智能中台为核心&#xff0c;在营销、投顾、投研、风控等多个领域进行智能化升级&#xff0…

MYSQL主库切换binlog模式后主从同步错误

MYSQL主库切换binlog模式后主从库同步错误的问题 在使用FlinkSQL的mysql-cdc连接器来监听MySQL数据库时&#xff0c;通常需要将MySQL的binlog模式设置为ROW模式。然而&#xff0c;在实际项目中&#xff0c;可能会遇到如下问题&#xff1a; 当我们将MySQL主库的binlog模式从STA…

计算机网络408考研 2018

1 计算机网络408考研2018年真题解析_哔哩哔哩_bilibili

【sdk】- 对接阿里云抠图

文档地址&#xff1a;https://help.aliyun.com/zh/viapi/use-cases/general-image-segmentation?spma2c4g.11186623.0.0.3814173cenldIs java对接阿里云的通用分割&#xff0c;将代码原封不动复制进来&#xff0c;执行结果失败&#xff0c;咨询阿里云的人员之后&#xff0c;由…

JavaEE: Thread类

Thread的常见构造方法 Thread的常见属性 ID 是线程的唯一标识,不同线程不会重复名称是在使用各种调试工具时会用到的状态表示线程当前所处的情况优先级高的线程理论上来说更容易被调度到关于后台线程,需要记住:JVM会在一个进程的所有非后台线程结束后,才会结束运行是否存活,即r…