Python 全栈体系【四阶】(五)

第四章 机器学习

三、数据预处理

1. 数据预处理的目的

去除无效数据、不规范数据、错误数据

补齐缺失值

对数据范围、量纲、格式、类型进行统一化处理,更容易进行后续计算

2. 预处理方法

2.1 标准化(均值移除)

让样本矩阵中的每一列的平均值为 0,标准差为 1。如有三个数 a, b, c,则平均值为:

m = ( a + b + c ) / 3 a ′ = a − m b ′ = b − m c ′ = c − m m = (a + b + c) / 3 \\ a' = a - m \\ b' = b - m \\ c' = c - m m=(a+b+c)/3a′=a−mb′=b−mc′=c−m

预处理后的平均值为 0:

( a ′ + b ′ + c ′ ) / 3 = ( ( a + b + c ) − 3 m ) / 3 = 0 (a' + b' + c') / 3 =( (a + b + c) - 3m) / 3 = 0 (a′+b′+c′)/3=((a+b+c)−3m)/3=0

预处理后的标准差:

s = s q r t ( ( ( a − m ) 2 + ( b − m ) 2 + ( c − m ) 2 ) / 3 ) s = sqrt(((a - m)^2 + (b - m)^2 + (c - m)^2)/3) s=sqrt(((a−m)2+(b−m)2+(c−m)2)/3)

a ′ ′ = a / s a'' = a / s a′′=a/s

b ′ ′ = b / s b'' = b / s b′′=b/s

c ′ ′ = c / s c'' = c / s c′′=c/s

s ′ ′ = s q r t ( ( ( a ′ / s ) 2 + ( b ′ / s ) 2 + ( c ′ / s ) 2 ) / 3 ) s'' = sqrt(((a' / s)^2 + (b' / s) ^ 2 + (c' / s) ^ 2) / 3) s′′=sqrt(((a′/s)2+(b′/s)2+(c′/s)2)/3)

= s q r t ( ( a ′ 2 + b ′ 2 + c ′ 2 ) / ( 3 ∗ s 2 ) ) =sqrt((a'^2 + b'^2 + c'^2) / (3 *s ^2)) =sqrt((a′2+b′2+c′2)/(3∗s2))
= 1 =1 =1

标准差:又称均方差,是离均差平方的算术平均数的平方根,用 σ 表示 ,标准差能反映一个数据集的离散程度。

代码示例:

# 数据预处理之:均值移除示例
import numpy as np
import sklearn.preprocessing as sp# 样本数据
raw_samples = np.array([[3.0, -1.0, 2.0],[0.0, 4.0, 3.0],[1.0, -4.0, 2.0]
])
print(raw_samples)
print(raw_samples.mean(axis=0))  # 求每列的平均值
print(raw_samples.std(axis=0))  # 求每列标准差std_samples = raw_samples.copy()  # 复制样本数据
for col in std_samples.T:  # 遍历每列col_mean = col.mean()  # 计算平均数col_std = col.std()  # 求标准差col -= col_mean  # 减平均值col /= col_std  # 除标准差print(std_samples)
print(std_samples.mean(axis=0))
print(std_samples.std(axis=0))
"""
[[ 3. -1.  2.][ 0.  4.  3.][ 1. -4.  2.]]
[ 1.33333333 -0.33333333  2.33333333]
[1.24721913 3.29983165 0.47140452]
[[ 1.33630621 -0.20203051 -0.70710678][-1.06904497  1.31319831  1.41421356][-0.26726124 -1.1111678  -0.70710678]]
[ 5.55111512e-17  0.00000000e+00 -2.96059473e-16]
[1. 1. 1.]
"""

也可以通过 sklearn 提供 sp.scale 函数实现同样的功能,如下面代码所示:

std_samples = sp.scale(raw_samples) # 求标准移除
print(std_samples)
print(std_samples.mean(axis=0))
print(std_samples.std(axis=0))
"""
[[ 1.33630621 -0.20203051 -0.70710678][-1.06904497  1.31319831  1.41421356][-0.26726124 -1.1111678  -0.70710678]]
[ 5.55111512e-17  0.00000000e+00 -2.96059473e-16]
[1. 1. 1.]
"""
2.2 范围缩放

将样本矩阵中的每一列最小值和最大值设定为相同的区间,统一各特征值的范围.如有 a, b, c 三个数,其中 b 为最小值,c 为最大值,则:

a ′ = a − b a' = a - b a′=a−b

b ′ = b − b b' = b - b b′=b−b

c ′ = c − b c' = c - b c′=c−b

缩放计算方式如下公式所示:

a ′ ′ = a ′ / c ′ a'' = a' / c' a′′=a′/c′

b ′ ′ = b ′ / c ′ b'' = b' / c' b′′=b′/c′

c ′ ′ = c ′ / c ′ c'' = c' / c' c′′=c′/c′

计算完成后,最小值为 0,最大值为 1。以下是一个范围缩放的示例。

# 数据预处理之:范围缩放
import numpy as np
import sklearn.preprocessing as sp# 样本数据
raw_samples = np.array([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0],[7.0, 8.0, 9.0]]).astype("float64")# print(raw_samples)
mms_samples = raw_samples.copy()  # 复制样本数据for col in mms_samples.T:col_min = col.min()col_max = col.max()col -= col_mincol /= (col_max - col_min)
print(mms_samples)"""
[[0.  0.  0. ][0.5 0.5 0.5][1.  1.  1. ]]
"""

也可以通过 sklearn 提供的对象实现同样的功能,如下面代码所示:

# 根据给定范围创建一个范围缩放器对象
mms = sp.MinMaxScaler(feature_range=(0, 1))# 定义对象(修改范围观察现象)
# 使用范围缩放器实现特征值范围缩放
mms_samples = mms.fit_transform(raw_samples) # 缩放
print(mms_samples)
"""
[[0.  0.  0. ][0.5 0.5 0.5][1.  1.  1. ]]
"""

执行结果:

[[0.  0.  0. ][0.5 0.5 0.5][1.  1.  1. ]]
[[0.  0.  0. ][0.5 0.5 0.5][1.  1.  1. ]]

3. 归一化 Normalize

反映样本所占比率。
用每个样本的每个特征值,除以该样本各个特征值绝对值之和。
变换后的样本矩阵,每个样本的特征值绝对值之和为 1。
例如如下反映编程语言热度的样本中,2018 年也 2017 年比较,Python 开发人员数量减少了 2 万,但是所占比率确上升了:

年份Python(万人)Java(万人)PHP(万人)
201710205
20188101

归一化预处理示例代码如下所示:

# 数据预处理之:归一化
import numpy as np
import sklearn.preprocessing as sp# 样本数据
raw_samples = np.array([[10.0, 20.0, 5.0],[8.0, 10.0, 1.0]
])
print(raw_samples)
nor_samples = raw_samples.copy()  # 复制样本数据for row in nor_samples:row /= abs(row).sum()  # 先对行求绝对值,再求和,再除以绝对值之和print(nor_samples) # 打印结果
"""
[[10. 20.  5.][ 8. 10.  1.]]
[[0.28571429 0.57142857 0.14285714][0.42105263 0.52631579 0.05263158]]
"""

在 sklearn 库中,可以调用 sp.normalize()函数进行归一化处理,函数原型为:

sp.normalize(原始样本, norm='l2')
# l1: l1范数,除以向量中各元素绝对值之和
# l2: l2范数,除以向量中各元素平方之和

使用 sklearn 库中归一化处理代码如下所指示:

nor_samples = sp.normalize(raw_samples, norm='l1')
print(nor_samples) # 打印结果
"""
[[0.28571429 0.57142857 0.14285714][0.42105263 0.52631579 0.05263158]]
"""

4. 二值化

根据一个事先给定的阈值,用 0 和 1 来表示特征值是否超过阈值.以下是实现二值化预处理的代码:

# 二值化
import numpy as np
import sklearn.preprocessing as spraw_samples = np.array([[65.5, 89.0, 73.0],[55.0, 99.0, 98.5],[45.0, 22.5, 60.0]])
bin_samples = raw_samples.copy()  # 复制数组
# 生成掩码数组
mask1 = bin_samples < 60
mask2 = bin_samples >= 60
# 通过掩码进行二值化处理
bin_samples[mask1] = 0
bin_samples[mask2] = 1print(bin_samples)  # 打印结果
"""
[[1. 1. 1.][0. 1. 1.][0. 0. 1.]]
"""

同样,也可以利用 sklearn 库来处理:

bin = sp.Binarizer(threshold=59) # 创建二值化对象(注意边界值)
bin_samples = bin.transform(raw_samples) # 二值化预处理
print(bin_samples)
"""
[[1. 1. 1.][0. 1. 1.][0. 0. 1.]]
"""

二值化编码会导致信息损失,是不可逆的数值转换。如果进行可逆转换,则需要用到独热编码。

5. 独热编码

根据一个特征中不重复值的个数来建立一个由一个 1 和若干个 0 组成的序列,用来序列对所有的特征值进行编码。例如有如下样本:

[ 1 3 2 7 5 4 1 8 6 7 3 9 ] \left[ \begin{matrix} 1 & 3 & 2\\ 7 & 5 & 4\\ 1 & 8 & 6\\ 7 & 3 & 9\\ \end{matrix} \right] ​1717​3583​2469​ ​

对于第一列,有两个值,1 使用 10 编码,7 使用 01 编码

对于第二列,有三个值,3 使用 100 编码,5 使用 010 编码,8 使用 001 编码

对于第三列,有四个值,2 使用 1000 编码,4 使用 0100 编码,6 使用 0010 编码,9 使用 0001 编码

编码字段,根据特征值的个数来进行编码,通过位置加以区分.通过独热编码后的结果为:

[ 10 100 1000 01 010 0100 10 001 0010 01 100 001 ] \left[ \begin{matrix} 10 & 100 & 1000\\ 01 & 010 & 0100\\ 10 & 001 & 0010\\ 01 & 100 & 001\\ \end{matrix} \right] ​10011001​100010001100​100001000010001​ ​

使用 sklearn 库提供的功能进行独热编码的代码如下所示:

# 独热编码示例
import numpy as np
import sklearn.preprocessing as spraw_samples = np.array([[1, 3, 2],[7, 5, 4],[1, 8, 6],[7, 3, 9]])one_hot_encoder = sp.OneHotEncoder(sparse=False, # 是否采用稀疏格式dtype="int32",categories="auto")# 自动编码
oh_samples = one_hot_encoder.fit_transform(raw_samples) # 执行独热编码
print(oh_samples)print(one_hot_encoder.inverse_transform(oh_samples)) # 解码

执行结果:

[[1 0 1 0 0 1 0 0 0][0 1 0 1 0 0 1 0 0][1 0 0 0 1 0 0 1 0][0 1 1 0 0 0 0 0 1]][[1 3 2][7 5 4][1 8 6][7 3 9]]

6. 标签编码

根据字符串形式的特征值在特征序列中的位置,来为其指定一个数字标签,用于提供给基于数值算法的学习模型。

代码如下所示:

# 标签编码
import numpy as np
import sklearn.preprocessing as spraw_samples = np.array(['audi', 'ford', 'audi','bmw','ford', 'bmw'])lb_encoder = sp.LabelEncoder() # 定义标签编码对象
lb_samples = lb_encoder.fit_transform(raw_samples) # 执行标签编码
print(lb_samples)print(lb_encoder.inverse_transform(lb_samples)) # 逆向转换

执行结果:

[0 2 0 1 2 1]
['audi' 'ford' 'audi' 'bmw' 'ford' 'bmw']

四、练习

1. 判断以下哪个是回归问题,哪个是分类问题,哪个是聚类问题。

  • 判断一封邮件是否为垃圾邮件(分类)

  • 在图像上检测出人脸的位置(回归,预测 x,y,w,h 四个值,每个值都是连续的)

  • 视频网站根据用户观看记录,找出喜欢看战争电影的用户(聚类)

2. 分类和聚类主要区别是什么?

  • 分类是有监督学习,聚类是无监督学习

3. 判断以下哪些是数据降维问题

  • 将 8*8 的矩阵缩小为 4*4 的矩阵(是)
  • 将二维矩阵变形为一维向量(是)
  • 将高次方程模型转换为低次方程模型(是)

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

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

相关文章

在Linux上配置全局HTTP代理的详细步骤

Linux简介 Linux是开源的一类Unix操作系统&#xff0c;广泛评价服务器和嵌入式系统。它具有稳定性高、安全性好、性能可靠等特点&#xff0c;因此在网络爬虫等领域也有广泛的应用。 Linux 爬虫使用场景 在网络爬虫应用中&#xff0c;Linux系统稳定性和灵活性而备受青睐。爬虫程…

51单片机控制1602LCD字符滚动三

51单片机控制1602LCD字符滚动三 1.概述 这篇文章介绍单片机控制1602LCD屏幕上的字符滚动显示 2.字符滚动 2.1.第一种方式 使用LCD内置指令设置整屏左移或者右移&#xff0c;在读入字符时每读一个字符都要有个延迟&#xff0c;否则会因为速度太快&#xff0c;看到屏幕上就是…

微服务保护--熔断降级

1.熔断降级介绍 熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例&#xff0c;如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求&#xff1b;而当服务恢复时&#xff0c;断路器会放行访问该服务的请求。 断路器控制熔断和放行…

3小时快速入门自动化测试 —— Selenium测试工具

自动化测试 自动化测试简单来说就是利用自动化测试工具和自动化测试脚本来完成指定的测试任务&#xff0c;测试启动过程无需人工参与&#xff0c;但自动化测试之前的准备工作需要人工手动配置好。它是一种将重复性、繁琐的测试任务交给计算机自动执行的方法&#xff0c;能够显…

ansible crontab任务管理 —— 筑梦之路

添加一个定时任务 # ansible-playbook.yml --- - name: Manage crontabhosts: your_target_hoststasks:- name: Add crontab entrycron:name: "rsync backup"minute: "0"hour: "2"job: "/path/to/your/backup_script.sh" your_target…

安恒明御安全网关 aaa_local_web_preview文件上传漏洞复现

0x01 产品简介 明御安全网关秉持安全可视、简单有效的理念,以资产为视角,构建全流程防御的下一代安全防护体系,并融合传统防火墙、入侵检测、入侵防御系统、防病毒网关、上网行为管控、VPN网关、威胁情报等安全模块于一体的智慧化安全网关。 0x02 漏洞概述 明御安全网关在…

【采坑分享】npm login/publish/whoami失败采坑,解决npmERR426、ETIMEDOUT、ECONNREFUSED等错误

目录 前言背景&#xff1a; 采坑之路&#xff1a; 1.修改https为http&#xff0c;问题还在 2.修改为淘宝镜像&#xff0c;问题还在 3.修改为官网地址&#xff0c;问题还在 4.升级node和npm&#xff0c;问题还在 5.猜想网络问题&#xff0c;问题解决 采坑总结&#xff1a…

HTTP 414错误:请求URI过长,如何避免

在Web开发中&#xff0c;HTTP状态码是用于表示Web服务器响应的各种状态。其中&#xff0c;HTTP 414错误表示请求URI过长&#xff0c;这意味着客户端发送的请求URL超过了服务器所能处理的长度限制。 当请求的URI过长时&#xff0c;服务器可能无法正确处理请求&#xff0c;从而导…

Spring批量加载Resource目录下的文件

项目中的配置文件用json方式存储在了resources下面的文件夹下面。如下&#xff1a; 在代码里面需要将他们全部读出来。 但是ClassLoader.getResource 只能读取单个文件&#xff0c;不能读取文件列表。然后就想到了 mybatis 同样也是要读配置文件列表&#xff0c;就想看看 myba…

01-EEA电子电器架构

1.背景 汽车正在从传统的机械装置逐步电气化&#xff0c;汽车电子电气功能不断的丰富。越来越多的电气系统和功能被集成到汽车上&#xff0c;传统的原理及线束设计已经远远不能满足。为此&#xff0c;EEA(电子电气架构)应运而生。如何设计电子电气架构&#xff0c;满足日益增长…

字符串——OJ题

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、字符串相加1、题目讲解2、思路讲解3、代码实现 二、仅仅反转字母1、题目讲解2、思路讲解3…

前端面试CSS知识点

目录 前言 一、块级元素、行内元素和行内块元素的区别 1. 块级元素-display:block 1.1.1 常见的块级元素 1.1.2 块级元素的特点 2. 行内元素-display-inline 2.1.1 常见的行内元素 2.1.2 行内元素的特点 3. 行内块元素-display:inline-block 3.1.1 常见的行内块元素 3.1.2 行内…

docker搭建gitlab

1. 搭建gitlab # 1. 获取镜像 docker pull gitlab/gitlab-ce:latest# 2. 创建并启动容器 # 映射了2个端口&#xff0c;都是需要用到的 docker run -itd -p 9980:80 -p 9922:22 --restart always --privilegedtrue --name gitlab gitlab/gitlab-ce # 进入容器 docker exec -it …

媒体直播平台有哪些,活动直播如何扩大曝光?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体直播平台包括人民视频、新华社现场云、中国网、新浪新闻直播、搜狐视频直播、凤凰新闻直播、腾讯新闻直播等。活动直播想要扩大曝光&#xff0c;可以考虑以下方式&#xff1a; 1.选择…

Nginx七层代理,四层代理 + Tomcat多实例部署

目录 1.tomcat多实例部署 准备两台虚拟机 进入pc1 pc2同时安装jdk 进入pc1 pc2安装tomcat PC1配置&#xff08;192.168.88.50&#xff09; 安装tomcat多实例 tomcat2中修改端口 启动tomcat1 tomcat2 分别在三个tomcat服务上部署jsp的动态页面 2.nginx的七层代理&…

Logistic 回归算法

Logistic 回归 Logistic 回归算法Logistic 回归简述Sigmoid 函数Logistic 回归模型表达式求解参数 $\theta $梯度上升优化算法 Logistic 回归简单实现使用 sklearn 构建 Logistic 回归分类器Logistic 回归算法的优缺点 Logistic 回归算法 Logistic 回归简述 Logistic 回归是一…

ros2+xml格式launch文件示例代码(重要内容)

源自githubeasy_ros2_launch_talk/easy_launch_demo/launch/demo_launch.xml at main tylerjw/easy_ros2_launch_talk GitHub <launch><arg name"robot_ip" default"xxx.yyy.zzz.www" /><arg name"use_fake_hardware" default…

【Spring】07 懒加载

文章目录 1.定义2. 作用3. 配置方式1&#xff09;XML配置2&#xff09;Java配置3&#xff09;注解方式 4. 应用场景5. 注意事项总结 1.定义 懒加载&#xff08;Lazy Initialization&#xff09;是Spring 框架中的一项强大的特性&#xff0c;它允许我们推迟 Bean 的初始化&…

直播源自动检测工具iptv-m3u-maker

【申明】&#xff1a;本文不提供任何播放列表或其他数字内容。屏幕截图中的频道和图片仅供演示和说明之用。 老苏以前介绍过 IPTV Checker &#xff0c;能对直播源进行有效性检测 文章传送门&#xff1a;用Jellyfin➕xTeVe播放和录制IPTV 今天要介绍的 iptv-m3u-maker 功能是一…

python学习1补充

大家好&#xff0c;这里是七七&#xff0c;这个专栏是用代码实例来学习的&#xff0c;不是去介绍很多知识的。 话不多说&#xff0c;开始今天的内容 目录 代码1 代码2 代码3 代码4 代码5 学习1的总代码 代码1 groupeddf.groupby(单品编码) result{} groupeddf.groupb…