python 机器学习的标准化、归一化、正则化、离散化和白化


Posted in Python onApril 16, 2021

       机器学习的本质是从数据集中发现数据内在的特征,而数据的内在特征往往被样本的规格、分布范围等外在特征所掩盖。数据预处理正是为了最大限度地帮助机器学习模型或算法找到数据内在特征所做的一系列操作,这些操作主要包括标准化、归一化、正则化、离散化和白化等。

1 标准化

       假定样本集是二维平面上的若干个点,横坐标 x 分布于区间 [0,100] 内,纵坐标 y 分布于区间 [0,1] 内。显然,样本集的 x 特征列和 y 特征列的动态范围相差巨大,对于机器学习模型(如k-近邻或 k-means 聚类)的影响也会有显著差别。标准化处理正是为了避免某一个动态范围过大的特征列对计算结果造成影响,同时还可以提升模型精度。标准化的实质是对样本集的每个特征列减去该特征列均值进行中心化,再除以标准差进行缩放。
       Scikit-learn的预处理子模块preprocessing提供了一个快速标准化函数scale(),使用该函数可以直接返回标准化后的数据集,其代码如下。

>>> import numpy as np
>>> from sklearn import preprocessing as pp
>>> d = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]])
>>> d_scaled = pp.scale(d) # 对数据集d做标准化
>>> d_scaled
array([[ 0. , -1.22474487, 1.40487872],
 [ 1.22474487, 0. , -0.84292723],
 [-1.22474487, 1.22474487, -0.56195149]])
>>> d_scaled.mean(axis=0) # 标准化以后的数据集,各特征列的均值为0
array([0., 0., 0.])
>>> d_scaled.std(axis=0) # 标准化以后的数据集,各特征列的标准差为1
array([1., 1., 1.])

       预处理子模块 preprocessing 还提供了一个实用类 StandardScaler,它保存了训练集上各特征列的平均值和标准差,以便以后在测试集上应用相同的变换。此外,实用类StandardScaler 还可以通过 with_mean 和 with_std 参数指定是否中心化和是否按标准差缩放,其代码如下。

>>> import numpy as np
>>> from sklearn import preprocessing as pp
>>> X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]])
>>> scaler = pp.StandardScaler().fit(X_train)
>>> scaler
StandardScaler(copy=True, with_mean=True, with_std=True)
>>> scaler.mean_ # 训练集各特征列的均值
array([ 1., -3., 3.])
>>> scaler.scale_ # 训练集各特征列的标准差
array([0.81649658, 1.63299316, 3.55902608])
>>> scaler.transform(X_train) # 标准化训练集
array([[ 0. , -1.22474487, 1.40487872],
 [ 1.22474487, 0. , -0.84292723],
 [-1.22474487, 1.22474487, -0.56195149]])
>>> X_test = [[-1., 1., 0.]] # 使用训练集的缩放标准来标准化测试集
>>> scaler.transform(X_test)
array([[-2.44948974, 2.44948974, -0.84292723]])

2 归一化

       标准化是用特征列的均值进行中心化,用标准差进行缩放。如果用数据集各个特征列的最小值进行中心化后,再按极差(最大值-最小值)进行缩放,即数据减去特征列的最小值,并且会被收敛到区间 [0,1] 内,这个过程就叫作数据归一化。
       Scikit-learn的预处理子模块 preprocessing 提供 MinMaxScaler 类来实现归一化功能。MinMaxScaler 类有一个重要参数 feature_range,该参数用于设置数据压缩的范围,默认是 [0,1]。

>>> import numpy as np
>>> from sklearn import preprocessing as pp
>>> X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]])
>>> scaler = pp.MinMaxScaler().fit(X_train) # 默认数据压缩范围为[0,1]
>>> scaler
MinMaxScaler(copy=True, feature_range=(0, 1))
>>> scaler.transform(X_train)
array([[0.5 , 0. , 1. ],
 [1. , 0.5 , 0. ],
 [0. , 1. , 0.125]])
>>> scaler = pp.MinMaxScaler(feature_range=(-2, 2)) # 设置数据压缩范围为[-2,2]
>>> scaler = scaler.fit(X_train)
>>> scaler.transform(X_train)
array([[ 0. , -2. , 2. ],
 [ 2. , 0. , -2. ],
 [-2. , 2. , -1.5]])

       因为归一化对异常值非常敏感,所以大多数机器学习算法会选择标准化来进行特征缩放。在主成分分析(Principal Components Analysis,PCA)、聚类、逻辑回归、支持向量机、神经网络等算法中,标准化往往是最好的选择。归一化在不涉及距离度量、梯度、协方差计算,以及数据需要被压缩到特定区间时被广泛使用,如数字图像处理中量化像素强度时,都会使用归一化将数据压缩在区间 [0,1] 内。

3 正则化

       归一化是对数据集的特征列的操作,而正则化是将每个数据样本的范数单位化,是对数据集的行操作。如果打算使用点积等运算来量化样本之间的相似度,那么正则化将非常有用。

       Scikit-learn的预处理子模块preprocessing提供了一个快速正则化函数normalize(),使用该函数可以直接返回正则化后的数据集。normalize()函数使用参数norm指定I1范式或I2范式,默认使用I2范式。I1 范式可以理解为单个样本各元素的绝对值之和为 1;I2 范式可理解为单个样本各元素的平方和的算术根为 1,相当于样本向量的模(长度)。

>>> import numpy as np
>>> from sklearn import preprocessing as pp
>>> X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]])
>>> pp.normalize(X_train) # 使用I2范式正则化,每行的范数为1
array([[ 0.10540926, -0.52704628, 0.84327404],
 [ 0.5547002 , -0.83205029, 0. ],
 [ 0. , -0.70710678, 0.70710678]])
