数据的标准化和归一化

前面我们已经学习了识别数据缺失值已经对缺失值进行处理的方法,但是KNN的准确率都不是很高,今天我们继续进行数据探索进一步增强机器学习流水线;

通过数据直方图可以看到数据中的列的均值、最大值、最小值等差别很大;

from sklearn.impute import SimpleImputerimputer = SimpleImputer(strategy='mean')
pima_imputed = imputer.fit_transform(pima)
pima_imputed = pd.DataFrame(pima_imputed, columns=pima_column_names)
pima_imputed.hist(figsize=(15, 15))
plt.show()

通过describe方法,从数值上可以看到这个差别;diastolic_blood_pressure列的舒张压在24~122,年龄是21~81;

print(pima_imputed.describe())
#        times_pregnant  plasma_glucose_concentration  diastolic_blood_pressure  triceps_thickness  serum_insulin         bmi  pedigree_function         age  onset_diabetes
# count      768.000000                    768.000000                768.000000         768.000000     768.000000  768.000000         768.000000  768.000000      768.000000
# mean         3.845052                    121.686763                 72.405184          29.153420     155.548223   32.457464           0.471876   33.240885        0.348958
# std          3.369578                     30.435949                 12.096346           8.790942      85.021108    6.875151           0.331329   11.760232        0.476951
# min          0.000000                     44.000000                 24.000000           7.000000      14.000000   18.200000           0.078000   21.000000        0.000000
# 25%          1.000000                     99.750000                 64.000000          25.000000     121.500000   27.500000           0.243750   24.000000        0.000000
# 50%          3.000000                    117.000000                 72.202592          29.153420     155.548223   32.400000           0.372500   29.000000        0.000000
# 75%          6.000000                    140.250000                 80.000000          32.000000     155.548223   36.600000           0.626250   41.000000        1.000000
# max         17.000000                    199.000000                122.000000          99.000000     846.000000   67.100000           2.420000   81.000000        1.000000

在直方图中,让所有的列共享数据轴,可以看到所有的数据尺寸都是不一样的,有一些列已经无法显示图形了;

pima_imputed.hist(figsize=(15, 15), sharey=True, sharex=True)
plt.show()

对于上面的问题,我们可以选用某种归一化操作,在机器学习流水线上处理该问题;归一化操作旨在将行和列对齐并转化为一致的规则;标准化通过确保所有行和列在机器学习中得到平等对待,让数据的处理保持一致。
下边我们将尝试3种数据归一化方法:
❏ z分数标准化;
❏ min-max标准化;
❏ 行归一化。

Z分数标准化

z分数标准化是最常见的标准化技术,利用了统计学里简单的z分数(标准分数)思想。z分数标准化的输出会被重新缩放,使均值为0、标准差为1。通过缩放特征、统一化均值和方差(标准差的平方),可以让KNN这种模型达到最优化,而不会倾向于较大比例的特征。公式很简单,对于每列,用这个公式替换单元格:

z= (x- μ) / σ

我们利用刚才的公式计算plasma_glucose_concentration的z分数;

pgc_std = pima_imputed['plasma_glucose_concentration'].std()
pgc_mean = pima_imputed['plasma_glucose_concentration'].mean()
pgc_z = (pima_imputed['plasma_glucose_concentration']-pgc_mean)/pgc_std
print(pgc_z.head())
# 0    0.864545
# 1   -1.205376
# 2    2.014501
# 3   -1.073952
# 4    0.503130
# Name: plasma_glucose_concentration, dtype: float64

通过直方图可以看到plasma_glucose_concentration处理之前的横轴分布在40到200之间;

pgc_field_name = 'plasma_glucose_concentration'
ax = pima_imputed[pgc_field_name].hist()
ax.set_title('Distribution of pgc')
plt.show()

sklearn提供了StandardScaler来计算z分数;

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
pgc_z_standardized = scaler.fit_transform(pima_imputed[[pgc_field_name]])
print(pgc_z_standardized.mean())
print(pgc_z_standardized.std())
# -3.561965537339044e-16
# 1.0

从处理后的直方图可以看到横轴的分布范围在-2.6到2.6之间,数据分布变密了;

