当前位置: 首页 > news >正文

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

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

参考书籍及源代码链接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) #默认删除方式,按行anyiris_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_valuesi = 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 KNNImputerknni = 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'] = ysns.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 RandomForestRegressorrf_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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C# 事件总线 Event Bus
  • STM32G070KBT6的RTC HAL库使用
  • FFmpeg For Android入门NDK打印版本号
  • python自动化笔记:os模块和异常处理
  • 什么是设计模式?一文理解,通俗易懂!
  • Nacos原理自问
  • Spring Cloud Gateway实现API访问频率限制
  • uniapp 自定义图片预览组件PicturePreview(Vue3、组合式、ts)
  • 新书速览|Python数据可视化:科技图表绘制(送书)
  • 【机器学习】 Sigmoid函数:机器学习中的关键激活函数
  • jmeter-beanshell学习16-自定义函数
  • 【ML】pre-train model 是什么如何微调它,如何预训练
  • pip笔记
  • POST_CRC
  • ceph分布式存储系统
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • es6要点
  • iOS编译提示和导航提示
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Redux系列x:源码分析
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • vue数据传递--我有特殊的实现技巧
  • 安卓应用性能调试和优化经验分享
  • 测试如何在敏捷团队中工作?
  • 回流、重绘及其优化
  • 面试遇到的一些题
  • 嵌入式文件系统
  • 实战|智能家居行业移动应用性能分析
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • No resource identifier found for attribute,RxJava之zip操作符
  • gunicorn工作原理
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $(function(){})与(function($){....})(jQuery)的区别
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1) caustics\
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (52)只出现一次的数字III
  • (C语言)fgets与fputs函数详解
  • (Git) gitignore基础使用
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 反射的使用
  • .net 微服务 服务保护 自动重试 Polly
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件