今天这篇还是讲特征工程那一堆事,准确点说是数据预处理范畴内的,在做PCA降维时,我发现利用方差过滤出的主成分和利用PCA降维得到的主成分对应位置的方差有些不同:

VarianceThreshold:[90370.21684180899, 55277.04960170764, 51395.858083599174]
PCA:[176251.93379431,74196.48270488,55716.27982124]

之前说过PCA降维可以将原来高维的数据投影到某个低维的空间上并使得其方差尽量大。如果数据其中某一特征的数值特别大的话,那么它在整个误差计算的比重上就很大。所以将数据投影到低维空间之后,整个投影会去努力逼近数值最大的那一个特征,而忽略数值比较小的特征。

在建模前我们不知道每个特征的重要性,这很可能导致了大量的信息缺失。为了“公平”起见,防止过分捕捉某些数值大的特征,我们就可以先对每个特征先进行标准化处理,使得它们的大小都在相同的范围内,然后再进行PCA。

我们要处理的数据往往有着不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除特征之间的量纲影响,需要进行数据标准化处理。原始数据经过数据标准化处理后,数据集中每个特征就处于同一数量级,适合进行综合对比评价。

上面文字叙述可能相对抽象,就先通过一个简单的例子深入了解一下标准化和归一化的重要性。假如一个人的健康状况可以根据一个公式计算:

健康状况=3×身高+2×体重健康状况=3\times身高+2\times体重健康状况=3×身高+2×体重

现在我们有一份数据集,有身高和体重两个特征,身高的单位为米,体重的单位为斤:

身高(米) 体重(斤) 健康状况
1.7 120 245.1
1.6 200 404.8
2.0 140 286

即使在公式中身高所占权重要大于体重,但是由于这两个特征数值之间出现了两极化,所以最后一个人的健康状况很大程度向体重倾斜,所以若想正确的评判一个人的健康状况,那么需要中和一下两类数值,可以将其映射至[0,1]区间内,也就是进行归一化处理:

身高(米) 体重(斤) 健康状况
0.25 0 0.5
0 1 2
1 0.25 3.5

处理之后再预测时,就不会出现向某个特征倾斜的状况,两个特征的重要性就取决于公式中系数的大小。

归一化

归一化就是将训练集中某一列数值特征的值缩放到0和1之间,公式如下:

Xnorm=X−XminXmax−XminX_{norm}=\frac{X-X_{min}}{X_{max}-X_{min}}Xnorm​=Xmax​−Xmin​X−Xmin​​

其中XmaxX_{max}Xmax​为样本最大值,XminX_{min}Xmin​为样本最小值。可以看到每个样本的归一化都是要依据数据中最大值和最小值进行的,所以归一化对数据集中的异常点是比较敏感的。因为异常点通常是离群点,那么它的值可能就过大或者过小,如果归一化依据异常点进行的话,最后的结果就会产生很大的偏差。所以在归一化很适合精确且规模相对小一些的数据集,一般在归一化之前可以先检查数据,排除异常点的影响。

利用numpy实现归一化的代码如下:

def normalization(data):M_m = np.max(data)-np.min(data)return (data-np.min(data)) / M_m

标准化

标准化就是将训练集中某一列数值特征的值缩放成均值为0,方差为1的状态。公式如下:

Xstd=X−μσX_{std} = \frac{X-\mu}{\sigma}Xstd​=σX−μ​

其中μ\muμ为样本均值、σ\sigmaσ为样本标准差,σ\sigmaσ也考量了数据稳定性。每一个样本的归一化仅和最大值、最小值和它本身有关,这点和标准化是有一些出入的,标准化的缩放处理和每一个样本点都有关系,因为均值和标准差是数据集整体的,与归一化相比,标准化更加注重数据集中样本的分布状况。由于具有一定的样本个数,所以出现少量的异常点对于平均值和标准差的影响较小,因此标准化的结果也不会具有很大的偏差。

利用numpy实现标准的代码如下:

def standardization(data):mu = np.mean(data, axis=0)sigma = np.std(data, axis=0)return (data - mu) / sigma

综上很容易推断出归一化和标准化本质上都是对原始数据进行缩放和平移,只是着重点不同。

在sklearn库中也有归一化和标准化对应的API,应用起来也很简单,归一化应用方法:

from sklearn.preprocessing import MinMaxScaler
import numpy as np
X = [[83,2,10],[60,3,15],[75,4,13]]
X = np.array(X)
Mm = MinMaxScaler()
data = Mm.fit_transform(X)
print(data)

归一化输出对应结果:

[[1.         0.         0.        ][0.         0.5        1.        ][0.65217391 1.         0.6       ]]

标准化应用方法:

from sklearn.preprocessing import StandardScaler
import numpy as npX = [[83,2,10],[60,3,15],[75,4,13]]
X = np.array(X)
Mm = StandardScaler()
data = Mm.fit_transform(X)
print(data)

标准化输出对应结果:

[[ 1.08388958 -1.22474487 -1.29777137][-1.32863884  0.          1.13554995][ 0.24474926  1.22474487  0.16222142]]

那么是所有的机器学习算法建模之前都需要对相应的数据进行标准化和归一化处理吗?肯定不是的。其中KNN算法、支持向量机、线性回归、神经网络是需要进行标准化或归一化处理的,不难发现这几种算法都与"距离"相关,所以在进行计算时为了避免预测结果向数值大的特征倾斜,所以标准化处理是必要的,可以很大程度提高模型的精度。

而逻辑回归是否要标准化则取决于是否应用正则化,标准化可以很好的提高收敛速度,这很好的体现在梯度下降法和梯度上升法中,如下图:

