机器学习(二) -- 数据预处理(2)

系列文章目录

机器学习(一) -- 概述

机器学习(二) -- 数据预处理(1-3)

未完待续……


目录

系列文章目录

前言

四、【数据清洗】

1、缺失数据的检测与处理

1.1、检测与统计

1.2、处理

1.2.1、删除缺失值(慎用)

1.2.2、填充缺失值

2、异常数据的检测与处理

2.1、检测

2.1.1、散点图方法

2.1.2、箱线图分析

2.1.3、3σ法则

2.2、处理

2.2.1、不处理

2.2.2、删除

2.2.3、修改

2.2.4、转换

3、重复数据的检测与处理

3.1、记录重复

3.2、特征重复


机器学习(二) -- 数据预处理(1)

机器学习(二) -- 数据预处理(3)


前言

tips:这里只是总结,不是教程哈。本章开始会用到numpy,pandas以及matplotlib,这些就不在这讲了哈。

“***”开头的是给好奇心重的宝宝看的,其实不太重要可以跳过。

此处以下所有内容均为暂定,因为我还没找到一个好的,让小白(我自己)也能容易理解(更系统、嗯应该是宏观)的讲解顺序与方式。

第一文主要简述了一下机器学习大致有哪些东西(当然远远不止这些),对大体框架有了一定了解。接着我们根据机器学习的流程一步步来学习吧,掐掉其他不太用得上我们的步骤,精练起来就4步(数据预处理,特征工程,训练模型,模型评估),其中训练模型则是我们的重头戏,基本上所有算法也都是这一步,so,这个最后写,先把其他三个讲了,然后,在结合这三步来进行算法的学习,兴许会好点(个人拙见)。


四、【数据清洗】

数据异常大致分为三种情况,缺失数据、异常数据(噪声数据)、重复数据。

通过填写缺失的值、光滑噪声数据、识别或删除离群点并解决不一致性来“清理”数据。主要是达到如下目标:格式标准化,异常数据清除,错误纠正,重复数据的清除。

1、缺失数据的检测与处理

1.1、检测与统计

1.1.1、利用isnull()函数

(只是想查看每列的缺失值情况,info()更方便)

测试数据:

# 检测
print('data中元素是否为空:\n', data.isnull())
# print('data中元素是否为非空:\n', data.notnull())# 统计
print('data中每个特征对应的非空值数为:\n', data.count())
# print('data中每个特征对应的非空值数为:\n', data.notnull().sum())
print('data中每个特征对应的缺失率为:\n', 1-data.count()/len(data))# print('data中总非空值数为:\n', data.count().sum())
# # print('data中为空值的总个数:\n',data.isnull().sum().sum())
# print('data中总缺失率为:\n', 1-data.count().sum()/(len(data)*len(data.columns)))

结果:isnill()和notnull()对每个值进行判断,并给出结果(备注掉的有些结果是一样的,就是写法不同,可以参考一下,发散一下思维。)

1.1.2、利用info()函数
# 缺失值的统计
# 利用info()方法查看DataFrame的缺失值
print(data.info())

info()就比较直接了,

第一行,告诉我们“data”是一个DataFrame对象

第二行,告诉我们样本范围有4个,从0到3

第三行以及表格,告诉我们有4列(每列一个特征),每个特征的非缺失值情况,如feature2有3个非缺失值

(其他的···请字面理解,也不重要)

1.2、处理

1.2.1、删除缺失值(慎用)
# 删除缺失值
data1=data.dropna()
print(data1)

dropna()函数:删除具有缺失值的行。

        how:确定缺失值个数,默认how='any’表明,只要某行有缺失值就将该行丢弃;

                  how='all’表明某行全部为缺失值才将其丢弃。

.dropna(axis = 0,how = 'any', thresh = None, subset = None, inplace = False)
1.2.2、填充缺失值

一般用该列平均值填充(当然还有其他很多方法,用0、最大值、中位数、拉格朗日插值等等填充)

# 填充缺失值
data2=data.fillna(1)
# data2=data.replace(np.nan,1)
print(data2)data2=data.fillna(data.mean())
print(data2)

fillna():缺失值替换。

        value:用于填充缺失值的标量值或字典对象

        method:插值方式,ffill向前填充(向下,front fill),bfill向后填充(向上,back fill)

.fillna(value=None,method=None,axsi=None,inplace=False,limit=None)
# 填充缺失值
# 向后填充
data3=data.fillna(method='bfill')
print(data3)data3.iloc[2,2]=None
print(data3)# 向前填充
data4=data3.fillna(method='ffill')
print(data4)

