数据标准化
为什么要标准化
- 分类树算法要求离散型数据
- 回归树算法要求近似服从正态分
- 聚类算法要求数据集属性无纲量
- 观测记录之间的相似度将会受到纲量大的属性的影响
常用的标准化方法
给定一维随机变量f,和一个容量为n的数据样本 S,基于这种假设,介绍以下几种常用的标准化方法:
- Z-score标准化
- Min-Max标准化
- Logistic标准化
- 正态性检验
- box-cox变换
Z-score标准化
该方法通过对数据集中的每一个样本进行处理,使得处理后的数据就有固定均值和标准差。
Z-score标准化:是将f减去总体均值μ,然后除以标准差σ的过程。
从Z-score的数学表达式可以得出:
Z-score代表的是变量f相对于均值μ的相对距离;而这个距离的度量可以用标准差σ表示。
f
i
′
=
(
f
i
−
μ
)
σ
f'_i=\frac{(f_i-μ)}{σ}
fi′=σ(fi−μ)
μ = x ‾ = 1 n ∑ i = 1 n f i μ=\overline{x}=\frac{1}{n}\sum_{i=1}^{n}f_i μ=x=n1i=1∑nfi
σ = 1 n ∑ i = 1 n ( f i − μ ) 2 \sigma=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(f_i-\mu)^2} σ=n1i=1∑n(fi−μ)2
举例说明,对data 的per_capita_income字段进行Z-score标准化。
import numpy as np
import pandas as pd
data = pd.read_csv('D:/data.csv')
from sklearn import preprocessing
print("标准化之前的数据: \n" + str(data[:,1]) + "\n")
#进行Z-score标准化
scaled_income = preprocessing.scale(data[:,1])
print("标准化后前的数据: \n" + str(scaled_income) + "\n")
标准化之前的数据:
[ 392.00 110.00 44.00 158.00 81.00 374.00 187.00 993.00 1723.00 287.00 970.00 885.00 200.00 575.00 688.00 48.00 572.00 239.00 244.00 472.00 134.00 633.00 295.00 906.00 1045.00 775.00 901.00 910.00 556.00]
标准化后前的数据:
[-0.35 -1.08 -1.24 -0.95 -1.15 -0.40 -0.88 1.18 3.05 -0.62 1.12 0.90 -0.85 0.11 0.40 -1.23 0.10 -0.75 -0.73 -0.15 -1.01 0.26 -0.60 0.96 1.31 0.62 0.95 0.97 0.06]
注:标准化后的数据均值为0,方差为1。
Z-score标准化步骤
从f的取值中减去均值,消除f在具体数值上的差异
与标准差相除,进一步消除量纲带来的影响
属性的取值非常系数,存在大量的零值
Z-score标准化会把零点变为非零点,这回改变原始数据的信息
在Z-score标准话之前,考察数据的分布是必要的
Min-Max标准化
- 将f映射到[0,1]之间,达到标准化的目的
- Min-Max标准话也是对f的原取值区间线性变换,得到新区间的过程
- fi标准化后的取值为:
f i ′ = f i − f m i n f m a x − f m i n f'_i=\frac{f_i-f_{min}}{f_{max}-f_{min}} fi′=fmax−fminfi−fmin
- 其中fmin、fmax分别为f的最小值和最大值
同样地,我们使用sklearn
中的MinMaxScaler
,对data
的per_capita_income
字段进行Min-Max标准化。
#transfrom = np.array(data['per_capita_income'])
# 将数据转化为数组格式
min_max_scaler = preprocessing.MinMaxScaler()
#MinMaxScaler()的参数feature_range可以指定数据映射的目标区间,默认的区间为[0, 1]。上述代码实现把数据映射到 [0,1]区间中。
minmax_data=min_max_scaler.fit_transform(data[:,1].reshape(-1, 1))
#同样,这个函数接收的数据也必须是一个二维的,所以这里需要我们多进行一次reshape
print(minmax_data.reshape(1,-1))
输出数据为:
[[ 0.21 0.04 0.00 0.07 0.02 0.20 0.09 0.57 1.00 0.14 0.55 0.50
0.09 0.32 0.38 0.00 0.31 0.12 0.12 0.25 0.05 0.35 0.15 0.51
0.60 0.44 0.51 0.52 0.30]]
Min-Max标准化总结
Min_Max标准化常见于基于距离的分析算法,可以消除量纲,数量级的影响
Min-Max标准化在数据转换的过程中使用了数据集的最值
当数据集的观测记录发生变动(增加或者删除个别记录)时,我们不得不对数据集重新进行Min-Max标准化
如果数据集中存在异常值,这可能会导致数据集的最值严重偏离实际的情形。
Min-Max标准化对异常值敏感。
Logistic标准化
- Logistic标准化是借助Logistic函数来对 x 进行非线性映射
- 经过变换后的f取值区间为:[0,1]
- Logistic函数的数学表达式如下图所示,Logistic曲线呈“s”型
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1
Logistic标准化的特点:
Logistic标准化对数据集的分布有一定的要求,它假定数据取值集中分布在 0值左右,
如果字段的取值均匀分散,或者说远离零点,那么经过Logistic标准化后的数据将会集中在0 ,1两个点附近。
这样做会改变数据集的原始分布特征。
正态性检验
- 许多数据科学分析模型(如线性模型,高斯混合模型)的假设要求:输入数据副总或是近似服从正态分布
- 正态分布检验方法的零假设为样本数据的分布服从正态分布
- 根据计算得出p值大小,来判断时候拒绝零假设
假设 | 内容 |
---|---|
H0 | 样本服从正态分布 |
H1 | 样本不服从正态分布 |
具体方式
给定一个显著性水平α
p值大于显著性水平,表明无法拒绝零假设,但这并不代表它绝对正确
反之,则表明零假设一定错误,即样本一定不服从正态分布
正 态 性 判 断 = { 无 法 拒 绝 H 0 , α < p H 1 成 立 , α > p 正态性判断=\begin{cases} 无法拒绝H_0,\alpha<p \\ H_1成立,\alpha>p \end{cases} 正态性判断={无法拒绝H0,α<pH1成立,α>p
正态分布的偏度和 峰度为零,统计量偏度和 峰度可以作为判断正态分布的参考
Scipy库中的函数skewtest和kurtosis可以对样本进行偏度和峰度检验
import numpy as np
import scipy.stats as stats
no.random.seed(5000)
#设置种子
num_norm=np.random.normal(0,1,5000)
print("样本分布的偏度检测结果:"+str(stats.skewtest(num_norm)))
print("样本分布的峰度检测结果:"+str(stats.kurtosistest(num_norm)))
仅根据偏度和峰度,在给定置信度水平你的情况下,我们无法确切知道样本数据是否服从正态分布
Scipy库基于这两个标准化统计量,提出一种综合性的正态分布检验方法:
计算 p ˉ s k e w 2 + p ˉ k u r t o s i s 2 \bar{p}^2_{skew}+\bar{p}^2_{kurtosis} pˉskew2+pˉkurtosis2去判断断样本是否服从正态分布
stats.normaltest(num_norm)
假设置信度水平 α \alpha α=0.05,函数返回的p值大于给定的显著性水平,则无法拒绝零假设
Box-Cox变换
- 如果数据通过正态性检验,那么正态分布的特性能为后续的分析带来便捷
- 倘若数据不服从正态分布,则需要随数据进行变换,即Box-Cox变换
- 称为幂变换,在不损失数据信息的前提下,解决线性回归中目标变量不满足正态分布的问题
- 通过对目标变量进行Box-Cox变换,数据集可以进行线性回归模型的建模操作
Box-Cox变换的数学表达式为:
f
(
x
)
=
{
x
λ
−
1
λ
,
λ
≠
0
l
o
g
x
,
λ
=
0
f(x)=\begin{cases} \frac{x^{\lambda}-1}{\lambda},\lambda\neq0 \\ logx,\lambda=0 \end{cases}
f(x)={λxλ−1,λ=0logx,λ=0
其中f(x)为经过Box-Cox变换后得到的新变量,x为原始因变量,
λ
\lambda
λ为变换参数
从表达式中可以知道,当取参数值为零,Box-Cox退化为对数变换