sklearn 特徵預處理,歸一化和標準化,缺失值處理

目錄

1.什麼是特徵處理

2.不同的特徵數據處理方式

3.歸一化

公式

公式講解

sklearn 歸一化實例

歸一化的運用場景

歸一化的缺點——異常點

4.標準化

公式

公式分析

sklearn 標準化實例

標準化的意義

缺失值處理方法

參考資料


1.什麼是特徵處理

通過特點的統計法(數學方法),將數據轉換成算法要求的數據

 

2.不同的特徵數據處理方式

數值型數據(實數型),通過標準縮放進行處理,標準縮放簡單來講就是將數字大小縮小化(偏0),如100縮小到0~1之間,常用的算法有:

  • a.歸一化
  • b.標準化

類別型數據,比如性別,國籍,這些有限類別的數據值,可將其轉換爲整數數字,性別男女對於0或1;世界上有197個國家,所以可用1-197對國籍標號,對於這樣的處理方式,常用的算法有:

  • a.one-hot編碼化

時間型數據,對於時間型數據,常用的做法是切分時間段,算法爲:

  • a.時間切分

3.歸一化

歸一化是指對原始數據進行變換,把數據映射到一個指定的區間,如[0,1]之間

公式

公式講解

對於下列數據,將其做歸一化,其結果如右。max代表一列的最大值,min代表一列的最小值,x代表爲變量(被歸一化的值)。比如特徵1(第一列)的第一個值90,這一列的最大值爲90,最小值爲60,則有

X`=90-60/90-60=1 

mx和mi分別爲指定區間值,mx爲1,mi爲0,區間值指的是我們想要縮小到的區間,默認是[0,1]。sklearn 可以調整這個區間值。

X``=1*(1-0)+0=1

所以90進過歸一化後變成了1,類似的60變成了0,75變成了0.5

 

sklearn 歸一化實例

sklearn API接口: sklearn.preprocessing.MinMaxScaler

from sklearn.preprocessing import MinMaxScaler

def normalization():
    mm=MinMaxScaler()
    data=mm.fit_transform([[90,2,10,40],
                           [60,4,15,45],
                           [75,3,13,46]])
    print(data)

if __name__=="__main__":
     normalization()

打印結果 

縮小區間可以調整, 如將其調整到(1,3)

mm=MinMaxScaler(feature_range=(1,3))

歸一化的運用場景

相親約會對象數據,這個樣本時男士的數據,三個特徵,玩遊戲所消耗時間的 百分比、每年獲得的飛行常客里程數、每週消費的冰淇淋公升數。然後有一個 所屬類別,被女士評價的三個類別,不喜歡didnt、魅力一般small、極具魅力large 也許也就是說飛行里程數對於結算結果或者說相親結果影響較大,但是統計的 人覺得這三個特徵同等重要。

 

在此處爲什麼要進行歸一化,歸一化說白了就是控制數據在指定的範圍內,防止過大數據對結果造成干擾。

這裏先使用一個k-means算法(k近臨算法)

k-means就是同一特徵下的兩個樣本,相減取平方。

對於上圖標紅的兩個樣本(從現在開始,表中的行稱爲樣本,列稱爲特徵值),使用k-means時,計算(72993-35948)^2 + (10.141740-6.830792)^2 + (1.032955-1.213192)^2,會發現(72993-35948)^2的值過大,後面兩項基本可以忽略不計了,但是案例中有一句話很重要------“統計的 人覺得這三個特徵同等重要”。所以,就要解決這個情況,可以使用歸一化解決。

最終,使得某一個特徵對最終結果不會造成更大影響。

 

歸一化的缺點——異常點

如果數據中異常點較多,對歸一化會有什麼影響?

回憶歸一化公式,x1=x-min/max-min , x1的值容易受到max-min的影響,x2也就受到影響,所以當出現特別大和特別小的數值,會對結果產生很大的影響,如下面這組值,

data=mm.fit_transform([[900,2,10,40],
                       [60,4,15,45],
                       [75,3,13,46],
                       [45,3,13,46],
                       [65,3,13,46],
                       [90,3,13,46],])

進行歸一化的結果爲,第一個值900極大的影響了這一特徵值,使得其他數值被極大縮小了:

[[1.         0.         0.         0.        ]
 [0.01754386 1.         1.         0.83333333]
 [0.03508772 0.5        0.6        1.        ]
 [0.         0.5        0.6        1.        ]
 [0.02339181 0.5        0.6        1.        ]
 [0.05263158 0.5        0.6        1.        ]]

 

總結:注意在特定場景下最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性(可以理解爲穩定性)較差,只適合傳統精確小數據場景。

 

 

4.標準化

標準化是指對原始數據進行變換把數據變換到均值爲0,標準差爲1。如何將一組特徵值變滿足這一條件的一組值,需要用到以下公式。

公式

x代表當前特徵值,mean代表該類特徵值的平均數

其中σ的計算方式如下,var代表方差,σ爲方差var開根號

 

公式分析

有以下一組特徵值,計算第一列三個(90,60,75)的X`。

