規(guī)范化、標(biāo)準(zhǔn)化逻住、歸一化迎献、正則化,網(wǎng)上搜了一下扒秸,這幾種概念在不同的地方叫法各有不同。因此写烤,現(xiàn)做一個(gè)初步整理拾徙,便于后期進(jìn)一步理解。
比較好的參考1
比較好的參考2
比較好的參考3
比較好的參考4
為解釋清晰暂衡,下文統(tǒng)一為:規(guī)范化包含標(biāo)準(zhǔn)化崖瞭、歸一化和正則化
一读恃、規(guī)范化的目的
通常情況下是為了消除量綱的影響。譬如一個(gè)百分制的變量與一個(gè)5分值的變量在一起怎么比較疹吃?只有通過數(shù)據(jù)標(biāo)準(zhǔn)化西雀,都把它們標(biāo)準(zhǔn)到同一個(gè)標(biāo)準(zhǔn)時(shí)才具有可比性,將數(shù)據(jù)標(biāo)準(zhǔn)化為沒有單位的純數(shù)量腔呜。
二再悼、使用情況(引用)
- 看模型是否具有伸縮不變性。
- 不是所有的模型都一定需要標(biāo)準(zhǔn)化谤草,有些模型對(duì)量綱不同的數(shù)據(jù)比較敏感,譬如SVM等莺奸。當(dāng)各個(gè)維度進(jìn)行不均勻伸縮后灭贷,最優(yōu)解與原來不等價(jià),這樣的模型仗岖,除非原始數(shù)據(jù)的分布范圍本來就不叫接近,否則必須進(jìn)行標(biāo)準(zhǔn)化真友,以免模型參數(shù)被分布范圍較大或較小的數(shù)據(jù)主導(dǎo)紧帕。
- 但是如果模型在各個(gè)維度進(jìn)行不均勻伸縮后桅打,最優(yōu)解與原來等價(jià)挺尾,例如logistic regression等,對(duì)于這樣的模型遭铺,是否標(biāo)準(zhǔn)化理論上不會(huì)改變最優(yōu)解魂挂。但是,由于實(shí)際求解往往使用迭代算法坠非,如果目標(biāo)函數(shù)的形狀太“扁”果正,迭代算法可能收斂得很慢甚至不收斂。所以對(duì)于具有伸縮不變性的模型潦闲,最好也進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化歉闰。
三舍杜、規(guī)范化的三種不同方法
- 標(biāo)準(zhǔn)化:如zero-mean normalization,經(jīng)過處理的數(shù)據(jù)符合標(biāo)準(zhǔn)正態(tài)分布
- 歸一化:如區(qū)間縮放法(Min-max normalization),將數(shù)據(jù)特征縮放至某一范圍概龄,通常是0-1
- 正則化:通常是指除以向量的范數(shù)饲握。例如:將一個(gè)向量的歐氏長(zhǎng)度等價(jià)于1 蚕键。在神經(jīng)網(wǎng)絡(luò)中锣光,“正則化”通常是指將向量的范圍重縮放至最小化或者一定范圍铝耻,使所有的元素都在[0,1]范圍內(nèi)。通常用于文本分類或者文本聚類中频丘。
3.1 z-score標(biāo)準(zhǔn)化
- 公式:(X-X_mean)/X_std #計(jì)算時(shí)對(duì)每個(gè)屬性/每列分別進(jìn)行泡态。
- 目的:將數(shù)據(jù)按其屬性(按列進(jìn)行)減去其均值某弦,然后除以其方差。又叫標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化怔毛,經(jīng)過處理的數(shù)據(jù)符合標(biāo)準(zhǔn)正態(tài)分布亮钦,即均值為0馆截,標(biāo)準(zhǔn)差為1。
方法一:使用preprocessing.scale()函數(shù)對(duì)指定數(shù)據(jù)進(jìn)行轉(zhuǎn)換
sklearn.preprocessing.scale(X,axis=0,with_mean=True,with_std=True,copy=True)
X:數(shù)組或者矩陣
axis:int類型蜂莉,初始值為0蜡娶,如果是0,則單獨(dú)的標(biāo)準(zhǔn)化每個(gè)特征(列)映穗;如果是1窖张,則標(biāo)準(zhǔn)化每個(gè)觀測(cè)樣本(行)。
with_mean:boolean類型蚁滋,默認(rèn)為true宿接,表示將數(shù)據(jù)均值規(guī)范到0
with_std:boolean類型,默認(rèn)為true,表示將數(shù)據(jù)方差規(guī)范到1
from sklearn import preprocessing
import numpy as np
X=np.array([[1,-1,2],[2,0,0],[0,1,-1]])
#calculate mean
X_mean=X.mean(axis=0)
X_std=X.std(axis=0)
print('raw data mean:',X_mean)
print('raw data variance:',X_std)
#standardize X
X1=(X-X_mean)/X_std
print('standardize result1:',X1)
#use function preprocessing.scale to standardize X
X_scale=preprocessing.scale(X)
print('standardize result2-sklearn:',X_scale)
print(X_scale.mean(axis=0))
print(X_scale.std(axis=0))
#最后X_scale與X1的值相同
方法二:使用preprocessing.StandardScaler類實(shí)現(xiàn)對(duì)訓(xùn)練集和測(cè)試集的擬合和轉(zhuǎn)換
代碼舉例
from sklearn import preprocessing
import numpy as np
X=np.array([[1,-1,2],[2,0,0],[0,1,-1]])
scaler=preprocessing.StandardScaler()
X_scaled=scaler.fit_transform(X)
print('standardize result3-sklearn:',X_scaled)
print(X_scaled.mean(axis=0))
print(X_scaled.std(axis=0))
#scale與standardscaler結(jié)果相同
#scale與standardscaler的區(qū)別在于standardscaler可以直接使用訓(xùn)練集對(duì)測(cè)試集數(shù)據(jù)進(jìn)行轉(zhuǎn)換
print(scaler.transform([-1,1,0]))
3.2 區(qū)間縮放歸一化——將屬性縮放到一個(gè)指定的Max和Min
- 公式:(X-Min)/(Max-Min) #計(jì)算時(shí)對(duì)每個(gè)屬性/每列分別進(jìn)行睦霎。
- 目的:
1、對(duì)于方差非常小的屬性可以增強(qiáng)其穩(wěn)定性走诞;
2副女、維持稀疏矩陣中為0的條目。
方法:使用preprocessing的MinMaxScaler函數(shù)
from sklearn import preprocessing
import numpy as np
X=np.array([[1,-1,2],[2,0,0],[0,1,-1]])
X_minmax=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))
print('scaling result1:',X_std)
min_max_scaler = preprocessing.MinMaxScaler()
X_minMax = min_max_scaler.fit_transform(X)
print('scaling result2-sklearn:',X_minMax)
#公式計(jì)算與函數(shù)計(jì)算結(jié)果相同
#測(cè)試用例
X_test = np.array([[ -3., -1., 4.]])
X_test_minmax = min_max_scaler.transform(X_test)
print(X_test_minmax)
3.3 正則化
- 公式:正則化其實(shí)和“帶約束的目標(biāo)函數(shù)”是等價(jià)的蚣旱,二者可以互相轉(zhuǎn)換碑幅。
數(shù)學(xué)模型如下:
通過熟悉的拉格朗日乘子法(注意這個(gè)方法的名字)戴陡,可以變?yōu)槿缦滦问剑?br>
正則化因子,也就是里面的那個(gè)lamda沟涨,如果它變大了恤批,說明目標(biāo)函數(shù)的作用變小了,正則化項(xiàng)的作用變大了裹赴,對(duì)參數(shù)的限制能力加強(qiáng)了喜庞,這會(huì)使得參數(shù)的變化不那么劇烈(僅對(duì)如上數(shù)學(xué)模型),直接的好處就是避免模型過擬合篮昧。赋荆。 - 目的:約束要優(yōu)化的參數(shù)笋妥,防止過擬合
方法一:使用preprocessing的normalize()函數(shù)對(duì)指定數(shù)據(jù)進(jìn)行轉(zhuǎn)換
X=np.array([[1,-1,2],[2,0,0],[0,1,-1]])
X_normalized=preprocessing.normalize(X,norm='l2')
print('normalize result1:',X_normalized)
方法二:使用preprocessing的Normalizer()類實(shí)現(xiàn)對(duì)訓(xùn)練集和測(cè)試集的擬合和轉(zhuǎn)換
normalizer=preprocessing.Normalizer().fit(X)
normalizer.transform(X)
normalizer.transform([[-1,1,0]])
以上是為規(guī)范化(標(biāo)準(zhǔn)化懊昨、歸一化、正則化)春宣,后期還有二值化酵颁、稀疏矩陣這些概念≡碌郏總體感受躏惋,還是需要通過具體事例進(jìn)一步理解和運(yùn)用。