scikit-learn系列之如何做數(shù)據(jù)準備

如何準備數(shù)據(jù)

幾乎所有的機器學習算法都需要對數(shù)據(jù)進行準備鸵钝,不同的算法根據(jù)其假設俺抽,可能要求不同的數(shù)據(jù)轉(zhuǎn)化川抡。原文作者的建議是:使用一個數(shù)據(jù)驅(qū)動的方法,組合多種數(shù)據(jù)準備方法和多種算法缩搅,比較表現(xiàn)優(yōu)劣越败,建立起數(shù)據(jù)轉(zhuǎn)化和算法的對應關(guān)系。

1. 調(diào)整數(shù)據(jù)尺度(Rescale data)

當你的數(shù)據(jù)處于不同的尺度時硼瓣,把所有的數(shù)據(jù)屬性都統(tǒng)一到一個標準尺度究飞,對提升ML算法表現(xiàn)是很有幫助的。這種rescale可以看出是一種標準化堂鲤,通常會把屬性范圍調(diào)整到0-1亿傅。使用的場景:如gradient descent的最優(yōu)化算法、回歸瘟栖、神經(jīng)網(wǎng)絡和使用距離的算法(以權(quán)重作為輸入)葵擎。使用scikit-learn 中的MinMaxScaler類實現(xiàn)。代碼如下:

import pandas as pd
import numpy as np
#import scipy
from sklearn.preprocessing import MinMaxScaler
data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
df = pd.read_csv(data_link,names=names)
data = df.values
X = data[:,0:8]
Y = data[:,8]
scaler = MinMaxScaler(feature_range=(0,1))
rescaledX = scaler.fit_transform(X)
np.set_printoptions(precision = 3)
print(X)
print(rescaledX)

結(jié)果如下:

[[   6.     148.      72.    ...,   33.6      0.627   50.   ]
 [   1.      85.      66.    ...,   26.6      0.351   31.   ]
 [   8.     183.      64.    ...,   23.3      0.672   32.   ]
 ..., 
 [   5.     121.      72.    ...,   26.2      0.245   30.   ]
 [   1.     126.      60.    ...,   30.1      0.349   47.   ]
 [   1.      93.      70.    ...,   30.4      0.315   23.   ]]
[[ 0.353  0.744  0.59  ...,  0.501  0.234  0.483]
 [ 0.059  0.427  0.541 ...,  0.396  0.117  0.167]
 [ 0.471  0.92   0.525 ...,  0.347  0.254  0.183]
 ..., 
 [ 0.294  0.608  0.59  ...,  0.39   0.071  0.15 ]
 [ 0.059  0.633  0.492 ...,  0.449  0.116  0.433]
 [ 0.059  0.467  0.574 ...,  0.453  0.101  0.033]]

2. 正態(tài)化數(shù)據(jù)(standardize data)

標準化使用高斯分布半哟,把不同mean和SD的數(shù)據(jù)轉(zhuǎn)化為標準分布(mean為0酬滤,SD為1)。使用場景:線性回歸寓涨、logistic回歸和線性區(qū)分問題盯串。 使用scikit-learn 中的StandardScaler類實現(xiàn)。代碼如下:

import pandas as pd
import numpy as np
#import scipy
from sklearn.preprocessing import StandardScaler
data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
df = pd.read_csv(data_link,names=names)
data = df.values
X = data[:,0:8]
Y = data[:,8]
scaler = StandardScaler().fit(X)
rescaledX = scaler.transform(X)
np.set_printoptions(precision = 3)
print(X)
print(rescaledX)

結(jié)果如下:

[[   6.     148.      72.    ...,   33.6      0.627   50.   ]
 [   1.      85.      66.    ...,   26.6      0.351   31.   ]
 [   8.     183.      64.    ...,   23.3      0.672   32.   ]
 ..., 
 [   5.     121.      72.    ...,   26.2      0.245   30.   ]
 [   1.     126.      60.    ...,   30.1      0.349   47.   ]
 [   1.      93.      70.    ...,   30.4      0.315   23.   ]]
[[ 0.64   0.848  0.15  ...,  0.204  0.468  1.426]
 [-0.845 -1.123 -0.161 ..., -0.684 -0.365 -0.191]
 [ 1.234  1.944 -0.264 ..., -1.103  0.604 -0.106]
 ..., 
 [ 0.343  0.003  0.15  ..., -0.735 -0.685 -0.276]
 [-0.845  0.16  -0.471 ..., -0.24  -0.371  1.171]
 [-0.845 -0.873  0.046 ..., -0.202 -0.474 -0.871]]

3. 標準化數(shù)據(jù)(normalize data)

把每一行調(diào)整到長度為1(線性代數(shù)中的a unit norm戒良,這個不太懂体捏,需要深入挖掘)。用于稀疏數(shù)據(jù)糯崎,使用場景:使用權(quán)重輸入的神經(jīng)網(wǎng)絡和使用距離的k近鄰算法几缭。使用scikit-learn 中的 Normalizer 類實現(xiàn)。代碼如下:

import pandas as pd
import numpy as np
#import scipy
from sklearn.preprocessing import Normalizer
data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
df = pd.read_csv(data_link,names=names)
data = df.values
X = data[:,0:8]
Y = data[:,8]
scaler = Normalizer().fit(X)
normalizedX = scaler.transform(X)
np.set_printoptions(precision = 3)
print(X)
print(normalizedX)

結(jié)果如下:

[[   6.     148.      72.    ...,   33.6      0.627   50.   ]
 [   1.      85.      66.    ...,   26.6      0.351   31.   ]
 [   8.     183.      64.    ...,   23.3      0.672   32.   ]
 ..., 
 [   5.     121.      72.    ...,   26.2      0.245   30.   ]
 [   1.     126.      60.    ...,   30.1      0.349   47.   ]
 [   1.      93.      70.    ...,   30.4      0.315   23.   ]]
[[ 0.034  0.828  0.403 ...,  0.188  0.004  0.28 ]
 [ 0.008  0.716  0.556 ...,  0.224  0.003  0.261]
 [ 0.04   0.924  0.323 ...,  0.118  0.003  0.162]
 ..., 
 [ 0.027  0.651  0.388 ...,  0.141  0.001  0.161]
 [ 0.007  0.838  0.399 ...,  0.2    0.002  0.313]
 [ 0.008  0.736  0.554 ...,  0.241  0.002  0.182]]

4. 二值數(shù)據(jù)(binarize data)

使用閾值沃呢,把數(shù)據(jù)轉(zhuǎn)化為二值年栓,大于閾值設置為1,小于閾值設置為0薄霜。使用場景:當生成crisp values的時候使用(不知道什么意思)韵洋,還有就是feature egnineering的時候增加屬性。使用scikit-learn 中的 Binarizer 類實現(xiàn)黄锤。代碼如下:

import pandas as pd
import numpy as np
#import scipy
from sklearn.preprocessing import Binarizer
data_link = 'https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
df = pd.read_csv(data_link,names=names)
data = df.values
X = data[:,0:8]
Y = data[:,8]
binarizer = Binarizer(threshold=0.0).fit(X)
binaryX = binarizer.transform(X)
np.set_printoptions(precision = 3)
print(X)
print(binaryX)

結(jié)果如下:

[[   6.     148.      72.    ...,   33.6      0.627   50.   ]
 [   1.      85.      66.    ...,   26.6      0.351   31.   ]
 [   8.     183.      64.    ...,   23.3      0.672   32.   ]
 ..., 
 [   5.     121.      72.    ...,   26.2      0.245   30.   ]
 [   1.     126.      60.    ...,   30.1      0.349   47.   ]
 [   1.      93.      70.    ...,   30.4      0.315   23.   ]]
[[ 1.  1.  1. ...,  1.  1.  1.]
 [ 1.  1.  1. ...,  1.  1.  1.]
 [ 1.  1.  1. ...,  1.  1.  1.]
 ..., 
 [ 1.  1.  1. ...,  1.  1.  1.]
 [ 1.  1.  1. ...,  1.  1.  1.]
 [ 1.  1.  1. ...,  1.  1.  1.]]

5. 總結(jié):

可以使用以下4種方法準備數(shù)據(jù):rescale搪缨,standardize,normalize鸵熟,binarizer副编。但是更為重要的,我認為是:在實踐中熟練不同數(shù)據(jù)準備方法的使用場景流强,在使用中建立其對算法提升的理論和知覺痹届,更為重要呻待。

6. 知識點:

  1. MinMaxscaler
  2. StandardScaler
  3. Normalizer
  4. Binarizer
  5. xx.fit(X)
  6. scaler.transform(X)

原文鏈接:How To Prepare Your Data For Machine Learning in Python with Scikit-Learn

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市队腐,隨后出現(xiàn)的幾起案子蚕捉,更是在濱河造成了極大的恐慌,老刑警劉巖柴淘,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迫淹,死亡現(xiàn)場離奇詭異,居然都是意外死亡为严,警方通過查閱死者的電腦和手機敛熬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來第股,“玉大人应民,你說我怎么就攤上這事∠ξ牵” “怎么了诲锹?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涉馅。 經(jīng)常有香客問我辕狰,道長,這世上最難降的妖魔是什么控漠? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮悬钳,結(jié)果婚禮上盐捷,老公的妹妹穿的比我還像新娘。我一直安慰自己默勾,他們只是感情好碉渡,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著母剥,像睡著了一般滞诺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上环疼,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天习霹,我揣著相機與錄音,去河邊找鬼炫隶。 笑死淋叶,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的伪阶。 我是一名探鬼主播煞檩,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼处嫌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斟湃?” 一聲冷哼從身側(cè)響起熏迹,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凝赛,沒想到半個月后注暗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡哄酝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年友存,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陶衅。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡屡立,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搀军,到底是詐尸還是另有隱情膨俐,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布罩句,位于F島的核電站焚刺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏门烂。R本人自食惡果不足惜乳愉,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屯远。 院中可真熱鬧蔓姚,春花似錦、人聲如沸慨丐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽房揭。三九已至备闲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捅暴,已是汗流浹背恬砂。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蓬痒,地道東北人觉既。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞪讼。 傳聞我的和親對象是個殘疾皇子钧椰,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

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