閱讀186 返回首頁    go 阿裏雲 go 技術社區[雲棲]


數據科學中的非數學特征工程技術


0?wx_fmt=jpeg

 ◆ 

導 讀


應用機器學習像是把你當一個偉大的工程師,而非偉大的機器學習專家。”


這是我在一份穀歌內部文件中讀到的如何應用機器學習的第一句話。的確如此。以我作為服務器工程師/數據分析師的有限經驗,數據(以及如何存儲/處理)一直都是所有問題的核心,在整體中舉足輕重。去問問任何一位Kaggle的獲勝者,他們都會說,最大的收獲總是來源於聰明地表示數據,而不是使用某些複雜的算法。即使CRISP數據挖掘處理也使用了不是一個,而是兩個階段,專門用來理解和準備數據。


 ◆ 

特征工程


那麼,什麼是特征工程?


簡而言之,就是用最好的方法來表示數據的藝術/科學。


為什麼說是藝術/科學?因為好的特征工程是專業知識,直覺和基礎的數學能力的優雅組合。呃,最有效的數據表示法基本不包含任何數學計算(下文我會解釋)。“最好的”是什麼意思?大體上,提供給算法的數據的方式,應該以最有效的方式表示潛在信息的相關結構/屬性。當你進行特征工程時,你是在把你的數據屬性轉化為數據特征。

 

屬性基本上是數據的所有維度,但是所有這些以原始形態存在的屬性是否以最佳的表示方式表示了你想學習的潛在趨勢?也許不是。所以特征工程是對數據進行預處理,在此基礎上進行建模/建立學習算法,從而可以花最小的力氣處理噪聲數據。在此“噪音”的含義是,任何與學習/預測你的最終目標無關的信息。實際上,由於你已經自己完成了一部分“思考”的工作,使用好的特征甚至可以讓你使用簡單得多的模型。


但是就像任何機器學習中的技術一樣,一定要通過驗證確保你引入的新特征確實能夠改進預測,而不是增加不必要的複雜性。如果機器學習是發型:模型—華麗的,裝飾的,不易打理的,特征工程—接地氣的,即興的,直接的。


如同之前提到的,好的特征工程包含直覺,專業知識(個人經驗)和基本的數學技巧。以下是幾個非常簡單的技巧,你可以應用在你的下一個數據科學解決方案中。

 

1.表示時間戳

時間戳屬性經常是用EPOCH時間來定義,或者分離到多個維度裏,比如(年,月,日,時,分,秒)。但是在很多場合下,很多信息是不必要的。比如,在一個監督學習係統裏,預測一個城市關於地點+時間的交通流量,如果以秒來發現其趨勢,很有可能得到錯誤的結論。以年為單位對這個模型來說沒有太多價值;小時,天和月可能是你需要用到的維度。所以,當表示時間時,試著去確認一下你的模型是否需要你所提供的所有數字。

別忘了時區。如果你的數據源自不同的地域,務必記得在需要的時候用時區做標準化。


2.分解分類型屬性

有的屬性是種類而非數字。一個簡單的例子是“顏色”屬性,比如{紅,綠,藍}之一。最常見的表示方法是將種類轉化為二元屬性,從{0,1}中二取一。於是你得到了一係列增加的屬性,數目與種類的個數相等,而且在每個數據點的這一係列屬性中,隻有一個的值是1(其餘的都是0)。這是一種獨熱編碼形式。


如果你第一次接觸到這個概念,你可能會認為分解屬性是平添了不必要的麻煩(本質上我們擴大了數據集的維度)。相反,你可能更願意將種類屬性轉變為一個標量值,比如,顏色特征可能用{1,2,3}代表{紅,綠,藍}。這會帶來兩個問題。第一,對於一個數學模型,這個可能表示“紅色”比“藍色”更接近“綠色”(因為|1-3|>|1-2|)。除非你的種類的確包含自然順序(natural ordering)(比如一條火車線路上的車站),否則的話這種表示法可能會誤導你的模型。第二,它可能導致統計學參數(比如平均值)失去意義。甚者,造成誤導。再次考慮顏色的例子,如果你的數據集包含同樣多的紅色和藍色值,而沒有綠色值,取平均值仍會得到“2”——代表著綠色!

 

將種類屬性轉化為標量值最安全的情況是當你隻有兩個種類時。這樣你就有了{0,1}對應{種類1,種類2}。這種情況下,“次序”不是必要的,並且你可以將屬性值解讀為屬於種類2抑或種類1的概率值。


3.數字分組 

