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 相关文章推荐
Ubuntu 下 vim 搭建python 环境 配置
Jun 12 Python
一道python走迷宫算法题
Jan 22 Python
python监控键盘输入实例代码
Feb 09 Python
Python实现图片尺寸缩放脚本
Mar 10 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 Python
python isinstance函数用法详解
Feb 13 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
May 26 Python
python中print格式化输出的问题
Apr 16 #Python
CocosCreator ScrollView优化系列之分帧加载
深度学习tensorflow基础mnist
Python 多线程之threading 模块的使用
Apr 14 #Python
教你如何用python开发一款数字推盘小游戏
深度学习详解之初试机器学习
正确的理解和使用Django信号(Signals)
Apr 14 #Python
You might like
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
div层的移动及性能优化
2010/11/16 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
js实现动态时钟
2020/03/12 Javascript
axios封装与传参示例详解
2020/10/18 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
鉴定评语大全
2014/05/05 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
上班迟到检讨书
2014/09/15 职场文书
打架赔偿协议书范本
2014/10/26 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
材料采购员岗位职责
2015/04/03 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
HTML基础详解(上)
2021/10/16 HTML / CSS