真的明白sklearn.preprocessing中的scale和StandardScaler两种标准化方式的区别吗?

本文主要是介绍真的明白sklearn.preprocessing中的scale和StandardScaler两种标准化方式的区别吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面

之前,写过一篇文章,叫做真的明白数据归一化(MinMaxScaler)和数据标准化(StandardScaler)吗?。这里面搞清楚了归一化和标准化的区别,但是在实用中发现,在数据标准化中,又存在两种方式可以实现,在这里总结一下两者的区别吧。

标准化是怎么回事来?

  1. 什么是标准化
    在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,资料标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1,这个方法被广泛的使用在许多机器学习算法中(例如:支持向量机、逻辑回归和类神经网络)。

  2. 标准化的特点:

对不同特征维度的伸缩变换的目的是使得不同度量之间的特征具有可比性。同时不改变原始数据的分布。
好处:

  • 使得不同度量之间的特征具有可比性,对目标函数的影响体现在几何分布上,而不是数值上
  • 不改变原始数据的分布

举个例子:
根据人的身高和体重预测人的健康指数
假设有如下原始样本数据是四维的
在这里插入图片描述
标准化是这样做的:
在这里插入图片描述
从上面两个坐标图可以看出,样本在数据值上的分布差距是不一样的,但是其几何距离是一致的。而标准化就是一种对样本数据在不同维度上进行一个伸缩变化(而不改变数据的几何距离),也就是不改变原始数据的信息(分布)。这样的好处就是在进行特征提取时,忽略掉不同特征之间的一个度量,而保留样本在各个维度上的信息(分布)。

  1. 如何进行标准化
    公式为:(X-mean)/std 计算时对每个属性/每列分别进行。
    有两种实现方式:
  • 使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化。
>>> from sklearn import preprocessing
>>> import numpy as np
>>> X = np.array([[ 1., -1.,  2.],
...               [ 2.,  0.,  0.],
...               [ 0.,  1., -1.]])
>>> X_scaled = preprocessing.scale(X)>>> X_scaled                                         
array([[ 0.  ..., -1.22...,  1.33...],[ 1.22...,  0.  ..., -0.26...],[-1.22...,  1.22..., -1.06...]])>>>#处理后数据的均值和方差
>>> X_scaled.mean(axis=0)
array([ 0.,  0.,  0.])>>> X_scaled.std(axis=0)
array([ 1.,  1.,  1.])
  • 使用sklearn.preprocessing.StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。
>>> scaler = preprocessing.StandardScaler().fit(X)
>>> scaler
StandardScaler(copy=True, with_mean=True, with_std=True)>>> scaler.mean_                                     
array([ 1. ...,  0. ...,  0.33...])>>> scaler.std_                                      
array([ 0.81...,  0.81...,  1.24...])>>> scaler.transform(X)                              
array([[ 0.  ..., -1.22...,  1.33...],[ 1.22...,  0.  ..., -0.26...],[-1.22...,  1.22..., -1.06...]])>>>#可以直接使用训练集对测试集数据进行转换
>>> scaler.transform([[-1.,  1., 0.]])               
array([[-2.44...,  1.22..., -0.26...]])

实现标准化两种方式的区别

  • sklearn.preprocessing.scale可以沿着特定的坐标轴对数据集进行标准化,在均值附近集中化数据并缩放至单位方差.

sklearn.preprocessing.scale(X, axis = 0, with_mean=True, with_std=True, copy=True)

  • X:需要进行集中化和缩放的数据,类似于数组,稀疏矩阵
  • axis:整数(默认是 0 )用来计算均值和标准差的轴. 当 axis=0 时,对各个特征进行标准化;当 axis=1 时,会对每个样本进行标准化
  • with_mean:boolean,布尔型,默认是 True,即在缩放之前对数据进行集中化
  • with_std:boolean,布尔型,默认是 True,即缩放数据至单位方差( 或单位标准差)
  • copy:boolean,布尔型,默认是 True,可选填. 设置为 False 的时候即在原数据行上进行标准化,并禁止复制( 如果输入是 numpy 数组或是 scipy.sparse CSC 矩阵并且 axis = 1)

这个是preprocessing提供的函数。