有時候,將數字屬性表示成分類屬性也是一種有效的分析方法。這種方法通過將數字分段劃組,來減少噪聲對機器學習算法的幹擾。比如說,如果我們要預測一個人是否擁有某一件特定的衣服。顯然年齡是一個影響因素。實際上年齡組可能更加恰當一些。所以我們可以給年齡分段,比如1-10歲,11-18歲,19-25歲,26-40歲等。對於這樣的分類,我們便沒有必要像第2點所說的那樣再去做類別內的分解,直接用標量值劃分組別就可以了,因為相近的年齡組確實是有相似之處的。

 

屬性域能被清楚歸類的數據,其同一區間的數字能夠代表相同的特征,分組這種方法就比較適用於這樣的數據。如果你不想讓你的模型區分太相近的數值,這種方法可以減少一些應用中的過擬合問題。比如說,如果你的關注點是一整個城市,你就可以把該城市所有的緯度歸到一起。分組這個方法通過將數值”化整”到離它最近的典型數值,來減少微小錯誤帶來的影響。不過,如果分組數量與你的可能值數量相當,或者你要求很高的精度,那麼數據分組就沒有什麼意義了。

 

4.特征交叉

特征交叉也許是這些方法中最為重要和有用的一種了。這種獨特的方法可以將兩個或兩個以上的類別屬性組合成一種。這個方法非常有用,尤其如果相對於單個屬性本身,與其他屬性的結合能更好地表示某些特性。從數學上講,是把所有這些屬性的可能值做了叉乘。


若某特征A的值域為{A1,A2},特征B的值域為{B1, B2}。A和B之間的交叉特征(我們稱之為AB)則是以下這些值中的一個:{(A1, B1),(A1, B2), (A2, B1), (A2, B2)}。你可以自由命名這些“組合”,任何一個組合都代表了A或B特征中的某些信息的合成。

 

比如以下圖表:

0?wx_fmt=png

所有藍點屬於一類,而紅點屬於另一類。我們暫且不用知道這個模型的真實意義。首先,你需要把X的值域劃分為{x < 0, x >= 0},把Y的值域劃分為{y < 0, y >= 0},並把它們分別表示為{Xn, Xp} 和 {Yn, Yp}。顯然,第一和第三象限屬於紅色,而第二和第四象限屬於藍色。如果我們把X和Y做特征交叉,並把結果歸類為”象限”這個統一的特征,我們就有了{I, II, III, IV}四個值,分別等同於之前提到的{(Xp, Yp), (Xn, Yp), (Xn, Yn), (Xp, Yn)}。

  

另一個更加具體也更加相關的好例子是經緯度。一個常見的緯度值與世界上很多地方都有關聯,經度也是這樣。但是如果你將經緯度相結合,並劃分到不同的“區塊”,它們就可以代表地理上的“地區”,各個地區內部有著相似的特性。

 

有時候,多個數據屬性可以通過簡單的數學計算被“組合”成一個新的特征。在上一個例子中,假設你把特征重定義為0?wx_fmt=png0?wx_fmt=png

 

0?wx_fmt=png

0?wx_fmt=png

那麼現在你可以定義一個全新的特征0?wx_fmt=png

0?wx_fmt=png 

就這麼簡單,如果0?wx_fmt=png,則是紅色,反之則是藍色。

作為補充,我接下來將簡單介紹幾個數學上比較複雜的特征工程技巧,並附帶了鏈接以便大家更好地理解。

 

5.特征選取

運用某些算法來自動選擇原始數據特征中的一個子集,以建立最終模型。你不需要建立/修改現有的數據特征,而是對它們進行刪減,來降低幹擾,減少數據冗餘。

 

6.特征縮放(數據標準化)

有時候,你可能會注意到有些屬性的數量級比別的屬性更大,比如一個人的收入,相對於他的年齡而言。在類似的情況下,有些模型(比如嶺回歸)就要求你把所有的屬性都縮放到一個可比較的、同等的範圍內。這可以防止某些屬性被給予過多的權重。


7.特征提取

特征提取包含了許多算法,它們能夠從原始數據屬性中自動生成新的特征集合。數據降維是這類方法裏的一種。

  原文發布時間為:2016-09-12

本文來自雲棲社區合作夥伴“大數據文摘”,了解相關信息可以關注“BigDataDigest”微信公眾號

最後更新:2017-06-05 16:32:22

  上一篇:go  關於大腦,這五個“常識”其實是謠言
  下一篇:go  聽說小行星要和地球“剛正麵”?我們還安全麼?