ax = pd.Series(pgc_z_standardized.reshape(-1,)).hist()
ax.set_title('Distribution of pgc after Z Score Scaling')
plt.show()

现在我们对数据集的所有字段都进行z分数计算,然后通过直方图可以看到,横轴的数值分布在-2.5到7.5之间;

scaler = StandardScaler()
pima_imputed_z = pd.DataFrame(scaler.fit_transform(pima_imputed), columns=pima_column_names)
pima_imputed_z.hist(figsize=(15, 15), sharex=True)
plt.show()

我们将StandardScaler插入之前的机器学习流水线中;

onset_field_name = 'onset_diabetes'
knn_params = {'imputer__strategy':['mean', 'median'], 'classify__n_neighbors':[1, 2, 3, 4, 5, 6, 7]}
knn = KNeighborsClassifier()
pipe_z = Pipeline([('imputer', SimpleImputer()), ('standardize', StandardScaler()), ('classify', knn)])
X = pima.drop(onset_field_name, axis=1)
y = pima[onset_field_name]
grid = GridSearchCV(pipe_z, knn_params)
grid.fit(X, y)
print(grid.best_score_, grid.best_params_)# 0.7539173245055598 {'classify__n_neighbors': 7, 'imputer__strategy': 'mean'}

min-max标准化

min-max标准化和z分数标准化类似,因为它也用一个公式替换列中的每个值。此处的公式是:

m=(X-Xmin)/(Xmax-Xmin)

我们使用sklearn内置的MinMaxScaler进行处理,可以看到处理之后最小值都变成了0,最大值都变成了1,这种缩放的副作用是标准差都非常小。这有可能不利于某些模型,因为异常值的权重降低了。

from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()
pima_min_maxed = pd.DataFrame(scaler.fit_transform(pima_imputed), columns=pima_column_names)
print(pima_min_maxed.describe())
#        times_pregnant  plasma_glucose_concentration  diastolic_blood_pressure  triceps_thickness  serum_insulin         bmi  pedigree_function         age  onset_diabetes
# count      768.000000                    768.000000                768.000000         768.000000     768.000000  768.000000         768.000000  768.000000      768.000000
# mean         0.226180                      0.501205                  0.493930           0.240798       0.170130    0.291564           0.168179    0.204015        0.348958
# std          0.198210                      0.196361                  0.123432           0.095554       0.102189    0.140596           0.141473    0.196004        0.476951
# min          0.000000                      0.000000                  0.000000           0.000000       0.000000    0.000000           0.000000    0.000000        0.000000
# 25%          0.058824                      0.359677                  0.408163           0.195652       0.129207    0.190184           0.070773    0.050000        0.000000
# 50%          0.176471                      0.470968                  0.491863           0.240798       0.170130    0.290389           0.125747    0.133333        0.000000
# 75%          0.352941                      0.620968                  0.571429           0.271739       0.170130    0.376278           0.234095    0.333333        1.000000
# max          1.000000                      1.000000                  1.000000           1.000000       1.000000    1.000000           1.000000    1.000000        1.000000

我们将MinMaxScaler插入之前的机器学习流水线中;

knn_params = {'imputer__strategy': ['mean', 'median'], 'classify__n_neighbors': [1, 2, 3, 4, 5, 6, 7]}
knn = KNeighborsClassifier()
pipe_z = Pipeline([('imputer', SimpleImputer()), ('standardize', MinMaxScaler()), ('classify', knn)])
X = pima.drop(onset_field_name, axis=1)
y = pima[onset_field_name]
grid = GridSearchCV(pipe_z, knn_params)
grid.fit(X, y)
print(grid.best_score_, grid.best_params_)
# 0.7630336983278159 {'classify__n_neighbors': 7, 'imputer__strategy': 'median'}

行归一化

行归一化不是计算每列的统计值(均值、最小值、最大值等),而是会保证每行有单位范数(unit norm),意味着每行的向量长度相同。想象一下,如果每行数据都在一个n维空间内,那么每行都有一个向量范数(长度)。
pima数据集有8个字段,可以看做是有8个维度的向量空间,我们可以使用L2范数计算向量的长度;

我们可以利用公式直接计算矩阵的平均范数

