数据的预处理是数据分析,或者机器学习训练前的重要步骤。
通过数据预处理,可以

  • 提高数据质量,处理数据的缺失值、异常值和重复值等问题,增加数据的准确性和可靠性
  • 整合不同数据,数据的来源和结构可能多种多样,分析和训练前要整合成一个数据集
  • 提高数据性能,对数据的值进行变换,规约等(比如无量纲化),让算法更加高效

本篇介绍的缺失值处理,是数据预处理中非常重要的一步,因为很多机器学习算法都假设数据是完整的,算法的执行过程中没有考虑缺失值的影响。
所以,为了提高数据质量、改进数据分析结果、提高数据挖掘和机器学习的效果,缺失值处理必不可少。

1. 原理

处理缺失值的手段大致有4类

  1. 删除存在缺失值数据行
  2. 填充缺失值
  3. 不处理缺失值
  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]]

填充的54.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.]]

填充的86分别是第二列第三列的中位数。

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.]]

填充的83分别是第二列第三列的众数。

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. 作用

缺失值处理的主要作用包括:

  1. 提高数据完整性和准确性:如果数据中存在缺失值,可能会影响分析的准确性,甚至导致错误的结论。因此,通过填补缺失值,我们可以确保数据的完整性和准确性。
  2. 提升数据质量:缺失值可能会降低数据的质量,使得数据分析变得更为困难。通过处理缺失值,我们可以提升数据的质量,使得分析结果更加可靠。
  3. 提高算法性能:许多机器学习和数据挖掘算法在处理不完整数据时性能会下降。处理缺失值可以使得这些算法更好地运行,提高其性能。
  4. 减少信息丢失:在某些情况下,缺失值可能代表着某些信息的丢失。通过对这些缺失值进行处理,我们可以尽量减少信息丢失的数量。
  5. 消除或减少噪声:缺失值的存在可能会引入数据中的噪声,这种噪声可能会对数据分析产生干扰,甚至影响模型的训练效果。通过填补这些缺失值,我们可以消除或减少这种噪声。

3. 总结

在选择处理缺失值的方法时,需要考虑数据的性质、缺失值的比例、数据的分布以及具体的分析任务等因素。
同时,不同的方法可能适用于不同的场景,需要结合具体情况进行选择。

【scikit-learn基础】--『预处理』之 缺失值处理的更多相关文章

  1. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  2. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  3. 『TensorFlow』TFR数据预处理探究以及框架搭建

    一.TFRecord文件书写效率对比(单线程和多线程对比) 1.准备工作 # Author : Hellcat # Time : 18-1-15 ''' import os os.environ[&q ...

  4. 『TensorFlow』SSD源码学习_其五:TFR数据读取&数据预处理

    Fork版本项目地址:SSD 一.TFR数据读取 创建slim.dataset.Dataset对象 在train_ssd_network.py获取数据操作如下,首先需要slim.dataset.Dat ...

  5. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  6. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  7. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

  8. 『计算机视觉』Mask-RCNN

    一.Mask-RCNN流程 Mask R-CNN是一个实例分割(Instance segmentation)算法,通过增加不同的分支,可以完成目标分类.目标检测.语义分割.实例分割.人体姿势识别等多种 ...

  9. 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍

    一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...

  10. 『TensotFlow』RNN/LSTM古诗生成

    往期RNN相关工程实践文章 『TensotFlow』基础RNN网络分类问题 『TensotFlow』RNN中文文本_上 『TensotFlow』基础RNN网络回归问题 『TensotFlow』RNN中 ...

随机推荐

  1. DP模拟题

    Smiling & Weeping ----寒灯纸上,梨花雨凉,我等风雪又一年 # [NOIP2007 普及组] 守望者的逃离 ## 题目背景 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深 ...

  2. SpringBoot使用@Async注解8大坑点

    前言 SpringBoot中,@Async注解可以实现异步线程调用,用法简单,体验舒适. 但是你一定碰到过异步调用不生效的情况,今天,我就列出90%的人都可能会遇到的8大坑点. 正文 1.未启用异步支 ...

  3. 2023 ICPC 网络赛 I

    没留够时间准备导致开考的时候耽搁了 开场我先写缺省源,抄串了一行,后面才发现...然后看了 L 发现是签到,此时 ddw 会了 A 让 zsy 上去写,我等了一会才把 zsy 撵下来写 L 是个失误 ...

  4. 秋招还没Offer怎么办?

    如果你是双非院线.没有实习经历.没有出众的技术(算法没刷一千道,也没做过 Spring Cloud 项目).现在还没有面试(或只有少量的面试).并且目前还没有 Offer,那么恭喜你,你和目前大部分同 ...

  5. Python基础——数字类型int与float、字符串、列表、元组、字典、集合、可变类型与不可变类型、数据类型总结

    文章目录 一 引子 二 数字类型int与float 2.1 定义 2.2 类型转换 2.3 使用 三 字符串 3.1 定义: 3.2 类型转换 3.3 使用 3.3.1 优先掌握的操作 3.3.2 需 ...

  6. ubuntu实时查看网速

    可以使用ifstat这个命令 安装 apt install ifstat   1 使用,直接打命令就行 ifstat

  7. linux的认知与基本命令

    一.linux的了解 1. 什么是Linux?       a,Linux是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布.它主要受到Mi ...

  8. CMake中添加 -lpthread 编译参数

    问题:当在linux命令行中编译关于进程/线程的源文件时,需要加上 -lpthread 参数动态链接线程库而在CMake中如何加入呢? 方法:只需在 add_executable() 命令前面加上以下 ...

  9. 04-Shell字符串变量

    1. 字符串变量的三种方式 字符串(String)就是一系列字符的组合.字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了) 单引号方式 双引号方式, 推荐 不用引号 ...

  10. WPF 笔迹算法 从点集转笔迹轮廓

    本文将告诉大家一些笔迹算法,从用户输入的点集,即鼠标轨迹点或触摸轨迹点等,转换为一个可在界面绘制显示笔迹画面的基础数学算法.尽管本文标记的是 WPF 的笔迹算法,然而实际上本文更侧重基础数学计算,理论 ...