首页 > 其他分享 >【scikit-learn基础】--『预处理』之 缺失值处理

【scikit-learn基础】--『预处理』之 缺失值处理

时间:2023-12-22 12:44:34浏览次数:34  
标签:填充 format -- scikit nan learn np data 缺失

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

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

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

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. 总结

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

标签:填充,format,--,scikit,nan,learn,np,data,缺失
From: https://www.cnblogs.com/wang_yb/p/17921351.html

相关文章

  • 自然语言处理:通过API调用各大公司的机器翻译开放平台
    国内大公司做机器翻译做的比较好的有讯飞和百度,这里给出这两个公司机器翻译的开放平台API的介绍:讯飞开放平台:链接:https://www.xfyun.cn/doc/nlp/xftrans_new/API.html#%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E百度翻译平台:链接:https://api.fanyi.baidu.com/doc/21......
  • 3 句子的成分——谓语
    *******句子的成分(词性的问题) 谓语的词性1>谓语的成分——有时态实意动词 或 系动词Your mother must very beautiful.(错)Your mother must bevery beautiful.(对) 2> 一句话当中动词能不能多?——绝对不能,一句话只能一个动词存在充当谓语,多余的动词全部变......
  • Linux内核在RISC-V架构下的spinlock实现
    riscv没有sev/wfe指令,当前无法在spinlock时省功耗,只能通过while循环不断检查条件。本文分析linux内核下对于spinlock的实现,具体到RISC-V体系结构。由于RISC-V体系结构下目前只是简单的实现了一个基于TAS的最基本的spinlock,本文的另一个附加任务就是分析Linux内核为各个平台下实......
  • 梭梭带你彻底搞懂YAML序列化语言
    目录前言简介yaml基本语法规则yaml支持的数据结构有三种基本语法大小写敏感用缩进表示层级关系用#表示注释一个文件中可以包含多个文件的内容数据结构与类型对象(Mapping)数组(Sequence)标量(Scalars)字符串(String)布尔值(Boolean)整数(Integer)浮点数(FloatingPoint)空(Null)时间戳(Timestamp)......
  • 技术写作与内容研究:主题得分、关键词搜索量、社区和论坛策略
    内容研究内容研究涉及对特定主题进行系统的调查,以收集可靠和相关的信息。这个过程对于技术作者来说至关重要,因为它有助于生成有价值的、准确的、信息丰富的和引人入胜的内容。它超越了基本的互联网搜索,包括阅读技术文档、采访专家、进行调查和分析数据。内容研究应以战略方式进行......
  • 服务器数据恢复-操作系统重装操作失误导致OceanStor存储xfs分区无法访问的数据恢复案
    服务器数据恢复环境:某品牌OceanStorT系列某型号存储+MD1200磁盘柜,组建的raid5磁盘阵列。上层分配了1个lun,安装的linux操作系统,划分两个分区,分区一通过lvm进行扩容,分区二格式化为xfs文件系统。服务器故障:重装系统操作失误导致上层linux操作系统分区改变,XFS文件系统分区由于未知原......
  • 【Powershell】Powershell在远程计算机上执行指令
    开启并配置WinRM被远程机器执行前提:被远程的机器上开启可WinRM如果连接失败;则需要在被远程的机器上运行:Enable-PSRemoting-SkipNetworkProfileCheck-Force验证方法:WinRM处于Running状态防火墙rule处于Allow状态远程机器执行如果远程的计算机没有加入域(这里注意是执行远程指令的机......
  • (亲测)CENTOS 7.9 yum 安装mysql
    CENTOS7安装mysql1、下载MySQL官方的YumRepositorywget-i-chttp://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm2、安装Repositoryyum-yinstallmysql57-community-release-el7-10.noarch.rpm3、更新过期的证书rpm--importhttps://repo.mysq......
  • 243-layui 区域树xmSelect懒加载,且叶子节点有选择时,自动追溯父节点,并展开选中
    varregionData=[]; varurl=ctx+'/base/region/queryByAll'; varrtnRegion=admin.syncReq(url,{parentId:0}); regionData=rtnRegion.data; active.renderRegionData(regionData,regionId); varregionSel=xmSelect.render({ el:'#r......
  • 无涯教程-PL/SQL - 环境设置
    在本章中,无涯教程将讨论PL/SQL的环境设置,PL/SQL不是独立的编程语言,它是Oracle编程环境中的工具,SQL*Plus是一个交互式工具,可让您在命令提示符下键入SQL和PL/SQL语句,然后将这些命令发送到数据库进行处理,处理完语句后,输出将发送回并显示在屏幕上。要运行PL/SQL程序,您应该在计......