pima_l2 = np.sqrt((pima_imputed**2).sum(axis=1))
pima_l2_mean = pima_l2.mean()
print(pima_l2_mean)
# 223.36222025823747

我们使用sklearn内置的Normalizer进行归一化处理,处理之后所有行的范数都是1;

from sklearn.preprocessing  import Normalizernormalizer = Normalizer()
pima_row_normalized = pd.DataFrame(normalizer.fit_transform(pima_imputed), columns= pima_column_names)
pima_row_normalized_l2 = np.sqrt((pima_row_normalized**2).sum(axis=1))
pima_row_normalized_l2_mean = pima_row_normalized_l2.mean()
print(pima_row_normalized_l2_mean)
# 1.0

我们将Normalizer插入之前的机器学习流水线中;

knn_params = {'imputer__strategy': ['mean', 'median'], 'classify__n_neighbors': [1, 2, 3, 4, 5, 6, 7]}
knn = KNeighborsClassifier()
pipe_z = Pipeline([('imputer', SimpleImputer()), ('normalize', Normalizer()), ('classify', knn)])
X = pima.drop(onset_field_name, axis=1)
y = pima[onset_field_name]
grid = GridSearchCV(pipe_z, knn_params)
grid.fit(X, y)
print(grid.best_score_, grid.best_params_)
# 0.6980052627111452 {'classify__n_neighbors': 7, 'imputer__strategy': 'median'}

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

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

相关文章

VT-MRPA1-151-1X/V0/0控制2FRE16模块式模拟放大器

适用于控制带有电气位置反馈的直动式比例减压阀(DBETR- 1X 类型)或带有电气位置反馈的比例流量控制阀(2FRE... 类型);控制值输入 1 0 V(差动输入); 可分别调节“上/下”斜坡时间的斜…

android 13.0 去掉usb授权提示框 默认给予权限

1.概述 在13.0的系统rom产品开发中,在进行iot关于插入usb设备的开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便, 这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限,接下来分析下 相关的实现功能流程 2.去掉u…

两种内网穿透的实现方法

目录 前言: 一、IP和端口的作用 二、公网IP不够用 三、内网穿透实现方法 方法一:设置路由器 方法二:使用某些APP,例如花生壳 前言: 本文会介绍为什么需要使用内网穿透以及实现内网穿透的两种方法 一、IP和端口…

Common.js 和 ES6 Module 中模块引入的区别

CommonJS和ES6 Module CommonJS是一种模块规范,最初被应用于Nodejs,成为Nodejs的模块规范。运行在浏览器端的javaScript由于也缺少类似的规范,在ES6出来之前,前端也实现了一套相同的模块规范(例如:AMD)&am…

mac磁盘管理工具 DiskCatalogMaker中文 for Mac

磁盘管理工具功能介绍 制作光盘 将您的磁盘图标拖放到目录窗口。 通过Roxio Toast Titanium自动添加刻录光盘。更多 对多张光盘使用批量扫描模式。 您也可以使用生成缩略图图像选项。 并请将其快速编目引擎与其他编目人员比较! 下载:DiskCatalogM…

【华为OD题库-064】最小传输时延I-java

题目 某通信网络中有N个网络结点,用1到N进行标识。网络通过一个有向无环图.表示,其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[]{u,v, w),其中u表示源结点,v表示目的结点&#xff0…

CSS-2