左图为标准化之前,右图为标准化之后,可以看到标准化可以让模型少走很多弯路,从而加快收敛速度,这一点也很容易想象,毕竟个位数与千位数、个位数与个位数之间的"距离"差距还是很大的。

决策树和朴素贝叶斯算法是不需要进行标准化的,因为前者是通过信息增益进行决策,后者是通过概率进行评判,这类模型不关心变量的取值,而是关心变量的分布和变量之间的条件概率,与"距离"计算无关,继而以决策树为基础构建的随机森林、AdaBoost等等也不需要标准化,但是需要注意的是,在应用这些算法之前若要使用PCA降维则需要进行标准化。

那么归一化和标准化如何选择呢?这个没有准确的答案,如果时间允许,可以尝试两种处理方法择最优。如果时间不允许,可以根据数据和要求选择:

  • 如果数据集小而稳定,可以选择归一化
  • 如果数据集中含有噪声和异常值,可以选择标准化,标准化更加适合嘈杂的大数据集。

关注公众号【喵说Python】第一时间获取更多精彩好文

不能不用也不可乱用的标准化和归一化处理相关推荐

  1. 均值归一化_不能不用也不可乱用的标准化和归一化处理

    今天这篇还是讲特征工程那一堆事,准确点说是数据预处理范畴内的,在做PCA降维时,我发现利用方差过滤出的主成分和利用PCA降维得到的主成分对应位置的方差有些不同: VarianceThreshold:[ ...

  2. 一篇文章告诉你标准化和归一化的区别?

    一篇文章告诉你标准化和归一化的区别? 2019-02-28 17:12:39 融融网融融网阅读量:484 进一步推进企业的标准化工作,使之发展水平适应经济全球化下市场竞争的要求,促进企业综合实力的提升 ...

  3. 影像组学视频学习笔记(19)-数据标准化、归一化极简概述、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(19)主要介绍: 数据的标准化.归一化 为什么要进行标准化.归一化? 机器学习算法的要求 便于横向比较 # 标准化 (影像组学中最常用) ...

  4. 独家 | 数据转换:标准化vs 归一化(附代码链接)

    作者:Clare Liu, 英国金融科技数据科学家 翻译:林鹤冲 校对:王紫岳 本文约2300字,建议阅读10分钟 本文将解释数据转换中常见的特征缩放方法:"标准化"和" ...

  5. 数据标准化(归一化)

    数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可 ...

  6. mxnet基础到提高(6)--梯度,反馈与标准化(归一化)

    1.attach_grad(grad_req='write', stype=None) 附加一个梯度缓存在NDArray上,这样,回退(反馈)能计算相应的梯度 参数: grad_req ({'writ ...

  7. 【机器学习基础】Python数据预处理:彻底理解标准化和归一化

    数据预处理 数据中不同特征的量纲可能不一致,数值间的差别可能很大,不进行处理可能会影响到数据分析的结果,因此,需要对数据按照一定比例进行缩放,使之落在一个特定的区域,便于进行综合分析. 常用的方法有两 ...

  8. python归一化sklearn_用sklearn进行对数据标准化、归一化以及将数据还原详解

    如何用sklearn进行对数据标准化.归一化以及将数据还原 在对模型训练时,为了让模型尽快收敛,一件常做的事情就是对数据进行预处理. 这里通过使用sklearn.preprocess模块进行处理. 一 ...

  9. python实现数据恢复_使用sklearn进行对数据标准化、归一化以及将数据还原的方法...

    在对模型训练时,为了让模型尽快收敛,一件常做的事情就是对数据进行预处理. 这里通过使用sklearn.preprocess模块进行处理. 一.标准化和归一化的区别 归一化其实就是标准化的一种方式,只不 ...

最新文章

  1. Matlab Robotic Toolbox V9.10工具箱(三):轨迹规划
  2. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写hashcode和equals方法?你能说清楚了吗...
  3. 盲人可以也做软件工程师,反思一下老哥
  4. sonarqube中,分析maven聚合工程时,不必分析parent工程,只需分析下面的module子工程即可
  5. 如何在windows下使用linux命令
  6. 什么是单页面应用程序
  7. ITPro Magazine2006年第6期发布
  8. SelectedNode与e.node的区别
  9. 推荐系统中粗排扮演的角色和算法发展历程
  10. 《Linux命令行与shell脚本编程大全》第十二章 使用结构化命令
  11. Asp.Net构架(Http请求处理流程)
  12. 概率图模型之:贝叶斯网络
  13. win7系统计算机怎么排列图标,Win7系统桌面图标的三种排序方式
  14. java算法:1234组成无重复的三位数
  15. Ubuntu 桌面美化: 1.命令行terminal显示时间用户conda环境2.桌面自动更换轮换壁纸Bing Wallpaper
  16. 用js做一个鼠标惯性动画
  17. NLP-统计词频之处理停用词
  18. Airtestpoco学习历程1——设备连接
  19. 电子计算机显示屏维修,液晶显示器闪烁如何处理_液晶显示器维修教程
  20. 2019.07.06【NOIP提高组】模拟 A 组总结

热门文章

  1. 【Google Chrome】reCAPTCHA did not get loaded.
  2. 远期、期货和互换(一)
  3. CF855G. Harry Vs Voldemort(边双,并查集,dp)
  4. 【云驻共创】初探数通网络开放可编程
  5. 技术经理成长复盘-要懂一些项目管理的知识
  6. a4纸在html的像素,打印常识:A4纸张在显示器上应该要多少像素?
  7. 怎样开发微信小程序(最初的页面)
  8. 运营之光:我的互联网运营方法论与自白学习总结(思维导图)
  9. 他,1年9个月获清华博士学位,一作身份发27篇SCI,组队击败NASA打破“航天奥林匹克”欧美垄断...
  10. linux基础——信号阻塞及未决信号