機(jī)器學(xué)習(xí)之旅---特征工程和數(shù)據(jù)預(yù)處理

2019/11/19 Caesar

前言

??有這么一句話在業(yè)界廣泛流傳:數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限病线,而模型和算法只是逼近這個(gè)上限而已吓著。那特征工程到底是什么呢?顧名思義送挑,其本質(zhì)是一項(xiàng)工程活動(dòng)绑莺,目的是最大限度地從原始數(shù)據(jù)中提取特征以供算法和模型使用。通過(guò)特征提取惕耕,我們能得到未經(jīng)處理的特征纺裁,需要通過(guò)數(shù)據(jù)預(yù)處理手段來(lái)解決。

1. 特征工程

??特征處理是特征工程的核心部分司澎,sklearn提供了較為完整的特征處理方法欺缘,包括數(shù)據(jù)預(yù)處理,特征選擇挤安,降維等谚殊。首次接觸到sklearn,通常會(huì)被其豐富且方便的算法模型庫(kù)吸引蛤铜,但是這里介紹的特征處理庫(kù)也十分強(qiáng)大嫩絮!通過(guò)總結(jié)和歸納,人們認(rèn)為特征工程包括以下方面:


image.png

??本文中使用sklearn中的IRIS(鳶尾花)數(shù)據(jù)集來(lái)對(duì)特征處理功能進(jìn)行說(shuō)明昂羡。IRIS數(shù)據(jù)集由Fisher在1936年整理絮记,包含4個(gè)特征(Sepal.Length(花萼長(zhǎng)度)、Sepal.Width(花萼寬度)虐先、Petal.Length(花瓣長(zhǎng)度)怨愤、Petal.Width(花瓣寬度)),特征值都為正浮點(diǎn)數(shù)蛹批,單位為厘米撰洗。目標(biāo)值為鳶尾花的分類(Iris Setosa(山鳶尾)篮愉、Iris Versicolour(雜色鳶尾),Iris Virginica(維吉尼亞鳶尾))差导。導(dǎo)入IRIS數(shù)據(jù)集的代碼如下:

from sklearn.datasets import load_iris
#導(dǎo)入IRIS數(shù)據(jù)集
iris = load_iris()
#特征矩陣
iris.data
#目標(biāo)向量
iris.target

2. 數(shù)據(jù)預(yù)處理

2.1 無(wú)量綱化

??無(wú)量綱化使不同規(guī)格的數(shù)據(jù)轉(zhuǎn)換到同一規(guī)格试躏。常見的無(wú)量綱化方法有標(biāo)準(zhǔn)化和區(qū)間縮放法。標(biāo)準(zhǔn)化的前提是特征值服從正態(tài)分布设褐,標(biāo)準(zhǔn)化后颠蕴,其轉(zhuǎn)換成標(biāo)準(zhǔn)正態(tài)分布。區(qū)間縮放法利用了邊界值信息助析,將特征的取值區(qū)間縮放到某個(gè)特點(diǎn)的范圍犀被,例如[0, 1]等。

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

標(biāo)準(zhǔn)化需要計(jì)算特征的均值和標(biāo)準(zhǔn)差外冀,公式表達(dá)為:


image.png

使用preproccessing庫(kù)的StandardScaler類對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化的代碼如下:

from sklearn.preprocessing import MinMaxScaler #區(qū)間縮放寡键,返回值為縮放到[0, 1]區(qū)間的數(shù)據(jù)MinMaxScaler().fit_transform(iris.data)

2.1.3 標(biāo)準(zhǔn)化與正則化的區(qū)別

??簡(jiǎn)單來(lái)說(shuō),標(biāo)準(zhǔn)化是依照特征矩陣的列處理數(shù)據(jù)雪隧,其通過(guò)求z-score的方法西轩,將樣本的特征值轉(zhuǎn)換到同一量綱下。正則化是依照特征矩陣的行處理數(shù)據(jù)脑沿,其目的在于樣本向量在點(diǎn)乘運(yùn)算或其他核函數(shù)計(jì)算相似性時(shí)藕畔,擁有統(tǒng)一的標(biāo)準(zhǔn),也就是說(shuō)都轉(zhuǎn)化為“單位向量”捅伤。規(guī)則為l2的歸一化公式如下:

image.png

正則化的過(guò)程是將每個(gè)樣本縮放到單位范數(shù)(每個(gè)樣本的范數(shù)為1)劫流,如果后面要使用如二次型(點(diǎn)積)或者其它核方法計(jì)算兩個(gè)樣本之間的相似性這個(gè)方法會(huì)很有用。
Normalization主要思想是對(duì)每個(gè)樣本計(jì)算其p-范數(shù)丛忆,然后對(duì)該樣本中每個(gè)元素除以該范數(shù)祠汇,這樣處理的結(jié)果是使得每個(gè)處理后樣本的p-范數(shù)(l1-norm,l2-norm)等于1。
??p-范數(shù)的計(jì)算公式:||X||p=(|x1|p+|x2|p+...+|xn|p)1/p
該方法主要應(yīng)用于文本分類和聚類中熄诡。例如可很,對(duì)于兩個(gè)TF-IDF向量的l2-norm進(jìn)行點(diǎn)積,就可以得到這兩個(gè)向量的余弦相似性凰浮。
使用preproccessing庫(kù)的Normalizer類對(duì)數(shù)據(jù)進(jìn)行歸一化的代碼如下:

>>> X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
 
>>> 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...]])

2.2 對(duì)定量特征二值化

