機器學習特徵工程--標準化和歸一化

關於歸一化和標準化

1.標準化使用條件

(1)不需要對特徵進行歸一化:基於樹模型的方法

舉例:  隨機森林/bagging/boosting/xgboost

  1. 需要標準化的(基於距離的模型):迴歸分析(邏輯迴歸)/神經網絡 / svm

2.相關定義

什麼叫歸一化(標準化):歸一化化就是要把你需要處理的數據經過處理後(通過某種算法)限制在你需要的一定範圍內

爲什麼要歸一化(標準化):

一是,爲了後面數據處理的方便,把不同量綱的東西放在同一量綱下比較,即把不同來源的數據統一到一個參考系下,這樣比較起來纔有意義。

簡單的舉個例子:一張表有兩個變量,一個是體重kg,一個是身高cm。假設一般情況下體重這個變量均值爲60(kg),身高均值爲170(cm)。1,這兩個變量對應的單位不一樣,同樣是100,對於身高來說很矮,但對於體重來說已經是超重了。另外,單位越小,數值越大,對結果的影響也越大,譬如170cm=1700mm。 簡單講,歸一化的目的是可以用數值來直接進行比較,如果不歸一化由於變量特性不同,同樣加10,代表的意義不一樣。

二是,保正程序運行時收斂加快,大部分模型歸一化後收斂速度會加快。例如,下面的例子,房間數和麪積數不在一個量綱上,面積數值太小,房間數太大,成橢圓狀,按照梯度收斂速度會慢,理想的是數據類似圓圈的形狀,經過有限幾個步驟則收斂了。

3.區別

歸一化和標準化的區別:網上查閱了很多資料,總結出結論:大區別沒有,小區別有。

歸一化:以後就認定爲是最大最小值歸一化或者叫0-1歸一化,取值範圍在[0,1]

之間。

標準化:剩下的幾種標準化方式都統一叫標準化,下面只介紹一種經常使用的z-score標準化,,經過處理後的數據均值爲0,標準差爲1,符合標準的正態分佈。

 

4.關於什麼時候用標準化什麼時候用歸一化的問題:

一般有最大值/最小值偏離平均值較遠時,使用歸一化

如果可以用平均值來表示大致的情況的時候, 採用標準化(zscore)

 

以下爲python代碼實現:

#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np

#方法一
#零-均值規範化
data = pd.read_csv('標準化測試數據.csv',index_col='userid')
#z-score標準化法(標準差標準化),符合標準正態分佈,即均值爲0,標準差爲1
data2= 1.0*(data - data.mean())/data.std() #數據標準化自由度 ddof默認爲1,即爲n-1
#data2= 1.0*(data - data.mean())/data.std(ddof=0) #數據標準化 ddof爲0時,爲n,和下面自己的z_score函數一樣
print(data2)

'''
#方法一sklearn  
#標準化數據,方差爲1,均值爲0
from sklearn.preprocessing import StandardScaler
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.transform(X_test)
'''

#方法二
#最小-最大規範化
data3=(data - data.min())/(data.max() - data.min())


#方法三
#小數定標規範化
data4=data/10**np.ceil(np.log10(data.abs().max()))


'''
注意:此函數與上面的dataframe計算方法有差異,上面默認自由度爲n-1,下面調的numpy的
包,直接爲n,所以會有些差距,一般數據量大的時候沒有太大影響
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.std.html#pandas.DataFrame.std
'''
def z_score(lst):
    '''z_score標準化函數,輸入爲一維列表,即[1,2,3,4,5,6,7]'''
    x = np.array(lst)
    _mean, _std = x.mean(), x.std()
    #_std = (sum([(item -_mean)**2  for item in lst])/(len(lst)-1)) **0.5 #改成這樣就可以和dataframe的一樣了
    if _std == 0:
        return lst
    data = [(item-_mean)/_std for item in lst]
    return data

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章