2、异常数据的检测与处理

2.1、检测

2.1.1、散点图方法
# 测试数据制作
data=pd.DataFrame(np.arange(12),columns=['x'])
data['y']=data['x']*1.2+1.2
data.iloc[1,1]=134
data.iloc[6,1]=143
print(data)

一目了然,有没有。

# 绘图法
plt.scatter(data['x'],data['y'],c='k',marker='.')
# plt.scatter(data.iloc[:,0],data.iloc[:,1],c='k',marker='.')

2.1.2、箱线图分析

原理与概念:

5个四分位点:数值大小从小到大排序,分别在开头(最小),25%位置的数(下四分位),中位数,75%位置的值(上四分位),结尾(最大值)的值,分别为Q0,Q1,Q2,Q3,Q4

四分位距(IQR):Q3-Q1得到的数

然后将最大、最小值设置为min=Q1-1.5IQR,max=Q3+1.5IQR,不在[min,max]的值被认为是异常值。

# 利用箱型图的四分位距(IQR)对异常值进行检测
Percentile = np.percentile(data['y'], [0, 25, 50, 75, 100])  # 计算百分位数
IQR = Percentile[3] - Percentile[1]  # 计算箱型图四分位距
UpLimit = Percentile[3]+IQR*1.5  # 计算临界值上界
DownLimit = Percentile[1]-IQR*1.5  # 计算临界值下界# 判断异常值,大于上界或小于下界的值即为异常值
abnormal = [i for i in data['y'] if i >UpLimit or i < DownLimit] 
print('IQR检测出的y中异常值为:\n', abnormal)
print('IQR检测出的异常值比例为:\n', len(abnormal)/len(data['y']))

2.1.3、3σ法则

这玩意就和数学的正态分布有关了,

简单来讲,超出的【μ±3σ】的值就为异常值。(μ是均值,σ是标准差)

data.iloc[1,1]=2.4
# 利用3sigma原则对异常值进行检测
y_mean = data['y'].mean()  # 计算均值
y_std = data['y'].std()  # 计算标准差UpLimit = y_mean+y_std*3  # 计算临界值上界
DownLimit =  y_mean-y_std*3  # 计算临界值下界y_cha = data['y'] - y_mean  # 计算元素与平均值之差# 返回异常值所在位置
ind = [i for i in range(len(y_cha)) if np.abs(y_cha[i])>y_std*3]abnormal = [data['y'][i] for i in ind]  # 返回异常值
print('3sigma原则检测出的y中异常值为:\n', abnormal)
print('3sigma原则检测出的异常值比例为:\n', len(abnormal)/len(data['y']))

之所以我要修改上面,有一个异常值的数据,是因为我这里数据量太少,异常值又大占比也偏高,出现了设置成3σ不判定为异常值的情况。所以,使他只有一个异常值,来检测异常效果。(实际操作中异常值比例应该没有这么大,我这2/12了都,直接两个大异常值,把标准差拉到了50+,笑不活了QwQ)

这也可以用计算临界值的方法,大同小异哈。

2.2、处理

2.2.1、不处理

身为一条咸鱼,是躺床上起床上厕所都觉得累的!咱就啥都不干!!!

2.2.2、删除

这是pandas里面的操作方法哈

# 删除异常值
# print(data)
data1=data[~(np.abs(y_cha)>y_std*3)]# 删的是有异常值的一行哈
print(data1)

2.2.3、修改

一般修改为阈值或中值。(当然,也可以是其他的视情况而定,比如可以按照缺失值处理,插入各种值。这里复制一个data2是防止吧data里面的数据修改了,后面还要用呢,节约是中华民族的传统美德)

# 修改异常值
data2=data.iloc[:,:]for i in ind:if data2.iloc[i,1]>UpLimit:data2.iloc[i,1]=UpLimitif data2.iloc[i,1]<DownLimit:data2.iloc[i,1]=DownLimitprint("临界值上界:",UpLimit,"临界值下界:",DownLimit)
print(data2)

2.2.4、转换

当当当当,看异常值得差异是不是小了很多。但这种使用情况极少,慎用。

# 异常值的对数转换
log_y=np.log(data['y'])
print(log_y)

3、重复数据的检测与处理

重复数据有两种情况,一种是记录重复(整行重复),一种是特征重复(某个值重复)

3.1、记录重复

