目錄
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