python数据标准化代码_可能是最全的数据标准化教程(附
python代码)
什么是数据标准化(归⼀化)
数据标准化(归⼀化)处理是数据挖掘的⼀项基础⼯作,不同评价指标往往具有不同的量纲和量纲单位,当各指标间的⽔平相差很⼤时,如果直接⽤原始指标值进⾏分析,就会突出数值较⾼的指标在综合分析中的作⽤,相对削弱数值⽔平较低指标的作⽤。为了消除指标之间的量纲影响,保证结果的可靠性,需要进⾏数据标准化处理,以解决数据指标之间的可⽐性。
为什么要数据归⼀化:
1)归⼀化后加快了梯度下降求最优解的速度;
当存在多个特征时,如果特征数据范围不⼀致,可能会导致梯度下降的路径摇摆不定,效率低下。
如下图所⽰,蓝⾊的圈圈图代表的是两个特征的等⾼线。其中左图两个特征X1和X2的区间相差⾮常⼤,X1区间是[0,2000],X2区间是[1,5],其所形成的等⾼线⾮常尖。当使⽤梯度下降法寻求最优解时,很有可能⾛“之字型”路线(垂直等⾼线⾛),从⽽导致需要迭代很多次才能收敛;
image
⽽右图对两个原始特征进⾏了归⼀化,其对应的等⾼线显得很圆,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。
因此如果机器学习模型使⽤梯度下降法求最优解时,归⼀化往往⾮常有必要,否则很难收敛甚⾄不能收敛。
2)归⼀化有可能提⾼精度。
⼀些分类器需要计算样本之间的距离(如欧⽒距离),例如KNN。如果⼀个特征值域范围⾮常⼤,那么距离计算就主要取决于这个特征,从⽽与实际情况相悖(⽐如这时实际情况是值域范围⼩的特征更重要)。
常见的数据归⼀化⽅法
1) 线性归⼀化
也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间。转换函数如下:
image
其中max为样本数据的最⼤值,min为样本数据的最⼩值。
这种⽅法有个缺陷就是当有新数据加⼊时,可能导致max和min的变化,需要重新定义。
python代码:
def Normalization(x):
return [(float(i)-min(x))/float(max(x)-min(x)) for i in x]
# 或者调⽤sklearn包的⽅法
from sklearn import preprocessing
import numpy as np
X = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_minMax = min_max_scaler.fit_transform(X)
1*) 如果想要将数据映射到[-1,1],则将公式换成:
image
x_mean表⽰数据的均值。
python代码:
def Normalization2(x):
return [(float(i)-np.mean(x))/(max(x)-min(x)) for i in x]
2) 标准差标准化
也称为z-score标准化。这种⽅法根据原始数据的均值(mean)和标准差(standard deviation)进⾏数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:
image
其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
在分类、聚类算法中,需要使⽤距离来度量相似性的时候、或者使⽤PCA技术进⾏降维的时候,Z-score标准化表现更好。
python代码:
from sklearn import preprocessingpython代码转换
import numpy as np
X = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
# calculate mean
X_mean = X.mean(axis=0)
# calculate variance
X_std = X.std(axis=0)
# standardize X
X1 = (X-X_mean)/X_std # ⾃⼰计算
# use function preprocessing.scale to standardize X
X_scale = preprocessing.scale(X) # 调⽤sklearn包的⽅法
# 最终X1与X_scale等价
3) ⾮线性归⼀化
经常⽤在数据分化⽐较⼤的场景,有些数值很⼤,有些很⼩。通过⼀些数学函数,将原始值进⾏映射。该⽅法包括 log、指数,正切等。需要根据数据分布的情况,决定⾮线性函数的曲线,⽐如log(V, 2)还是log(V, 10)等。
3.1 对数转换
y=log10(x) /log10(max)
3.2 反余切函数转换
y=atan(x)*2/PI

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。