用scikit-learn做數(shù)據(jù)預(yù)處理

數(shù)據(jù)預(yù)處理是進行機器學(xué)習(xí)的必要環(huán)節(jié)系忙,對原始數(shù)據(jù)進行加工,比如標(biāo)準(zhǔn)化惠豺、歸一化银还、二進制化、特征編碼耕腾、插補缺失值见剩、生成多項式特征等。

scikit-learn 是 Python 下的機器學(xué)習(xí)工具包扫俺,集成了預(yù)處理苍苞、降維、聚類狼纬、分類等方法羹呵。我們用此工具來介紹數(shù)據(jù)預(yù)處理。

主要應(yīng)用的是 preprocessing 類疗琉。

標(biāo)準(zhǔn)化 Standardization

常用的標(biāo)準(zhǔn)化方法為 z-score 法冈欢,目的是將傳入的矩陣變?yōu)槊苛芯禐?、方差為1的標(biāo)準(zhǔn)型盈简,因為機器學(xué)習(xí)中的函數(shù)許多是以0為中心的凑耻,例如 sigmoid 函數(shù),方差為1可以使數(shù)據(jù)分布均勻柠贤,防止某個特征數(shù)據(jù)過大影響模型的訓(xùn)練香浩。

z-score 公式

我們用 sklearn 中的 preprocessing 類中的 scale 方法簡單進行標(biāo)準(zhǔn)化。

>>> from sklearn import preprocessing
>>> import numpy as np
>>> X = np.array([[ 1., -1.,  2.],
...               [ 2.,  0.,  0.],
...               [ 0.,  1., -1.]])
>>> X_scaled = preprocessing.scale(X)

>>> X_scaled                                          
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])

或者可以將計算均值和方差與轉(zhuǎn)換的步驟分開臼勉。

>>> scaler = preprocessing.StandardScaler().fit(X)
>>> scaler
StandardScaler(copy=True, with_mean=True, with_std=True)

>>> scaler.transform(X)                               
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])

fit 是計算過程邻吭,transform 是轉(zhuǎn)換過程。transform 的一個好處是可以繼續(xù)使用 fit 的數(shù)據(jù)宴霸,例如 transform 訓(xùn)練數(shù)據(jù)之后之后可以直接 transform 測試數(shù)據(jù)囱晴。

有時標(biāo)準(zhǔn)化時要求把數(shù)據(jù)縮放到某一個范圍中膏蚓,preprocessing 類也提供了 MinMaxScaler 方法,設(shè)置 MinMaxScaler 的參數(shù) feature_range=(min, max) 畸写。
當(dāng)然最常用的就是(0,1)范圍驮瞧。

>>> X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])
...
>>> min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5       ,  0.        ,  1.        ],
       [ 1.        ,  0.5       ,  0.33333333],
       [ 0.        ,  1.        ,  0.        ]])
歸一化 Normalization

歸一化是將每個樣本縮放到單位范數(shù)(可以粗略地理解為向量的函數(shù))的過程。如果后面要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用艺糜。歸一化的計算方法是 1除以p-范數(shù)剧董。歸一化之后的樣本的 p-范數(shù)等于1。

向量的p-范數(shù)

preprocessing 類下的 normalize 方法可以直接歸一化破停,并可以選擇 l1 范數(shù)與 l2 范數(shù)翅楼,默認是 l2 范數(shù)。

>>> X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
>>> X_normalized = preprocessing.normalize(X, norm='l2')

>>> X_normalized                                      
array([[ 0.40..., -0.40...,  0.81...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.  ...,  0.70..., -0.70...]])

normalize 也同樣有 fit 方法與 transform 方法真慢。

>>> normalizer = preprocessing.Normalizer().fit(X)  # fit does nothing
>>> normalizer
Normalizer(copy=True, norm='l2')

>>> normalizer.transform(X)                            
array([[ 0.40..., -0.40...,  0.81...],
       [ 1.  ...,  0.  ...,  0.  ...],
       [ 0.  ...,  0.70..., -0.70...]])
.
>>> normalizer.transform([[-1.,  1., 0.]])             
array([[-0.70...,  0.70...,  0.  ...]])
二進制化 Binarization

二進制化的方法是設(shè)定一個閾值毅臊,樣本值比閾值大的為1,小的為0黑界。

文本處理領(lǐng)域愿意使用二進制化管嬉,雖然歸一化和 TF-IDF 加工的特征表現(xiàn)得更好,但使用二進制化來簡化數(shù)據(jù)更為普遍(可能簡化概率推理)朗鸠。

>>> X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]

>>> binarizer = preprocessing.Binarizer().fit(X)  # fit does nothing
>>> binarizer
Binarizer(copy=True, threshold=0.0)

>>> binarizer.transform(X)
array([[ 1.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.]])

閾值調(diào)整需要設(shè)置 threshold 參數(shù)蚯撩,下面代碼是設(shè)置閾值1.1的情況。

>>> binarizer = preprocessing.Binarizer(threshold=1.1)
>>> binarizer.transform(X)
array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  0.]])
類別特征編碼 Encoding categorical features

