深度学习之“缺失数据处理”
缺失值检测
缺失数据就是我们没有的数据。如果数据集是由向量表示的特征组成,那么缺失值可能表现为某些样本的一个或多个特征因为某些原因而没有测量的值。通常情况下,缺失值由特殊的编码方式。如果正常值都是正数,那么缺失值可能被标记为-1;如果正常值是字符串,那么缺失值可能是空的字符串;如果正常值是浮点数,那么缺失值可能是NaN。
在python中,我们能够通过使用np.isnan来判断数据是否为NaN:
>>> import numpy as np
>>> a = np.arange(10, dtype="float64")
>>> a[3] = np.nan
>>> np.isnan(a[3])
True
>>> a[3] == np.nan
False
>>> a[3] is np.nan
False
>>> np.isnan(a)
array([False, False, False, True, False, False, False, False, False,False])
可以看到,只能用np.isnan来判断,“==”和“is”进行比较是无效的。
缺失值处理
假定我们已经知道数据中存在缺失值,那么我们就需要寻找一些手段来对其进行处理,从而避免对模型训练产生负面影响。
首先我们先生成一组数据,其中包含1000个样本,且每个样本都具有四维特征:
>>> import numpy as np
>>> N=1000
>>> np.random.seed(100)
>>> x = np.zeros((N,4))
>>> x[:,0] = 5*np.random.random(N)
>>> x[:,1] = np.random.normal(10,1,size=N)
>>> x[:,2] = 3*np.random.beta(5,2,N)
>>> x[:,3] = 0.3*np.random.lognormal(size=N)
其中我们固定随机种子,从而确保结果的可复现性,并且1-4维的数据分别来自均匀分布、正态分布、贝塔分布和对数正态分布。之后我们向其中随机添加5%的缺失值:
>>> i = np.random.randint(0,N,size=int(0.05*N))
>>> x[i,0] = np.nan
>>> i = np.random.randint(0,N,size=int(0.05*N))
>>> x[i,1] = np.nan
>>> i = np.random.randint(0,N,size=int(0.05*N))
>>> x[i,2] = np.nan
>>> i = np.random.randint(0,N,size=int(0.05*N))
>>> x[i,3] = np.nan
那么我们应该如何来处理这些缺失值呢?
直接丢弃
如果我们拥有的数据集较为庞大,而缺失值的占比很小,且分布较为均匀,那么直接丢弃这些缺失值也是可以的。但是如果缺失值与某个类别存在相关性,直接丢掉这些样本可能在某种程度上会导致数据集有偏,进而影响模型的准确性。
均值/中位数填充
我们还可以参考剔除缺失值后数据的分布形态,选择使用数据均值或者中位数来对缺失值进行填充。我们首先剔除数据中的缺失值,并使用matplotlib.pyplot中的boxplot函数来查看剔除缺失值后数据的箱形图:
import matplotlib.pyplot as plt
# 剔除缺失值
def remove_nan_columnwise(data):"""从每一列中剔除NaN值"""return [data[~np.isnan(data[:, col]), col] for col in range(data.shape[1])]# 应用函数到数据
cleaned_data = remove_nan_columnwise(x)# 绘制箱形图
plt.figure(figsize=(10, 6))
plt.boxplot(cleaned_data, labels=['Column 1', 'Column 2', 'Column 3', 'Column 4'])
plt.title('Box Plot of Data After Removing Missing Values')
plt.ylabel('Value')
plt.show()

