“應用機器學習像是把你當一個偉大的工程師,而非偉大的機器學習專家。”
這是我在一份谷歌內部檔案中讀到的如何應用機器學習的第一句話。的確如此。以我作為伺服器工程師/資料分析師的有限經驗,資料(以及如何儲存/處理)一直都是所有問題的核心,在整體中舉足輕重。去問問任何一位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特徵中的某些資訊的合成。
比如以下圖表:
另一個更加具體也更加相關的好例子是經緯度。一個常見的緯度值與世界上很多地方都有關聯,經度也是這樣。但是如果你將經緯度相結合,並劃分到不同的“區塊”,它們就可以代表地理上的“地區”,各個地區內部有著相似的特性。
有時候,多個資料屬性可以通過簡單的數學計算被“組合”成一個新的特徵。在上一個例子中,假設你把特徵重定義為和:
作為補充,我接下來將簡單介紹幾個數學上比較複雜的特徵工程技巧,並附帶了連結以便大家更好地理解。
5.特徵選取
運用某些演算法來自動選擇原始資料特徵中的一個子集,以建立最終模型。你不需要建立/修改現有的資料特徵,而是對它們進行刪減,來降低干擾,減少資料冗餘。
6.特徵縮放(資料標準化)
有時候,你可能會注意到有些屬性的數量級比別的屬性更大,比如一個人的收入,相對於他的年齡而言。在類似的情況下,有些模型(比如嶺迴歸)就要求你把所有的屬性都縮放到一個可比較的、同等的範圍內。這可以防止某些屬性被給予過多的權重。
7.特徵提取
特徵提取包含了許多演算法,它們能夠從原始資料屬性中自動生成新的特徵集合。資料降維是這類方法裡的一種。
來自:大資料文摘