一个或多个特征列的几条记录完全一致,对于记录重复数据。一般采用直接删除方式

3.1.1、检测
# 制作数据
data=pd.DataFrame([[1,'gxy',88,70,'B'],[2,'zqx',59,90,'B'],[3,'ysy',91,95,'A'],[2,'zqx',59,90,'B'],[4,'xyyz',44,64,'C']],columns=['num','name','English','Python','level'])
print(data)

# 检测
result=data.duplicated()
print(result)

3.1.2、处理
# 处理
data1=data.drop_duplicates()
print(data1)

3.2、特征重复

一个或多个特征名不同,但是数据完全一样。

3.2.1、检测
# 制作数据
data=pd.DataFrame([[1,'gxy',88,70,1,'B'],[2,'zqx',59,90,2,'B'],[3,'ysy',91,95,3,'A'],[4,'xyyz',44,64,4,'C']],columns=['num','name','English','Python','idCard','level'])
print(data)

#检测
result=data.corr(method='pearson',min_periods=1)
print(result)

 corr函数检测相似度,相似度为1,表示两列数据一模一样

3.2.2、处理
# 处理
data1=data[:]del data1['idCard']
print(data1)# 2
data1=data.iloc[:,[0,1,2,3,5]]
print(data1)

欲知后事如何,且看:机器学习(二) -- 数据预处理(3)​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postgresql源码(119)PL/pgSQL中ExprContext的生命周期

前言 在PL/pgSQL语言中&#xff0c;执行任何SQL都需要通过SPI调用SQL层解析执行&#xff0c;例如在SQL层执行表达式的入口&#xff1a; static bool exec_eval_simple_expr(PLpgSQL_execstate *estate,PLpgSQL_expr *expr,Datum *result,bool *isNull,Oid *rettype,int32 *re…

助力成长的开源项目 —— 筑梦之路

闯关式 SQL 自学&#xff1a;sql-mother 免费的闯关式 SQL 自学教程网站&#xff0c;从 0 到 1 带大家掌握常用 SQL 语法&#xff0c;目前一共有 30 多个关卡&#xff0c;希望你在通关的时候&#xff0c;变身为一个 SQL 高手。除了闯关模式之外&#xff0c;这个项目支持自由选…

VuePress、VuePress-theme-hope 搭建个人博客 1【快速上手】 —— 防止踩坑篇

vuePress官网地址 &#x1f449; 首页 | VuePress 手动安装 这一章节会帮助你从头搭建一个简单的 VuePress 文档网站。如果你想在一个现有项目中使用 VuePress 管理文档&#xff0c;从步骤 3 开始。 步骤 1: 创建并进入一个新目录 mkdir vuepress-starter cd vuepress-star…

创建x11vnc系统进程

为方便使用vnc&#xff0c;所以寻找到一个比较好用的vnc服务端那就是x11vnc&#xff0c;索性就创建了一个系统进程 一、环境 系统&#xff1a;银河麒麟v4-sp2-server 软件&#xff1a;x11vnc【linux下】、VNCviewer【win下】 二、安装x11vnc 1、挂载光盘源并修改apt源 mou…

用可视化案例讲Rust编程1. 怎么能学会Rust

用可视化案例讲Rust编程 1. 怎么能学会Rust 如果要列举Rust的优势&#xff0c;恐怕写个十条八条是写不完的&#xff0c;而且不管写哪条优势&#xff0c;都有很多同学跳起来反驳&#xff0c;比如我们说Rust比C/C内存安全&#xff0c;肯定有同学说C 20也支持内存安全&#xff0…

message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogra

第一步&#xff1a;修改 project.config.json 文件 "packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./miniprogram/"}], "packNpmManually": true 第二步&#xff1a;…

机器人活动区域 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 现有一个机器人,可放置于 M x N 的网格中任意位置,每个网格包含一个非负整数编号,当相邻网格的数字编号差值的绝对值小于等于 1 时机器人可以在网格间移动。 问题: 求机器人可活动的最大范围对应的网格点数目。 说明: 网格…

Android Studio xml布局代码补全功能失效问题

这里写目录标题 前言&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;1.更新 Android Studio 版本2.原版本解决XML补全失效 小结 前言&#xff1a; 在开发过程中&#xff0c;你可能遇到很多奇奇怪怪的问题。Android Studio 编译器出现问题也是常有的事情&#x…

单片机开发--keil5

