赞
踩
不同特征之间往往具有不同的量纲,由此所造成的数值间的差异可能很大,在涉及空间距离计算或梯度下降法等情况的时候不对其进行处理会影响到数据分析结果的准确性。为了消除特征之间的量纲和取值范围差异可能会造成的影响,需对数据进行标准化处理,也可以称为规范化处理。
离差标准化是对原始数据的一种线性变换,结果是将原始数据的数值映射到[0,1]区间上。
X
∗
=
X
−
m
i
n
m
a
x
−
m
i
n
X^*=\frac{X-min}{max-min} \quad
X∗=max−minX−min
max为样本数据的最大值,min为样本数据的最小值,max-min为极差。
import pandas as pd import numpy as np # 读取数据 detail = pd.read_csv('data/detail.csv',index_col=0,encoding='gbk') # 自定义离差标准化函数 def minmaxscale(data): data=(data-data.min())/(data.max()-data.min()) return data # 对菜品订单表售价和销量做离差标准化 data1 = minmaxscale(detail['counts']) data2 = minmaxscale(detail['amounts']) data3 = pd.concat([data1,data2],axis=1) print('离差标准化之前销量和售价数据前五行为:\n',detail[['counts','amounts']].head()) print('离差标准化之后销量和售价数据前五行为:\n',data3.head())
通过离差标准化前后的对比,可以发现原先数值与映射的值相对应;而销量对应列变为了0,是因为只要出现在订单表上的数据都是同一个订单点的菜,最少份数是1,当数据和最小值相等时就会变为0;切菜品价格数据进行离差标准化后数之间的差值很小,是由于数据极差过大。
缺点:
当数据的极差过大时,离差标准化趋于0;
当数据发生更改后要重新确定[min,max]范围,以免引起系统报错。
标准差标准化也叫零均值标准化或z分数标准化,通过该方法处理的数据均值为0,标准差为1。
X
∗
=
X
−
X
‾
δ
X^*=\frac{X-\overline{X}}{\delta} \quad
X∗=δX−X
X
‾
为
原
始
数
据
的
平
均
值
,
δ
为
原
始
数
据
的
标
准
差
。
\overline{X}为原始数据的平均值,\delta为原始数据的标准差。
X为原始数据的平均值,δ为原始数据的标准差。
##自定义标准差标准化函数
def StandardScaler(data):
data=(data-data.mean())/data.std()
return data
##对菜品订单表售价和销量做标准化
data4=StandardScaler(detail['counts'])
data5=StandardScaler(detail['amounts'])
data6=pd.concat([data4,data5],axis=1)
print('标准差标准化之前销量和售价数据为:\n',
detail[['counts','amounts']].head())
print('标准差标准化之后销量和售价数据为:\n',data6.head())
通过对比可以发现,标准差标准化后的数值区间不限于[0,1],还会存在负值,同时保留了数数据的分布情况。
小数定标标准化是通过移动数据的小数位数,将数据映射到[-1,1]区间上,移动的小数位数取决于数据绝对值的最大值。
X
∗
=
X
1
0
k
X^*=\frac{X}{10^k} \quad
X∗=10kX
k取决于数据绝对值的最大值。
##自定义小数定标差标准化函数
def DecimalScaler(data):
data=data/10**np.ceil(np.log10(data.abs().max()))
return data
##对菜品订单表售价和销量做标准化
data7=DecimalScaler(detail['counts'])
data8=DecimalScaler(detail['amounts'])
data9=pd.concat([data7,data8],axis=1)
print('小数定标标准化之前的销量和售价数据:\n',
detail[['counts','amounts']].head())
print('小数定标标准化之后的销量和售价数据:\n',data9.head())
根据小数定标标准化数据后,我们进行回头检测,abs()查出数据绝对值的最大值为178三位数,再使用np.log10()得到10为底的对数,最后用np.ceil()得出向上取整的最小整数3.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。