??定量特征二值化的核心在于設(shè)定一個(gè)閾值我抠,大于閾值的賦值為1,小于等于閾值的賦值為0袜茧,公式表達(dá)如下:


image.png

??使用preproccessing庫(kù)的Binarizer類對(duì)數(shù)據(jù)進(jìn)行二值化的代碼如下:

from sklearn.preprocessing import Binarizer
 
#二值化菜拓,閾值設(shè)置為3,返回值為二值化后的數(shù)據(jù)
Binarizer(threshold=3).fit_transform(iris.data)

2.3 對(duì)定性特征啞編碼

??由于IRIS數(shù)據(jù)集的特征皆為定量特征笛厦,故使用其目標(biāo)值進(jìn)行啞編碼(實(shí)際上是不需要的)纳鼎。使用preproccessing庫(kù)的OneHotEncoder類對(duì)數(shù)據(jù)進(jìn)行啞編碼的代碼如下:

from sklearn.preprocessing import OneHotEncoder
 
#啞編碼,對(duì)IRIS數(shù)據(jù)集的目標(biāo)值,返回值為啞編碼后的數(shù)據(jù)
OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))

2.4 缺失值計(jì)算

??由于IRIS數(shù)據(jù)集沒有缺失值贱鄙,故對(duì)數(shù)據(jù)集新增一個(gè)樣本劝贸,4個(gè)特征均賦值為NaN,表示數(shù)據(jù)缺失逗宁。使用preproccessing庫(kù)的Imputer類對(duì)數(shù)據(jù)進(jìn)行缺失值計(jì)算的代碼如下:

在sklearn的preprocessing包中包含了對(duì)數(shù)據(jù)集中缺失值的處理映九,主要是應(yīng)用Imputer類進(jìn)行處理。

首先需要說(shuō)明的是瞎颗,numpy的數(shù)組中可以使用np.nan/np.NaN(Not A Number)來(lái)代替缺失值件甥,對(duì)于數(shù)組中是否存在nan可以使用np.isnan()來(lái)判定。

使用type(np.nan)或者type(np.NaN)可以發(fā)現(xiàn)改值其實(shí)屬于float類型言缤,代碼如下:

>>> type(np.NaN)
<type 'float'>
>>> type(np.nan)
<type 'float'>
>>> np.NaN
nan
>>> np.nan
nan

因此嚼蚀,如果要進(jìn)行處理的數(shù)據(jù)集中包含缺失值一般步驟如下:
1、使用字符串'nan'來(lái)代替數(shù)據(jù)集中的缺失值管挟;
2、將該數(shù)據(jù)集轉(zhuǎn)換為浮點(diǎn)型便可以得到包含np.nan的數(shù)據(jù)集弄捕;
3僻孝、使用sklearn.preprocessing.Imputer類來(lái)處理使用np.nan對(duì)缺失值進(jìn)行編碼過(guò)的數(shù)據(jù)集。
代碼如下:

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

上述代碼使用數(shù)組X去“訓(xùn)練”一個(gè)Imputer類守谓,然后用該類的對(duì)象去處理數(shù)組Y中的缺失值穿铆,缺失值的處理方式是使用X中的均值(axis=0表示按列進(jìn)行)代替Y中的缺失值。當(dāng)然也可以使用imp對(duì)象來(lái)對(duì)X數(shù)組本身進(jìn)行處理斋荞。
通常荞雏,我們的數(shù)據(jù)都保存在文件中,也不一定都是Numpy數(shù)組生成的平酿,因此缺失值可能不一定是使用nan來(lái)編碼的凤优,對(duì)于這種情況可以參考以下代碼:

>>> line='1,?'
>>> line=line.replace(',?',',nan')
>>> line
'1,nan'
>>> Z=line.split(',')
>>> Z
['1', 'nan']
>>> Z=np.array(Z,dtype=float)
>>> Z
array([  1.,  nan])
>>> imp.transform(Z)
array([[ 1.        ,  3.66666667]])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜈彼,隨后出現(xiàn)的幾起案子筑辨,更是在濱河造成了極大的恐慌,老刑警劉巖幸逆,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棍辕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡还绘,警方通過(guò)查閱死者的電腦和手機(jī)楚昭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拍顷,“玉大人抚太,你說(shuō)我怎么就攤上這事」交常” “怎么了凭舶?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵晌块,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我帅霜,道長(zhǎng)匆背,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任身冀,我火速辦了婚禮钝尸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搂根。我一直安慰自己珍促,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布剩愧。 她就那樣靜靜地躺著猪叙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仁卷。 梳的紋絲不亂的頭發(fā)上穴翩,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音锦积,去河邊找鬼芒帕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丰介,可吹牛的內(nèi)容都是我干的背蟆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼哮幢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼带膀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起家浇,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤本砰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后钢悲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體点额,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年莺琳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了还棱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惭等,死狀恐怖尿褪,靈堂內(nèi)的尸體忽然破棺而出楼雹,到底是詐尸還是另有隱情凌蔬,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布寡具,位于F島的核電站,受9級(jí)特大地震影響稚补,放射性物質(zhì)發(fā)生泄漏童叠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一课幕、第九天 我趴在偏房一處隱蔽的房頂上張望厦坛。 院中可真熱鬧,春花似錦乍惊、人聲如沸杜秸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撬碟。三九已至,卻和暖如春莉撇,著一層夾襖步出監(jiān)牢的瞬間小作,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工稼钩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人达罗。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓坝撑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親粮揉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巡李,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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