一.keil5 Keil uVision5是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于对嵌入式系统中的微控制器进行编程。它是一个软件套件&#xff0c;包括源代码编辑器、项目经理、调试器以及微控制器开发、调试和编程所需的其他工具。Keil uVision5 IDE主要用于对基于A…

线性代数基础知识

计算机视觉一些算法中常会用到线性代数的一些知识&#xff0c;为了便于理解和快速回忆&#xff0c;博主这边对常用的一些知识点做下整理&#xff0c;主要来源于如下这本书籍。 1. 矩阵不仅仅是数字排列而已&#xff0c;不然也不会有那么大精力研究它。其可以表示一种映射 关于…

Linux Debian12安装和使用ImageMagick图像处理工具 常见图片png、jpg格式转webp格式

一、ImageMagick简介 ImageMagick是一套功能强大、稳定而且免费的工具集和开发包。可以用来读、写和图像格式转换&#xff0c;可以处理超过100种图像格式&#xff0c;包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式。对图片的操作&#xff0c;即可以通过命令行进行&am…

Bert模型from_pretrained报网络错误解决办法

问题描述&#xff1a; 服务器或者本地运行以下代码时报网络连接错误&#xff1a; from transformers import AutoTokenizermodel_checkpoint "distilbert-base-uncased" tokenizer AutoTokenizer.from_pretrained(model_checkpoint, use_fastTrue, cache_dir./cac…

python解决一维动态规划问题,寻找丑数

对于一维动态规划问题中&#xff0c;还有一个可能会经常遇到的问题&#xff0c;就是寻找丑数。 对于丑数的概念是&#xff0c;把只包含质因子2、3和5的数称作丑数&#xff08;Ugly Number&#xff09;。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添…

Vue-响应式数据

一、ref创建基本类型的响应式数据 vue3可以使用ref、reactive去定义响应式数数据。 知识点汇总 使用ref需要先引入ref&#xff0c;import {ref} from vue在模板 template 中使用了添加ref 的响应式数据&#xff0c;变量的后面不用添加.value所有js代码里面&#xff0c;去操作r…

【web】vue 播放后端(flask)发送的 mp3 文件

文章目录 演示后端&#xff08;flask&#xff09;前端&#xff08;vue3&#xff09;重要说明 演示 后端&#xff08;flask&#xff09; 后端返回的是 mp3 文件的 url&#xff0c;是可以直接在浏览器上打开后播放的处理跨域请求pip install flask-cors后端代码from flask impor…

Python - 数据结构与算法之 排列与组合

目录 一.引言 二.排列 A-Permute ◆ 定义 ◆ 计算 ◆ 性质 ◆ 实现 三.组合 C-Combine ◆ 定义 ◆ 计算 ◆ 性质 ◆ 实现 四.经典算法题目 1.全排列 [无重复] 2.全排列 [有重复] 3.组合 [可重复] 4.子集 [无重复] 5.子集 [有重复] 五.总结 一.引言 关于排列…

云原生十二问

一、什么是云原生&#xff1f; 云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。现代企业希望构建高度可扩展、灵活且具有弹性的应用程序&#xff0c;可以快速更新以满足客户需求。为此&#xff0c;他们使用现代工具和技术&#xff0c;这些工具和技术本质上支…

科普帖:什么是XaaS-一切皆服务模型(包含10个示例类别)

有时似乎有太多的商业首字母缩写词要记住。随着快速变化的技术进步和云计算的出现&#xff0c;新的类别将不断涌现。XaaS 就是这样一个最新的补充。 该领域的大多数读者都知道SaaS&#xff08;软件即服务&#xff09;、IaaS&#xff08;基础设施即服务&#xff09;和PaaS&…

【CISSP学习笔记】5. 安全架构和工程

该知识领域涉及如下考点&#xff0c;具体内容分布于如下各个子章节&#xff1a; 使用安全设计原理来研究、实施与管理工程过程理解安全模型的基本概念&#xff08;例如 Biba、Star Model、Bell-LaPadula 等模型&#xff09;基于系统安全要求选择控制措施理解信息系统 (IS) 的安…

强大的隐藏应用 Hides 5中文 for mac

Hides 5是一款Mac上的应用程序&#xff0c;旨在帮助用户隐藏其他应用程序并专注于当前任务&#xff0c;从而提高工作效率。其主要功能包括对焦模式、隐藏所有打开的应用程序、隐藏除当前活动应用之外的所有打开的应用程序、支持全局热键、可定制性、支持多种显示方式等。 Hide…