在机器学习数据预处理中,这个函数把训练集和测试集放在一块进行标准化处理,求出共同的均值和方差,然后X减去均值再除以方差。处理成均值为0, 方差为1的数据。 参考了测试集本身。

  • Preprocessing 模块还提供实用程序类 StandardScaler 执行转换器 API 来计算训练集的均值和标准差,然后应用同样的转换方法对测试集进行转换. 移除特征的均值并进行缩放,根据样本集上的每一个特征的各项统计值来进行集中化和缩放. 这个类也由此可以适用于 sklearn.pipeline.Pipeline 的早期步骤:

class.sklearn.preprocessing.StandardScaler(copy = True, with_mean = True, with_std = True )

  • copy:boolean,布尔型,可选填,默认为 True,设置为 False 时则会在原数据上进行缩放并且禁止副本. 然而这并不保证一直在原数据上操作,例外情况比如数据不是 numpy 的数组或者scipy.sparse CSR 矩阵,依然会返回一个副本
  • with_mean:boolean,布尔型,默认为 True,即在缩放前集中化数据
  • with_std:boolean,布尔型,默认为 True,即缩放数据至单位方差( 或单位标准差)
  • Attributes 包括:scale_ 每个特征的相对标度,mean_训练集中每个特征的均值,var_训练集中每个特征的方差

这个是preprocessing提供的类。

在机器学习数据预处理中,这个函数把是把训练集的数据进行特征缩放之后,然后应用到测试集上去。 也就是只求出训练集的均值和方差,然后让训练集和测试集的X都减去这个均值然后除以方差。 均值和方差的计算没有参考测试集。

看下面的使用例子:

>>> scaler = preprocessing.StandardScaler().fit(X_train)
>>> scaler
StandardScaler(copy=True, with_mean=True, with_std=True)>>> scaler.mean_                                      
array([ 1. ...,  0. ...,  0.33...])>>> scaler.scale_                                       
array([ 0.81...,  0.81...,  1.24...])>>> scaler.transform(X_train)                           
array([[ 0.  ..., -1.22...,  1.33...],[ 1.22...,  0.  ..., -0.26...],[-1.22...,  1.22..., -1.06...]])

得到的 scaler 就可以用同样的方法去转换新的数据集了:

>>> X_test = [[-1., 1., 0.]]
>>> scaler.transform(X_test)                
array([[-2.44...,  1.22..., -0.26...]])

总结一下:

scale()函数和StandardScaler()函数都可以把数据标准化,处理的过程都是 (X-mean) / std。

但是又有点不同,scale()不能迁移到新的数据集,如果是处理训练集和测试集,只能是把训练集和测试集合起来, 计算出共同的mean和std, 然后 (X-mean) / std,再分成训练集和测试集。这里的mean和std的计算涉及到了测试集,是训练集和测试集共同的期望和方差

而StandardScaler()可以迁移到新的数据集,只需要处理训练集,拿训练集的数据计算出均值x_train_mean, x_train_std和方差,然后训练集的X_train和测试集的X_test都执行标准化。 这里注意:测试集的标准化是利用的训练集的均值和方差。 也就是假设训练集的期望和测试集的期望是一样的,这样只需要计算出训练集的期望之后,直接用于测试集就可以了,这里只是训练集的期望和方差,没有涉及测试集

在机器学习中,我们是从整体中采用抽样的方式抽出训练集,这意味着我们默认,这部分训练集可以代替整体,也就是训练集的期望就是整体的期望,测试集标准化的时候,它的期望采用的正是训练集的期望.
所以StandardScaler()才是我们经常用的方式

这篇关于真的明白sklearn.preprocessing中的scale和StandardScaler两种标准化方式的区别吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/306455

相关文章

虚拟机与物理机的文件共享方式

《虚拟机与物理机的文件共享方式》文章介绍了如何在KaliLinux虚拟机中实现物理机文件夹的直接挂载,以便在虚拟机中方便地读取和使用物理机上的文件,通过设置和配置,可以实现临时挂载和永久挂载,并提供... 目录虚拟机与物理机的文件共享1 虚拟机设置2 验证Kali下分享文件夹功能是否启用3 创建挂载目录4

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3

Python中@classmethod和@staticmethod的区别

《Python中@classmethod和@staticmethod的区别》本文主要介绍了Python中@classmethod和@staticmethod的区别,文中通过示例代码介绍的非常详细,对大... 目录1.@classmethod2.@staticmethod3.例子1.@classmethod

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`