从图中可以看出,第1、2维的数据偏差较小,且箱形框较为对称;第3维的数据偏上,第4维的数据偏下。因此我们使用均值来替代第1、2维的缺失数据,使用中位数来替换第3、4维的数据。
i = np.where(np.isnan(x[:,0]) == False)
m = np.mean(x[i,0])
i = np.where(np.isnan(x[:,0]) == True)
x[i,0] = mi = np.where(np.isnan(x[:,1]) == False)
m = np.mean(x[i,1])
i = np.where(np.isnan(x[:,1]) == True)
x[i,1] = mi = np.where(np.isnan(x[:,2]) == False)
m = np.median(x[i,2])
i = np.where(np.isnan(x[:,2]) == True)
x[i,2] = mi = np.where(np.isnan(x[:,3]) == False)
m = np.median(x[i,3])
i = np.where(np.isnan(x[:,3]) == True)
x[i,3] = m
关于何时用中位数替代缺失值,何时用均值替代缺失值,给出的参考如下:
使用中位数填充的情况
- 当数据是偏斜分布或存在异常值时:如果数据不是正态分布,而是偏向一侧(即有长尾),或者存在极端值(outliers),那么使用中位数可能是更好的选择。因为中位数不受极值影响,可以更好地代表中心趋势。
- 对于非正态分布的数据:如果变量不符合正态分布,中位数可能是一个更稳健的选择,因为它更能反映大多数观测值的集中位置。
- 对于有序分类数据:当处理有序分类变量(例如,教育水平、满意度评分等)时,中位数也可能是更合适的选择。
- 当需要保持数据的原始分布特征时:在某些情况下,使用中位数可以帮助保持数据集的原有分布特性,尤其是在存在明显偏斜的情况下。
使用平均值填充的情况
- 当数据接近正态分布且没有显著异常值时:如果数据大致呈正态分布,并且不存在明显的异常值,那么使用平均值填充可能是合适的,因为它会考虑所有观测值。
- 对于数值型数据:平均值通常用于数值型数据,尤其是那些期望值具有实际意义的变量。
- 当想要最小化总平方误差时:平均值是使得预测误差平方和最小化的估计量,因此在某些统计分析中,它可能是首选。
- 对于回归分析中的连续变量:在进行回归分析时,如果变量是连续的,并且你认为缺失值应该反映总体的“平均水平”,那么平均值可能是一个合理的选择。
相关文章:
深度学习之“缺失数据处理”
缺失值检测 缺失数据就是我们没有的数据。如果数据集是由向量表示的特征组成,那么缺失值可能表现为某些样本的一个或多个特征因为某些原因而没有测量的值。通常情况下,缺失值由特殊的编码方式。如果正常值都是正数,那么缺失值可能被标记为-1…...
C#面试常考随笔8:using关键字有哪些用法?
1. using 指令:引入命名空间 最常用的用法。通过using 命名空间名字,可以在程序中直接使用该命名空间中的类型,而无需指定类型的完整命名空间路径。例如: using System; using System.Collections.Generic; class Program {sta…...
Writing an Efficient Vulkan Renderer
本文出自GPU Zen 2。 Vulkan 是一个新的显式跨平台图形 API。它引入了许多新概念,即使是经验丰富的图形程序员也可能不熟悉。Vulkan 的主要目标是性能——然而,获得良好的性能需要深入了解这些概念及其高效应用方法,以及特定驱动程序实现的实…...
解决Django非ORM模型提示初始化request问题
提问 Django在DRF时候自定义显示一些非model的字段提示TypeError: Field.__init__() got an unexpected keyword argument request 解答1 错误提示 TypeError: Field.__init__() got an unexpected keyword argument request 显示在创建序列化器实例时,传递了一个…...
MYSQL--一条SQL执行的流程,分析MYSQL的架构
文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么? 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…...
C++解决输入空格字符串的三种方法
一.gets和fgets char * gets ( char * str ); char * fgets ( char * str, int num, FILE * stream ); 1. gets 是从第⼀个字符开始读取,⼀直读取到 \n 停⽌,但是不会读取 \n ,也就是读取到的内容 中没有包含 \n ,但是会在读取到的内…...
多模态论文笔记——NaViT
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文NaViT(Native Resolution ViT),将来自不同图像的多个patches打包成一个单一序列——称为Patch n’ Pack—…...
云中漫步:精工细作铸就免费公益刷步平台
云中漫步,历经三年深度研发与优化,平台以高稳定性、零成本及公益属性为核心特色,依托前沿技术手段与多重安全防护机制,确保用户步数数据的精准修改与隐私安全。我们致力于提供无缝流畅的用户体验,让每一次步数更新都轻…...
neo4j入门
文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品,已经在众多的行业项目中进行了应用,如:网络管理&am…...
Leetcode::81. 搜索旋转排序数组 II
81. 搜索旋转排序数组 II 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nu…...
【ts + java】古玩系统开发总结
src别名的配置 开发中文件和文件的关系会比较复杂,我们需要给src文件夹一个别名吧 vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({pl…...
【自学笔记】Web前端的重点知识点-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Web前端知识点一、HTML基础二、CSS样式三、JavaScript基础四、前端框架与库五、前端工具与构建六、前端性能优化七、响应式设计与适配八、前端安全 总结 Web前端知识…...
【Docker】快速部署 Nacos 注册中心
【Docker】快速部署 Nacos 注册中心 引言 Nacos 注册中心是一个用于服务发现和配置管理的开源项目。提供了动态服务发现、服务健康检查、动态配置管理和服务管理等功能,帮助开发者更轻松地构建微服务架构。 仓库地址 https://github.com/alibaba/nacos 步骤 拉取…...
SpringCloud篇 微服务架构
1. 工程架构介绍 1.1 两种工程架构模型的特征 1.1.1 单体架构 上面这张图展示了单体架构(Monolithic Architecture)的基本组成和工作原理。单体架构是一种传统的软件架构模式,其中所有的功能都被打包在一个单一的、紧密耦合的应用程序中。 …...
tf.Keras (tf-1.15)使用记录4-model.fit方法及其callbacks参数
model.fit() 方法是 TensorFlow Keras 中用于训练模型的核心方法。 其中里面的callbacks参数是实现模型保存、监控、以及和tensorboard联动的重要API 1 model.fit() 方法的参数及使用 必需参数 x: 训练数据的输入。可以是 NumPy 数组、TensorFlow tf.data.Dataset、Python 生…...
Easy系列PLC尺寸测量功能块ST代码(激光微距仪应用)
激光微距仪可以测量短距离内的产品尺寸,产品规格书的测量 精度可以到0.001mm。具体需要看不同的型号。 1、激光微距仪 2、尺寸测量应用 下面我们以测量高度为例子,设计一个高度测量功能块,同时给出测量数据和合格不合格指标。 3、高度测量功能块 4、复位完成信号 5、功能…...
996引擎 -地图-添加安全区
996引擎 -地图-添加安全区 文件位置配置 cfg_startpoint.xls特效效果1345参考资料文件位置 文件位置服务端D:\996M2-lua\MirServer-lua\Mir200客户端D:\996M2-lua\996M2_debug\dev配置 cfg_startpoint.xls 服务端\Mir200\Envir\DATA\cfg_startpoint.xls 填歪了也有可能只画一…...
Node.js 全局对象
Node.js 全局对象 引言 在Node.js中,全局对象是JavaScript环境中的一部分,它提供了对Node.js运行时环境的访问。全局对象在Node.js中扮演着重要的角色,它使得开发者能够访问和操作Node.js的许多核心功能。本文将详细介绍Node.js的全局对象,包括其特点、常用方法和应用场景…...
[Collection与数据结构] B树与B+树
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
redex快速体验
第一步: 2.回调函数在每次state发生变化时候自动执行...
【VM】VirtualBox安装CentOS8虚拟机
阅读本文前,请先根据 VirtualBox软件安装教程 安装VirtualBox虚拟机软件。 1. 下载centos8系统iso镜像 可以去两个地方下载,推荐跟随本文的操作用阿里云的镜像 centos官网:https://www.centos.org/download/阿里云镜像:http://…...
电子电气架构 --- 汽车电子拓扑架构的演进过程
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
自动驾驶---苏箐对智驾产品的思考
1 前言 对于更高级别的自动驾驶,很多人都有不同的思考,方案也好,产品也罢。最近在圈内一位知名的自动驾驶专家苏箐发表了他自己对于自动驾驶未来的思考。 苏箐是地平线的副总裁兼首席架构师,同时也是高阶智能驾驶解决方案SuperDri…...
手写call函数、手写apply函数、手写bind函数
文章目录 1 手写call函数2 手写apply函数3 手写bind函数 1 手写call函数 call函数的实现步骤: 判断调用对象是否为函数。判断传入上下文对象是否存在,如果不存在,则设置为window。处理传入的参数,截取第一个参数后的所有参数。将…...
Python | Pytorch | Tensor知识点总结
如是我闻: Tensor 是我们接触Pytorch了解到的第一个概念,这里是一个关于 PyTorch Tensor 主题的知识点总结,涵盖了 Tensor 的基本概念、创建方式、运算操作、梯度计算和 GPU 加速等内容。 1. Tensor 基本概念 Tensor 是 PyTorch 的核心数据结…...
90,【6】攻防世界 WEB Web_php_unserialize
进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file,默认值为 index.phpprivate $file index.php;// 构造函数,当创建类的实例时会自动调用// 接收一个参数 $file,用于初始化对象的 $file 属…...
快速提升网站收录:如何设置网站标签?
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/45.html 为了快速提升网站的收录,合理设置网站标签是至关重要的。网站标签主要包括标题标签(TitleTag)、描述标签(DescriptionTag)…...
【数据分析】案例04:豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask)
豆瓣电影Top250的数据分析与Web网页可视化(numpy+pandas+matplotlib+flask) 豆瓣电影Top250官网:https://movie.douban.com/top250写在前面 实验目的:实现豆瓣电影Top250详情的数据分析与Web网页可视化。电脑系统:Windows使用软件:PyCharm、NavicatPython版本:Python 3.…...
Banana JS,一个严格子集 JavaScript 的解释器
项目地址:https://github.com/shajunxing/banana-js 特色 我的目标是剔除我在实践中总结的JavaScript语言的没用的和模棱两可的部分,只保留我喜欢和需要的,创建一个最小的语法解释器。只支持 JSON 兼容的数据类型和函数,函数是第…...
2025.2.1——四、php_rce RCE漏洞|PHP框架
题目来源:攻防世界 php_rce 目录 一、打开靶机,整理信息 二、解题思路 step 1:PHP框架漏洞以及RCE漏洞信息 1.PHP常用框架 2.RCE远程命令执行 step 2:根据靶机提示,寻找版本漏洞 step 3:进行攻击…...
