本文由 沈慶陽 所有,轉(zhuǎn)載請與作者取得聯(lián)系!
前言
我們先來回顧一下什么是特征。
特征(Feature)即機(jī)器學(xué)習(xí)中的輸入變量。通過機(jī)器學(xué)習(xí),我們可以得到定義了特征與標(biāo)簽之間關(guān)系的模型。
在傳統(tǒng)的編程理念中,程序員往往關(guān)注點(diǎn)停留在代碼身上。而在機(jī)器學(xué)習(xí)的項(xiàng)目中,工程師的關(guān)注點(diǎn)轉(zhuǎn)移到表示(Representation)上面。即工程師通過添加、改進(jìn)特征來調(diào)整模型。
在機(jī)器學(xué)習(xí)中,數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,模型和算法只是逼近這個上限。特征工程即從原始數(shù)據(jù)中提取最大限度的特征以供模型使用。
從原始數(shù)據(jù)中映射到特征
假設(shè)我們得到的原始數(shù)據(jù)如下。
0:{
person_info:{
age:21
gender:'male'
career:'teacher'
...
}
}
上面我們獲取了一個人的信息,其屬于輸入數(shù)據(jù)源的原始數(shù)據(jù),而機(jī)器學(xué)習(xí)需要的輸入是樣本表示為實(shí)數(shù)矢量。為了將原始數(shù)據(jù)轉(zhuǎn)換為特征矢量,我們需要運(yùn)用到特征工程。通常在機(jī)器學(xué)習(xí)的項(xiàng)目中,特征工程要花費(fèi)大量的時間。
通過特征工程,我們將原始數(shù)據(jù)映射到機(jī)器學(xué)習(xí)特征。(下述為機(jī)器學(xué)習(xí)特征矢量的舉例,非對應(yīng)上述原始數(shù)據(jù))
[
21.0,
0.0,
5.31,
6.44,
0,
0,
...,
]
在映射的過程中,整數(shù)和浮點(diǎn)數(shù)作為原始數(shù)據(jù)不需要進(jìn)行特殊的編碼,因此可以對整數(shù)直接復(fù)制實(shí)值特征。
字符串映射的兩種方法
而對于字符串的映射較為特殊,機(jī)器學(xué)習(xí)的模型無法通過字符串進(jìn)行學(xué)習(xí),因此我們需要對字符串進(jìn)行一些特征工程的轉(zhuǎn)化,將字符串轉(zhuǎn)換為數(shù)字的形式。
與枚舉型(Enumeration)有些類似,我們將職業(yè)(Career)想象成一個枚舉型變量。枚舉型變量實(shí)質(zhì)上是用整形代替字符串,這點(diǎn)與特征工程處理字符串有類似,但不同。
Career{
Teacher,Student,Engineer,Agent,...
}
枚舉型變量的Teacher對應(yīng)的是0,Student對應(yīng)的是1,Engineer對應(yīng)的是2。
字符串映射:獨(dú)熱編碼(One-Hot Encoding)
而在特征工程中,我們的Career不再是一個占據(jù)一個存儲空間的整形變量,而是一個二元矢量。假設(shè)Career一共有20個職業(yè),那么Career在特征矢量的表示下就是一個長度為20的一維數(shù)組。Teacher對應(yīng)的是一維數(shù)組的第一個元素,Student對應(yīng)的是一維數(shù)組的第二個元素,以此類推。當(dāng)Career為Student時,第二個元素的值為1,其余值為0。當(dāng)Career為Engineer時,第三個值為1,其余值為0。
這種映射方法叫做獨(dú)熱編碼映射字符串。其基本步驟如下:
1、定義詞匯表:將需要表示的字符串定義在一個詞匯表中。對于Career特征,該詞匯表包含所有樣本中的Career職業(yè)。
2、獨(dú)熱編碼:在創(chuàng)建完詞匯表之后使用該詞匯表創(chuàng)建一個獨(dú)熱編碼,將指定字符串表示為二元矢量,該矢量的長度為詞匯表中詞匯的個數(shù)。該矢量只有一個元素為1,其余元素均為0。
獨(dú)熱編碼適合特征的可能值較多的情況。
字符串映射:映射分類值(枚舉)
在分類特征個數(shù)較少的情況下,我們使用映射分類值得方法。該方法與枚舉型一致。
此外,機(jī)器學(xué)習(xí)模型也可以將單個字符串表示為多個布爾值得特征,如,
x1:是Teacher么?(True或False)
x2:是Student么?(True或False)
x3:是Engineer么?(True或False)
選用良好的特征
在將原始數(shù)據(jù)轉(zhuǎn)為特征矢量之后,我們的關(guān)注點(diǎn)需要放在對特征矢量的選擇上。
總的來說,良好的特征具有如下特點(diǎn):
1、不存在或很少存在使用率低的離散特征值
2、特征具有清晰明確的含義
3、考慮到上游不穩(wěn)定性
下面將會對這三個特點(diǎn)逐個解析。
避免使用率低的離散特征值
什么樣的特征才叫使用率低的特征呢?
一個良好的特征值在數(shù)據(jù)集中出現(xiàn)大約5次及以上。只有這樣,機(jī)器學(xué)習(xí)的模型才能學(xué)習(xí)這個特征值與標(biāo)簽之間的關(guān)系。大量的離散值相同的樣本可以讓模型了解不同設(shè)置中的特征,從而判斷何時能對標(biāo)簽做出良好的預(yù)測。
以上文中講到的Career為例,Career特征包含大量的樣本,其中一個為Teacher。那么Career就是一個可取的特征。
反之,一個特征出現(xiàn)的次數(shù)很少,比如在person_info中加入person_id:51029302020XXXXX,那么person_id便不適合作為特征,因?yàn)檫@個值是唯一的,模型無法從這個特征中學(xué)到任何規(guī)律。
具有清晰明確的含義
良好的特征應(yīng)該具有清晰且明確的含義。像是person_info中的age:21可以明確地知道這個人是21歲。
但如果將person_info中的age表示成這樣age:3900192844(以分鐘或是小時來計(jì)算年齡)怕是沒人知道這個人幾歲了,那么這個特征值便是糟糕的特征值。
在有些情況下,一些沒有經(jīng)過過濾的,來源不恰當(dāng)?shù)奶卣髦狄矔?dǎo)致特征混亂。像age:233。那么這個年齡明顯超過了人類的最大年齡。
假設(shè)有一個特征值是一門考試的成績,該特征是從0到100的浮點(diǎn)值。如果該特征值是落在0到100之間,那么這個特征值是良好的。如果一個樣本沒有參加考試,那么其特征值應(yīng)該是多少呢?
一般編程的時候我們采用-1來表示這個值是奇異的。但是,在機(jī)器學(xué)習(xí)的項(xiàng)目中一定要杜絕這種表示方法!我們應(yīng)該新建立一個特征,來表示這個特征值是否存在。
考慮到上游不穩(wěn)定性
對于良好的特征,特征的定義不應(yīng)該隨著時間而變化。
清理數(shù)據(jù)
在準(zhǔn)備數(shù)據(jù)集的時候,一些輸入可能是會對模型學(xué)習(xí)結(jié)果產(chǎn)生不好影響的壞數(shù)據(jù)。比如在前面我們訓(xùn)練TensorFlow的Object Detection項(xiàng)目的時候,一個樣本中對Pen的標(biāo)注出現(xiàn)偏差,或是將茶杯標(biāo)注成了Pen。在機(jī)器學(xué)習(xí)的時候,我們會花費(fèi)大量的時間來挑除這樣的壞樣本來拯救數(shù)據(jù)集,因?yàn)榧词勾嬖谏倭康膲臄?shù)據(jù)也會對一個大規(guī)模的數(shù)據(jù)集產(chǎn)生很大的影響,甚至是破壞整個數(shù)據(jù)集。
下一節(jié),我們將會通過具體練習(xí)的實(shí)例來進(jìn)行清理數(shù)據(jù)。
覺得寫的不錯的朋友可以點(diǎn)一個 喜歡? ~
謝謝你的支持!