- Author: 杜七
一、前言
数据挖掘过程中,不同变量数据单位不一,比如,我们想知道一个人身体健康状况,其身高是180cm,体重是80kg,视力是2.5,心跳是70/min,这些指标都是描述一个人身体状况的数据,这些单一不一的指标会对建模的准确度有一定影响。因此,在数据挖掘之前,我们要对数据做标准化处理。
另外,建模之后,我们产生了有价值的目标变量数据,但是这些数据都是标准化数据形式,跟实际业务问题的需求有一定偏差。如此,需要对数据做一定的变换,比如使其接近正态分布,这样从数据形式上可以对业务问题有更好的解释。
二、数据标准化
数据标准化有很多形式,这里简单总结三种,如下:
1,标准化(z_score规范化)
假设我们有一个X向量,x(i,j),i = 1,..,m;j = 1,..,n。z_score规范化如下:
x(i,j)' = [x(i,j) - E(j)] / S[j]
,即x(i,j)减去第j列的均值再除以第j列的标准差。
这样处理之后,原数据就变成了均值为0,方差为1,记作:
X' = [X - E(X)] / S(X)
,其中,E(X) = 0, S(X) = 1。
2,中心化
假设我们有一个X向量,x(i,j),i = 1,..,m;j = 1,..,n。中心化如下:
x(i,j)' = x(i,j) - E(j)
,E(j)是第j列的均值。
如此变化以后,均值为0,但是方差矩阵不变。
3,极差标准化
假设我们有一个X向量,x(i,j),i = 1,..,m;j = 1,..,n。极差标准化如下:
x(i,j) = [x(i,j) - E(j)]/ ( max(j) - min(j)
.
这样变换后,均值为0,方差为1.
4,小数定标规范化
小数定标规范化通过移动数据A的小数点位置进行规范化。小数点的移动位置依赖数据A的最大值。由下式计算:|max(A)|<1的最小整数。假设A的取值为-986 ~ 917,A的最大绝对值为986,使用小数定标规范化,用1000除以每个值,这样-986标准化为-0.986,917则为0.917.
注意:极差标准化和小数定标规范化都改变了原数据,如果想统一转换为原数据比较麻烦。所以可以尽量通过前两种方法来做规范化。
4,R中标准化实现
R语言中有现成的函数,比如scale,可以通过设置scale的参数来实现z_score和中心化的数据标准化,具体参考?scale.
当然,可以可以自己写一个规范化函数,如下:
data.scale <- function(data,method = "z_score")
{
\# """
\# 1) 数据标准化有很多种方法,这里只用了两种:z_score,min-max
\# 2) 后续可以再添加其他的标准化的方法
# 如果方法选择z_score
if(method == "min_max"){
if(length(data) == 0 )
stop("Please input not empty dataset,ok?")
if(class(data) == "factor")
stop("Please transforme factor to numeric or double,integer!")
m.value = mean(data,na.rm = TRUE)
m.var = var(data,na.rm = TRUE)
new.data = (data - m.value)/m.var
}
\# 如果方法选择min-max
else {
if(length(data) == 0 )
stop("Please input not empty dataset,ok?")
if(class(data) == "factor")
stop("Please transforme factor to numeric or double,integer!")
m.value = range(data,na.rm = FALSE)
new.data = (data - m.value[1])/(m.value[2] - m.value[1])
}
}
三、数据正态化
数据正态化,目的是稳定方差,直线化,使数据分布正态或者接近正态。
如果y = f(x) 是x的线性函数,不影响分析;但是如果是非线性函数,y和x的表现就完全不同,包括分布,方差和数据间关系也会不同。
1,误差传播公式
这个不做过多解释,请参考这里
2,BOX_COX变换
1)Box-cox常见变换
Box-Cox在1964年从实际数据出发提出了一个很有效的变换,如下:
y = ifelse(k = 0,log(y),[y^k-1]/k)
,此变换有如下特点:
- 改变分布形状,使之正态分布,至少是对称的;
- 当x>=0,能保持数据大小次序;
- 对变换结果有很好的解释:
- k=2为平方变换;
- k=1为恒等变换;
- k=0.5平方根变换;
- k=0为对数变换;
- k=-0.5为平方根倒数变换;
- k=-1为倒数变换
2),BOX-COX拓展变换
实际应用中,Box-Cox还有个扩展式,如下:
y = ifelse(k1 = 0,log(y+k2),[(y +k2)^k1-1]/k1)
,任意y,保证y+k2>0,即k2已知,k1为参数。
3),Box-cox实际应用
请参考这个文章,Box-Cox Transformation
小结
- 很多右偏数据可以正态化
- 对数变换后呈正态分布,方差稳定
- 不太严重的右偏,使用平方根变换
- 严重右偏,倒数变换
三、参考文献
1,Box-Cox Transform: An Overview
2,Box-Cox变换
3,统计学与R语言笔记-徐俊晓