>>> pp.normalize(X_train, norm='I1') # 使用I1范式正则化,每行的范数为1
array([[ 0.07142857, -0.35714286, 0.57142857],
 [ 0.4 , -0.6 , 0. ],
 [ 0. , -0.5 , 0.5 ]])

4 离散化

       离散化(Discretization)是将连续特征划分为离散特征值,典型的应用是灰度图像的二值化。如果使用等宽的区间对连续特征离散化,则被称为 K-bins 离散化。Scikit-learn的预处理子模块preprocessing提供了Binarizer类和KbinsDiscretizer类来进行离散化,前者用于二值化,后者用于 K-bins 离散化。

>>> import numpy as np
>>> from sklearn import preprocessing as pp
>>> X = np.array([[-2,5,11],[7,-1,9],[4,3,7]])
>>> bina = pp.Binarizer(threshold=5) # 指定二值化阈值为5
>>> bina.transform(X)
array([[0, 0, 1],
 [1, 0, 1],
 [0, 0, 1]])
>>> est = pp.KBinsDiscretizer(n_bins=[2, 2, 3], encode='ordinal').fit(X)
>>> est.transform(X) # 三个特征列离散化为2段、2段、3段
array([[0., 1., 2.],
 [1., 0., 1.],
 [1., 1., 0.]])

5 白化

       白化一词是从whitening翻译过来的,难以望文生义,只能从白化后的效果去理解。数据白化有两个目的,一是去除或降低特征列之间的相关性,二是使得每个特征列的方差为1。显然,白化的第一个目标就是主成分分析(PCA),通过主成分分析降维,消除方差占比较小的特征维;白化的第二个目标就是标准化。

       白化分为PCA白化和ZCA白化两种。PCA 白化将原数据各个特征维变换到主成分轴上,消除了特征之间的相关性,并使得各个主成分的方差为1。ZCA白化则是将PCA 白化的结果反变换到原数据的各个特征维轴上,因为ZCA白化过程中通常不会降维。

       Scikit-learn没有提供专用的白化方法,不过借助成分分析子模块decomposition提供的PCA 类可以轻松实现PCA白化。PCA类的参数whiten用于设置是否移除特征间的线性关联,默认值为False。

       假如一位姑娘手头有一堆相亲资料,每位帅哥的信息由年龄、身高、体重、年薪、房产数量、汽车数量等多个特征项组成。通过白化操作,能够生成一个特征维较小、且可以直接比较样本间差距的数据集。

>>> import numpy as np
>>> from sklearn import preprocessing as pp
>>> from sklearn.decomposition import PCA
>>> ds = np.array([
    [25, 1.85, 70, 50, 2, 1], 
    [22, 1.78, 72, 22, 0, 1], 
    [26, 1.80, 85, 25, 1, 0],
    [28, 1.70, 82, 100, 5, 2]
]) # 4个样本,6个特征列
>>> m = PCA(whiten=True) # 实例化主成分分析类,指定白化参数
>>> m.fit(ds) # 主成分分析
PCA(whiten=True)
>>> d = m.transform(ds) # 返回主成分分析结果
>>> d # 特征列从6个降至4个
array([[ 0.01001541, -0.99099492, -1.12597902, -0.03748764],
       [-0.76359767, -0.5681715 ,  1.15935316,  0.67477757],
       [-0.65589352,  1.26928222, -0.45686577, -1.8639689 ],
       [ 1.40947578,  0.28988421,  0.42349164,  1.2724972 ]])
>>> d.std(axis=0) # 显示各特征列方差
array([0.8660254 , 0.8660254 , 0.8660254 , 1.17790433])
>>> d = pp.scale(d) # 标准化
>>> d.std(axis=0) # 标准化后的各特征列方差均为1
array([1., 1., 1., 1.])

       GitHub上有人提供了ZCA白化的代码,如果需要,请访问(https://github.com/mwv/zca)。

以上就是聊聊python 机器学习的标准化、归一化、正则化、离散化和白化的详细内容,更多关于python 机器学习的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python文件和目录操作详解
Feb 08 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
python selenium循环登陆网站的实现
Nov 04 Python
Python遍历字典方式就实例详解
Dec 28 Python
Python如何使用字符打印照片
Jan 03 Python
Django中的session用法详解
Mar 09 Python
Python selenium自动化测试模型图解
Apr 15 Python
Python基于gevent实现文件字符串查找器
Aug 11 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 Python
selenium判断元素是否存在的两种方法小结
Dec 07 Python
Python re.sub 反向引用的实现
Jul 07 Python
Python Flask实现进度条
May 11 Python
python中print格式化输出的问题
Apr 16 #Python
CocosCreator ScrollView优化系列之分帧加载
深度学习tensorflow基础mnist
Python 多线程之threading 模块的使用
Apr 14 #Python
教你如何用python开发一款数字推盘小游戏
深度学习详解之初试机器学习
正确的理解和使用Django信号(Signals)
Apr 14 #Python
You might like
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
Django REST framework内置路由用法
2019/07/26 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
群胜软件Java笔试题
2012/09/29 面试题
描述内存分配方式以及它们的区别
2016/10/15 面试题
高级护理实习生自荐信
2013/09/28 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
党员政治学习材料
2014/05/14 职场文书
公司董事长岗位职责
2014/06/08 职场文书
报效祖国演讲稿
2014/09/15 职场文书
现实表现材料范文
2014/12/23 职场文书
酒店前台岗位职责
2015/04/16 职场文书
基层党支部承诺书
2015/04/30 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书