比如現(xiàn)在有特征 ["male", "female"] ["from Europe", "from US", "from Asia"],
["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]烛占,
平常我們將特征進行整數(shù)編碼.

["male", "from US", "uses Internet Explorer"] 編碼應(yīng)該是 [0, 1, 3]胎挎。

["female", "from Asia", "uses Chrome"]的編碼應(yīng)該是[1,2,1]

但是 scikit-learn 估計器不能直接使用這種整數(shù)型的編碼忆家,它的輸入最好是連續(xù)型的犹菇,估計器也可能把整數(shù)編碼特征特征誤解為有序的數(shù)據(jù),這會有害于模型訓(xùn)練芽卿。

類別特征編碼用的是 OneHotEncoder 方法揭芍,占第幾位的特征值就是1,其余為0卸例。例如 ["male", "female"] 有兩個特征称杨,male 占第1個位置,剩下的0筷转,male 就是 [1,0]列另,female 就是 [0,1]; ["from Europe", "from US", "from Asia"]有3個特征旦装,"from Europe"就是 [1,0,0],"from US" 就是 [0,1,0]摊滔,"from Asia"就是 [0,0,1]阴绢,以此類推店乐。

["male", "from US", "uses Internet Explorer"]的整數(shù)編碼[0,1,3]的二進制編碼就是
[1,0, 0,1,0, 0,0,0,1]。

代碼實現(xiàn)用的是 preprocessing 類下的 OneHotEncoder 方法呻袭。

>>> enc = preprocessing.OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)
>>> enc.transform([[0, 1, 3]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])
插補缺失值 Imputation of missing values

以往對于數(shù)據(jù)中有丟失值的情況眨八,做法是把該數(shù)據(jù)所在行和列都刪掉,這樣的后果是容易丟失重要的數(shù)據(jù)左电。

imputer 的方法利用平均值廉侧、中位數(shù)或出現(xiàn)頻率最高的數(shù)據(jù)對缺失的數(shù)據(jù)進行填補。代碼如下篓足,NaN 即位丟失的值段誊。

>>> import numpy as np
>>> from sklearn.preprocessing import Imputer
>>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
>>> imp.fit([[1, 2], [np.nan, 3], [7, 6]])
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
>>> X = [[np.nan, 2], [6, np.nan], [7, 6]]
>>> print(imp.transform(X))                           
[[ 4.          2.        ]
 [ 6.          3.666...]
 [ 7.          6.        ]]

strategy 告訴了本代碼用 mean 平均值找補,fit 是用它括號里的數(shù)據(jù)計算平均值栈拖,transform 是應(yīng)用變換连舍。

生成多項式特征 Generating polynomial features

生成多項式的預(yù)處理方式是為了給輸入數(shù)據(jù)增加復(fù)雜性。處理后的特征會獲得高階的數(shù)據(jù)和交叉的數(shù)據(jù)涩哟。

用到的是 preprocessing 下的 PolynomialFeatures 方法索赏。

>>> import numpy as np
>>> from sklearn.preprocessing import PolynomialFeatures
>>> X = np.arange(6).reshape(3, 2)
>>> X                                                 
array([[0, 1],
       [2, 3],
       [4, 5]])
>>> poly = PolynomialFeatures(2)
>>> poly.fit_transform(X)                             
array([[  1.,   0.,   1.,   0.,   0.,   1.],
       [  1.,   2.,   3.,   4.,   6.,   9.],
       [  1.,   4.,   5.,  16.,  20.,  25.]])

PolynomialFeatures(2) 指的是最多生成二次項。
X的特征值由(X1贴彼,X2)變成了(1潜腻,X1,X2器仗,X12融涣,X1X2,X22)青灼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末暴心,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杂拨,更是在濱河造成了極大的恐慌专普,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弹沽,死亡現(xiàn)場離奇詭異檀夹,居然都是意外死亡,警方通過查閱死者的電腦和手機策橘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門炸渡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丽已,你說我怎么就攤上這事蚌堵。” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵吼畏,是天一觀的道長督赤。 經(jīng)常有香客問我,道長泻蚊,這世上最難降的妖魔是什么躲舌? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮性雄,結(jié)果婚禮上没卸,老公的妹妹穿的比我還像新娘。我一直安慰自己秒旋,他們只是感情好约计,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滩褥,像睡著了一般病蛉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瑰煎,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天铺然,我揣著相機與錄音,去河邊找鬼酒甸。 笑死魄健,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的插勤。 我是一名探鬼主播沽瘦,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼农尖!你這毒婦竟也來了析恋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤盛卡,失蹤者是張志新(化名)和其女友劉穎助隧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滑沧,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡并村,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了滓技。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哩牍。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖令漂,靈堂內(nèi)的尸體忽然破棺而出膝昆,到底是詐尸還是另有隱情丸边,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布荚孵,位于F島的核電站原环,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏处窥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一玄组、第九天 我趴在偏房一處隱蔽的房頂上張望滔驾。 院中可真熱鬧,春花似錦俄讹、人聲如沸哆致。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摊阀。三九已至,卻和暖如春踪蹬,著一層夾襖步出監(jiān)牢的瞬間胞此,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工跃捣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漱牵,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓疚漆,卻偏偏與公主長得像酣胀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子娶聘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容