结构伪类选择器 作用:根据元素的结构关系查找元素 本例中以 p 标签 查找第一个 p 标签元素 p:first-child{background-color:red; }查找最后一个 p 标签元素 p:last-child{background-color:green; }查找第 666 个 p 标签元素 p:nth-child(666){background-co…

【Linux20.04-qt5.12.4软件安装与初步使用-qt在Linux使用-记录-笔记】

【Linux-qt软件安装与初步使用-qt在Linux使用-记录-笔记】 1、概述2、环境说明3、步骤总结1、了解并选择自己想要安装的版本2、访问 Qt 官方网站3、在 Qt 网站上找到下载部分(自己想下载)4、下载完成后,给安装程序文件赋予执行权限。5、自动配…

PTA 7-238 整数转换为字符串

将一个整数n转换成字符串。例如;输入483,应得到字符串"483"。其中,要求用一个递归函数实现把一个正整数转换为字符串。 输入格式: 首先输入测试组数T,然后输入T组测试数据。每组测试数据输入一个整数n(−231≤n≤231−…

关于svn如何上传一个完整的项目

注意:请一定要按照该步骤进行操作,请上传新项目时将项目名称进行规范命名 例如原始文件是arrange_v2 将此项目需要注入新的医院 则命名为 arrange_某医院名称_门诊或者医技或者药房_v2 重新命名文件夹名称快捷键 (F12) 一 &…

详解卷积神经网络(Convolutional Neural Networks, CNNs)

全连接神经网络基础 全连接神经网络(Fully Connected Neural Network 或 Multi-Layer Perceptron, MLP)是最简单的深度学习模型之一。一个典型的全连接网络由多个层组成,每一层包含多个神经元或节点。每个神经元与上一层的所有神经元相连&am…

论文阅读[2022sigcomm]GSO-Simulcast Global Stream Orchestration in Simulcast Video

GSO-Simulcast Global Stream Orchestration in Simulcast Video 作者: 1 背景 1视频会议成为全球数十亿人远程协作、学习和个人互动的核心,这些不断增长的虚拟连接需求推动视频会议服务的蓬勃发展 2当前用户越来越希望在低延迟下看到更高质量的视频…

Milvus 再上新!支持 Upsert、Kafka Connector、集成 Airbyte,助力高效数据流处理

Milvus 已支持 Upsert、 Kafka Connector、Airbyte! 在上周的文章中《登陆 Azure、发布新版本……Zilliz 昨夜今晨发生了什么?》,我们已经透露过 Milvus(Zilliz Cloud)为提高数据流处理效率, 先后支持了 Up…

C语言碎片知识

sizeof 1.sizeof是C语言中的一个操作符,同时也是关键字!!!! 2.sizeof的操作数可以是类型,变量或表达式 如图,第一个为什么是6?,因为先计算了3的大小,占4个字…

GAN:SNGAN-谱归一化GANs

论文:https://arxiv.org/pdf/1802.05957.pdf 代码:GitHub - pfnet-research/sngan_projection: GANs with spectral normalization and projection discriminator 发表:2018 ICLR 摘要 GANs的主要挑战是:训练的稳定性。本文作…

java 之 继承与多态的详细介绍

文章目录 类的继承1. 基本语法2. 继承的特点3. 方法的重写(方法的覆盖)super 关键字1. 调用父类的构造器2. 访问父类的成员变量3. 调用父类的方法4. 在构造器中调用父类方法封装性以及访问修饰符抽象方法1. 声明抽象类2. 抽象方法3. 继承抽象类4. 抽象类…

[传智杯 #4 初赛] 时效「月岩笠的诅咒」

题目背景 蓬莱之药,被诅咒的不死之药。 奉命将蓬莱之药投入富士山中销毁的月岩笠,最终打算把蓬莱之药改投入八岳销毁。在下山途中妹红将其踹下山,抢到了蓬莱之药。 那已经是千年前的事情了。 题目描述 时间节点上发生过的两件事情的时间…

智能指针及强相关知识经验总结 --- 移动语义、引用计数、循环引用、move()、自定义删除器等

目录 前言 一、shared_ptr 1. 基本用法和构造方法 2. 引用计数机制 3. weak_ptr 解决循环引用 二、unique_ptr 1. 基本用法和构造方法 2. 独占性 3. 所有权转移 1)unique_ptr :: release() 2)移动语义 和 move() 三、 对比 shared_ptr 和 un…

springboot项目无法写文件解决

报错信息 2023-12-04 15:19:30.382 INFO 3438235 --- [nio-9012-exec-1] c.i.cms.ueditor.upload.StorageManager : 保存文件:tmp:/tmp/30057024569865885 path:/home/wwwroot/cms/uploads/20231204/1701674370376033698.jpg java.nio.file.AccessDeniedException:…

Linux中项目部署步骤

安装jdk,tomcat 安装步骤 1,将压缩包,拷贝到虚拟机中。 通过工具,将文件直接拖到虚拟机的/home下 2,回到虚拟机中,查看/home下,有两个压缩文件 3,给压缩文件做解压缩操作 tar -z…