- Author: 杜七
一页滚、前言
數(shù)據(jù)挖掘過程中,不同變量數(shù)據(jù)單位不一贞盯,比如整葡,我們想知道一個人身體健康狀況旬渠,其身高是180cm,體重是80kg,視力是2.5,心跳是70/min,這些指標(biāo)都是描述一個人身體狀況的數(shù)據(jù),這些單一不一的指標(biāo)會對建模的準(zhǔn)確度有一定影響。因此,在數(shù)據(jù)挖掘之前,我們要對數(shù)據(jù)做標(biāo)準(zhǔn)化處理叭披。
另外,建模之后,我們產(chǎn)生了有價值的目標(biāo)變量數(shù)據(jù)贩猎,但是這些數(shù)據(jù)都是標(biāo)準(zhǔn)化數(shù)據(jù)形式,跟實(shí)際業(yè)務(wù)問題的需求有一定偏差。如此桩匪,需要對數(shù)據(jù)做一定的變換,比如使其接近正態(tài)分布贾惦,這樣從數(shù)據(jù)形式上可以對業(yè)務(wù)問題有更好的解釋。
二、數(shù)據(jù)標(biāo)準(zhǔn)化
數(shù)據(jù)標(biāo)準(zhǔn)化有很多形式雁乡,這里簡單總結(jié)三種扩淀,如下:
1象对,標(biāo)準(zhǔn)化(z_score規(guī)范化)
假設(shè)我們有一個X向量,x(i,j),i = 1,..,m;j = 1,..,n。z_score規(guī)范化如下:
x(i,j)' = [x(i,j) - E(j)] / S[j]
,即x(i,j)減去第j列的均值再除以第j列的標(biāo)準(zhǔn)差蕊玷。
這樣處理之后方庭,原數(shù)據(jù)就變成了均值為0械念,方差為1希停,記作:
X' = [X - E(X)] / S(X)
,其中违崇,E(X) = 0, S(X) = 1砂客。
2,中心化
假設(shè)我們有一個X向量瘫怜,x(i,j),i = 1,..,m;j = 1,..,n术徊。中心化如下:
x(i,j)' = x(i,j) - E(j)
,E(j)是第j列的均值。
如此變化以后鲸湃,均值為0赠涮,但是方差矩陣不變。
3暗挑,極差標(biāo)準(zhǔn)化
假設(shè)我們有一個X向量笋除,x(i,j),i = 1,..,m;j = 1,..,n。極差標(biāo)準(zhǔn)化如下:
x(i,j) = [x(i,j) - E(j)]/ ( max(j) - min(j)
.
這樣變換后炸裆,均值為0株憾,方差為1.
4,小數(shù)定標(biāo)規(guī)范化
小數(shù)定標(biāo)規(guī)范化通過移動數(shù)據(jù)A的小數(shù)點(diǎn)位置進(jìn)行規(guī)范化晒衩。小數(shù)點(diǎn)的移動位置依賴數(shù)據(jù)A的最大值嗤瞎。由下式計(jì)算:|max(A)|<1的最小整數(shù)。假設(shè)A的取值為-986 ~ 917听系,A的最大絕對值為986贝奇,使用小數(shù)定標(biāo)規(guī)范化,用1000除以每個值靠胜,這樣-986標(biāo)準(zhǔn)化為-0.986掉瞳,917則為0.917.
注意:極差標(biāo)準(zhǔn)化和小數(shù)定標(biāo)規(guī)范化都改變了原數(shù)據(jù)毕源,如果想統(tǒng)一轉(zhuǎn)換為原數(shù)據(jù)比較麻煩。所以可以盡量通過前兩種方法來做規(guī)范化陕习。
4霎褐,R中標(biāo)準(zhǔn)化實(shí)現(xiàn)
R語言中有現(xiàn)成的函數(shù),比如scale,可以通過設(shè)置scale的參數(shù)來實(shí)現(xiàn)z_score和中心化的數(shù)據(jù)標(biāo)準(zhǔn)化该镣,具體參考?scale.
當(dāng)然冻璃,可以可以自己寫一個規(guī)范化函數(shù),如下:
data.scale <- function(data,method = "z_score")
{
\# """
\# 1) 數(shù)據(jù)標(biāo)準(zhǔn)化有很多種方法损合,這里只用了兩種:z_score,min-max
\# 2) 后續(xù)可以再添加其他的標(biāo)準(zhǔn)化的方法
# 如果方法選擇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])
}
}
三省艳、數(shù)據(jù)正態(tài)化
數(shù)據(jù)正態(tài)化,目的是穩(wěn)定方差嫁审,直線化跋炕,使數(shù)據(jù)分布正態(tài)或者接近正態(tài)。
如果y = f(x) 是x的線性函數(shù)律适,不影響分析辐烂;但是如果是非線性函數(shù),y和x的表現(xiàn)就完全不同捂贿,包括分布纠修,方差和數(shù)據(jù)間關(guān)系也會不同。
1眷蜓,誤差傳播公式
這個不做過多解釋,請參考這里
2胎围,BOX_COX變換
1)Box-cox常見變換
Box-Cox在1964年從實(shí)際數(shù)據(jù)出發(fā)提出了一個很有效的變換吁系,如下:
y = ifelse(k = 0,log(y),[y^k-1]/k)
,此變換有如下特點(diǎn):
- 改變分布形狀,使之正態(tài)分布白魂,至少是對稱的汽纤;
- 當(dāng)x>=0,能保持?jǐn)?shù)據(jù)大小次序;
- 對變換結(jié)果有很好的解釋:
- k=2為平方變換福荸;
- k=1為恒等變換蕴坪;
- k=0.5平方根變換敬锐;
- k=0為對數(shù)變換径玖;
- k=-0.5為平方根倒數(shù)變換赞赖;
- k=-1為倒數(shù)變換
2)前域,BOX-COX拓展變換
實(shí)際應(yīng)用中,Box-Cox還有個擴(kuò)展式年堆,如下:
y = ifelse(k1 = 0,log(y+k2),[(y +k2)^k1-1]/k1)
,任意y变丧,保證y+k2>0,即k2已知,k1為參數(shù)攻晒。
3),Box-cox實(shí)際應(yīng)用
請參考這個文章给梅,Box-Cox Transformation
小結(jié)
- 很多右偏數(shù)據(jù)可以正態(tài)化
- 對數(shù)變換后呈正態(tài)分布,方差穩(wěn)定
- 不太嚴(yán)重的右偏,使用平方根變換
- 嚴(yán)重右偏拘哨,倒數(shù)變換
三、參考文獻(xiàn)
1,Box-Cox Transform: An Overview
2,Box-Cox變換
3,統(tǒng)計(jì)學(xué)與R語言筆記-徐俊曉