【scikit-learn基础】--『预处理』之 缺失值处理
数据的预处理是数据分析,或者机器学习训练前的重要步骤。
通过数据预处理,可以
- 提高数据质量,处理数据的缺失值、异常值和重复值等问题,增加数据的准确性和可靠性
- 整合不同数据,数据的来源和结构可能多种多样,分析和训练前要整合成一个数据集
- 提高数据性能,对数据的值进行变换,规约等(比如无量纲化),让算法更加高效
本篇介绍的缺失值处理,是数据预处理中非常重要的一步,因为很多机器学习算法都假设数据是完整的,算法的执行过程中没有考虑缺失值的影响。
所以,为了提高数据质量、改进数据分析结果、提高数据挖掘和机器学习的效果,缺失值处理必不可少。
1. 原理
处理缺失值的手段大致有4类:
- 删除存在缺失值数据行
- 填充缺失值
- 不处理缺失值
- 用深度学习方法处理
1.1. 删除缺失值数据
删除缺失值是最简单的一种处理方式,不过,在某些情况下,这可能会导致数据的大量丢失。
如果数据丢失过多,可能会改变数据的分布,影响模型的准确性。
所以,只有在缺失值占比很小的情况下,才会考虑使用这种处理方式。
删除缺失值用pandas库的方法即可,比如:
import pandas as pd
df = pd.util.testing.makeMissingDataframe()
print("删除前: {} 行".format(len(df)))
df = df.dropna()
print("删除后: {} 行".format(len(df)))
# 运行结果
删除前: 30 行
删除后: 19 行
1.2. 填充缺失值
直接删除存在缺失值的数据行虽然简单,但是在实际应用中,使用的并不多。
实际情况下,使用最多的还是填充缺失值。
scikit-learn库中,填充缺失值的方式主要有:
1.2.1. 均值填充
均值填充就是用缺失值所在列的平均值来填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
print("均值填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, strategy="mean")
data = imp.fit_transform(data)
print("均值填充后:\n{}".format(data))
# 运行结果
均值填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]]
均值填充后:
[[1. 2. 3. ]
[4. 5. 6. ]
[7. 8. 4.5]]
填充的5和4.5分别是第二列和第三列的平均值。
1.2.2. 中位数填充
中位数填充就是用缺失值所在列的中位数来填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 11, 12]])
print("中位数填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, strategy="median")
data = imp.fit_transform(data)
print("中位数填充后:\n{}".format(data))
# 运行结果
中位数填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]
[10. 11. 12.]]
中位数填充后:
[[ 1. 2. 3.]
[ 4. 8. 6.]
[ 7. 8. 6.]
[10. 11. 12.]]
填充的8和6分别是第二列和第三列的中位数。
1.2.3. 众数填充
众数填充就是用缺失值所在列的众数数来填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 8, 3]])
print("众数填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, strategy="most_frequent")
data = imp.fit_transform(data)
print("众数填充后:\n{}".format(data))
# 运行结果
众数填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]
[10. 8. 3.]]
众数填充后:
[[ 1. 2. 3.]
[ 4. 8. 6.]
[ 7. 8. 3.]
[10. 8. 3.]]
填充的8和3分别是第二列和第三列的众数。
1.2.4. 常量填充
常量填充就是用指定的常量来填充缺失值。
from sklearn.impute import SimpleImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
print("常量填充前:\n{}".format(data))
imp = SimpleImputer(missing_values=np.nan, fill_value=100, strategy="constant")
data = imp.fit_transform(data)
print("常量填充后:\n{}".format(data))
# 运行结果
常量填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]]
常量填充后:
[[ 1. 2. 3.]
[ 4. 100. 6.]
[ 7. 8. 100.]]
缺失值用常量100填充了。
1.2.5. 插值填充
插值填充就是使用线性插值或多项式插值等方法,基于已知的数据点估计缺失值。
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan]])
print("插值填充前:\n{}".format(data))
imp = IterativeImputer(max_iter=10, random_state=0)
data = imp.fit_transform(data)
print("插值填充后:\n{}".format(data))
# 运行结果
插值填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]]
插值填充后:
[[1. 2. 3. ]
[4. 5.00203075 6. ]
[7. 8. 8.99796726]]
1.2.6. K近邻填充
K近邻填充就是利用K近邻算法,找到与缺失值最近的K个数据点,用它们的值的平均数或中位数来填充缺失值。
from sklearn.impute import KNNImputer
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, np.nan], [10, 11, 12]])
print("K近邻填充前:\n{}".format(data))
imp = KNNImputer(n_neighbors=2)
data = imp.fit_transform(data)
print("K近邻填充后:\n{}".format(data))
# 运行结果
K近邻填充前:
[[ 1. 2. 3.]
[ 4. nan 6.]
[ 7. 8. nan]
[10. 11. 12.]]
K近邻填充后:
[[ 1. 2. 3.]
[ 4. 5. 6.]
[ 7. 8. 9.]
[10. 11. 12.]]
2. 作用
缺失值处理的主要作用包括:
- 提高数据完整性和准确性:如果数据中存在缺失值,可能会影响分析的准确性,甚至导致错误的结论。因此,通过填补缺失值,我们可以确保数据的完整性和准确性。
- 提升数据质量:缺失值可能会降低数据的质量,使得数据分析变得更为困难。通过处理缺失值,我们可以提升数据的质量,使得分析结果更加可靠。
- 提高算法性能:许多机器学习和数据挖掘算法在处理不完整数据时性能会下降。处理缺失值可以使得这些算法更好地运行,提高其性能。
- 减少信息丢失:在某些情况下,缺失值可能代表着某些信息的丢失。通过对这些缺失值进行处理,我们可以尽量减少信息丢失的数量。
- 消除或减少噪声:缺失值的存在可能会引入数据中的噪声,这种噪声可能会对数据分析产生干扰,甚至影响模型的训练效果。通过填补这些缺失值,我们可以消除或减少这种噪声。
3. 总结
在选择处理缺失值的方法时,需要考虑数据的性质、缺失值的比例、数据的分布以及具体的分析任务等因素。
同时,不同的方法可能适用于不同的场景,需要结合具体情况进行选择。
【scikit-learn基础】--『预处理』之 缺失值处理的更多相关文章
- Python基础『一』
内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...
- Python基础『二』
目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...
- 『TensorFlow』TFR数据预处理探究以及框架搭建
一.TFRecord文件书写效率对比(单线程和多线程对比) 1.准备工作 # Author : Hellcat # Time : 18-1-15 ''' import os os.environ[&q ...
- 『TensorFlow』SSD源码学习_其五:TFR数据读取&数据预处理
Fork版本项目地址:SSD 一.TFR数据读取 创建slim.dataset.Dataset对象 在train_ssd_network.py获取数据操作如下,首先需要slim.dataset.Dat ...
- 『cs231n』计算机视觉基础
线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...
- 『TensorFlow』专题汇总
TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...
- 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支
下图Github地址:Mask_RCNN Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...
- 『计算机视觉』Mask-RCNN
一.Mask-RCNN流程 Mask R-CNN是一个实例分割(Instance segmentation)算法,通过增加不同的分支,可以完成目标分类.目标检测.语义分割.实例分割.人体姿势识别等多种 ...
- 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍
一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...
- 『TensotFlow』RNN/LSTM古诗生成
往期RNN相关工程实践文章 『TensotFlow』基础RNN网络分类问题 『TensotFlow』RNN中文文本_上 『TensotFlow』基础RNN网络回归问题 『TensotFlow』RNN中 ...
随机推荐
- SqlServer修改表字段类型
if not exists (select 1 from syscolumns where name='字段名' and id=OBJECT_ID('表名') and 条件) begin alter ...
- Ipa打包并安装到iphone
手动运行篇: 在真机上运行appium会进行闪退,因为我们的真机是不合法的真机,怎么样才能合法呢,要注册我们的设备才行 要对app进行打包,要先进行签名,要签名,就需要证书,证书可以自己伪造,但是这一 ...
- 全是中文的txt文件查找特定字符并输出该行到新文件
tangshi.txt文件为全为汉唐诗 在该文件中查找指定字符 codecs库为打开中文文件的库,详情自行知乎 tangshi.txt大概十几万行,需要该文件练手的同学下方评论 要点:更改文件字符编码 ...
- 电气工程师必学------CODESYS v3.5 入门学习笔记(一)
一.新建工程 打开软件新建工程,如图 此教程只是入门练习,所以这里一般情况下都是创建的Standard project,也就是标准工程.窗口下方可以设置工程名称与存放位置. 紧接着是选择设备与编译语言 ...
- TIPTOP GP ERP二次开发规范说明
TIPTOP GP ERP二次开发规范说明 TIPTOP ERP共分三大区:topstd(标准区) + toppord(正式区) + toptest(测试区) 标准区 ...
- 小提琴图的绘制方法:Python matplotlib实现
本文介绍基于Python中matplotlib模块与seaborn模块,利用多个列表中的数据,绘制小提琴图(Violin Plot)的方法. 小提琴图作为一种将箱型图与核密度图分别所能表达的信 ...
- C#/.NET/.NET Core优秀项目和框架精选(2023年10月更新,项目分类已整理完成欢迎大家踊跃提交PR一起完善让优秀的项目和框架不被埋没)
前言 帮助开发者发现功能强大.性能优越.创新前沿.简单易用的C#/.NET/.NET Core优秀项目和框架,无论你是寻找灵感.学习新技术.改进代码质量,还是想拓展自己的技术视野,都能为你提供有价值的 ...
- C/C++中的ACM题目输入处理——简单易上手
这里就不按其他文章的以各种情况为分类方法,而是以方法本身为分类办法.因为有一些方法是不同情况通用的,比如已知数量数字的输入和未知数量数字的输入,其实可以用同一种办法. 输入 C/C++ :scanf正 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-21-处理鼠标拖拽-番外篇
1.简介 前边宏哥拖拽有提到那个反爬虫机制,加了各种参数,以及加载js脚本文件还是有问题,偶尔宏哥好像发现了解决问题的办法,看到了黎明的曙光,宏哥就说试一下看看行不行,万一实现了.结果宏哥试了结果真的 ...
- jenkins实践篇(2)—— 自动打tag的可回滚发布模式
大家好,我是蓝胖子,在上一篇我简单介绍了如何基于特定分支做自动编译和发布,在生产环境中,为了更加安全和快速回滚,我采取的是通过对代码打tag的方式来进行部署,下面我将详细介绍整个发布过程的逻辑. 发布 ...