[90,2,10,40],
[60,4,15,45],
[75,3,13,46]

第一列平均數

mean=90+60+75/3=75

var=(90-75)^2+(60-75)^2+(75-75)^2/3=150

σ=√150=12.247

X1`=90-75/12.247=1.2247897

X2`=60-75/12.247=-1.2247897

X3`=75-75/12.247=0

標準化處理後的第一組數據爲

1.2247897 -1.2247897 0

對於這一組結果,是否滿足均值爲0,標準差爲1呢?計算一下

均值=1.2247897+(-1.2247897)+0/3=0

標準差=√方差=√((1.2247897-0)^2+(1.2247897-0)^+(0-0)^2)/3=1(注意,這裏其實是約等於1)

根據計算結果,顯然滿足我們對標準化的定義

 

sklearn 標準化實例

sklearn API接口:sklearn.preprocessing.StandardScaler

from sklearn.preprocessing import StandardScaler

def standar():
    st = StandardScaler()
    data = st.fit_transform([[90,2,10,40],
                           [60,4,15,45],
                           [75,3,13,46]])
    print(data)

if __name__=="__main__":
     standar()

 輸出結果,可以看到第一列的值與我們計算的是一樣的。

標準化的意義

使用標準化的意義在於解決歸一化的缺陷,即當出現異常點,影響了最大值或最小值,那麼結果顯然會發生改變;而對於標準化來說,具有一定數據量,少量的異常點對平均值的影響不是那麼大,從而方差改變也較小

 

缺失值處理方法

在做數據預處理之前,有些數據可能存在缺失值,比如對某一組特徵數據,其不存在特徵x,或者在獲取該特徵時因爲某些原因沒有錄入,有兩種處理方式:

  • 刪除:刪除該行數據(不對這一組數據做特徵值預處理),或是刪除該特徵值(不對該特徵做預處理)
  • 填補:可用該列特徵值的平均數或中位數進行填補,通常來說,使用填補的方式處理缺失值更加穩妥

比如該組數據

[90,2,10,40],
[60,4,15,45],
[75,3,13,46]

假設某組數據有缺失值,這樣就有個問題,缺失的部分填什麼,填0或者不填可以麼,當然不可以

[90,2,10,],
[,4,15,45],
[75,3,,46]

補充:numpy提供了缺失值的填補方式,即np.nan

使用numpy填補後的數據

[90,2,10,np.nan],
[np.nan,4,15,45],
[75,3,np.nan,46]

sklearn 提供了缺失值處理API:sklearn.impute.SimpleImputer

我們使用平均值來填補缺失值

from sklearn.impute import SimpleImputer

def imputer():
    im=SimpleImputer(missing_values=np.nan,strategy="mean")
    data=im.fit_transform([[90,2,10,np.nan],
                           [np.nan,4,15,45],
                           [75,3,np.nan,46]])
    print(data)

if __name__=="__main__":
     imputer()

結果如下 

注意:平均值不計算缺失部分,如第一列特徵的平均值=90+75/2=82.5

 

參考資料

歸一化案例:約會相親對象 https://www.cnblogs.com/cwj2019/p/11720029.html 

數據的標準化(normalization)和歸一化 https://www.cnblogs.com/LazyJoJo/p/7216523.html

數據預處理Preprocessing data https://blog.csdn.net/pipisorry/article/details/52247679

缺失值處理&異常值處理 https://blog.csdn.net/xiedelong/article/details/81607598

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