1. 程式人生 > >【乾貨合集】一文讀懂特徵工程

【乾貨合集】一文讀懂特徵工程

640?wx_fmt=gif

點選上方藍字關注

640?wx_fmt=jpeg

作者:July

說明:本文是七月線上機器學習第九期第五次課 特徵工程的課程筆記,課程主講老師:寒小陽 加號 張雨石 Johnson,本筆記得到寒小陽等相關老師的校對。

時間:二零一八年七月三十一日。

前言

我所在公司七月線上每個月都是各種機器學習、深度學習、人工智慧課程,通過三年半的打磨,內容質量已經足夠精良,我也在這耳聞目染中不斷被各種從傳統IT成功轉行轉型轉崗AI,然後拿到年薪30~50萬的訊息刷屏。

被刷的心癢癢不說,加上自己喜歡研究,擅長把艱深晦澀的東西通俗易懂的闡述出來,所以準備未來一個月三十篇ML課程筆記,平均每天一篇,類似之前的KMP SVM CNN 目標檢測,發部落格、公號、題庫、社群。且聯合公司的講師團隊確保專業,爭取每個專題/模型 都成為每一個ML初學者必看的第一篇 。

另外,每一篇筆記基本都將是帶著beats耳機邊用七月線上APP聽課程邊做筆記(恩,APP支援倍速1.5倍或2倍播放),為的是我確保通俗,講授課程的講師確保專業。還是那句老話,有何問題,歡迎在評論裡留言指正,thanks。

1

什麼是特徵工程

有這麼一句話在業界廣泛流傳:資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已。

但特徵工程很少在機器學習相關的書中闡述,包括很多網路課程,七月線上還是第一個在機器學習課程裡講特徵工程的課。但直到現在,很多機器學習課程還是不講特徵工程,在我眼裡,講機器學習但不講特徵工程是不專業的(相信此文一出,會改進他們)。

那特徵工程到底是什麼,它真的有那麼重要麼?

顧名思義,特徵工程其本質是一項工程活動,目的是最大限度地從原始資料中提取特徵以供演算法和模型使用。

而在公司做機器學習,大部分時間不是研究各種演算法、設計高大上模型,也不是各種研究深度學習的應用,或設計N層神經網路,實際上,70~80%的時間都是在跟資料、特徵打交道。

因為大部分複雜模型的演算法精進都是資料科學家在做。而大多數同學在幹嘛呢?在跑資料,或各種map-reduce,hive SQL,資料倉庫搬磚,然後做資料清洗、分析業務和case,以及找特徵。包括很多大公司不會首選用複雜的模型,有時就是一招LR打天下。

在某kaggle資料科學二分類比賽,通過有效特徵的抽取,auc能提升2%(auc是評價模型好壞的常見指標之一),而通過看起來高大上的模型調參優化,auc提升只能約5‰。包括在一個電商商品推薦比賽,推薦大賽第一名的組,基於特徵工程,比工程師的推薦準確 度提升16%。

通過總結和歸納,一般認為特徵工程包括以下方面(下圖來源於ml9學員海闊天空對特徵工程一課的總結):

640?wx_fmt=png

2

 資料與特徵處理

2.1 資料採集

假定我現在要預測使用者對商品的下單情況(買還是不買),那我可以採集比如店家的信譽度、商品本身的評價、使用者操作行為等資訊,或者把這些資訊交叉起來做一些組合特徵。

2.2 資料格式化

首先確定儲存格式。比如,時間你 年月日 or 時間戳 or 第幾天 or,或者單個動作記錄 or 一天行為聚合。當然,大多數情況下,需要關聯非常非常多的hive表和叢集檔案(例如hdfs)。

2.3 資料清洗

考慮到採集到的資料可能包含一些噪聲,所以資料清洗的目標就是去掉髒資料,比如用garbage in, garbage out。

當然,演算法大多數時候就是一個加工機器,至於最後的產品/成品如何,很大程度上取決於原材料的好壞。而選取或改進原材料的過程會花掉一大部分時間,而效率高低取決於你對於業務的理解程度。

2.4 資料取樣

很多情況下,正負樣本是不均衡的。比如電商平臺上,使用者買和沒買過的兩類商品之間,數量會相差很大,因為購買需要花錢,所以大部分使用者只逛不買。而大多數模型對正負樣本比是敏感的(比如LR)。

那怎麼處理正負樣本不平衡的問題呢?為了讓樣本是比較均衡,一般用隨機取樣,和分層取樣的辦法。

比如如果正樣本多於負樣本,且量都挺大,則可以採用下采樣。如果正樣本大於負樣本,但量不大,則可以採集更多的資料,或者oversampling(比如影象識別中的映象和旋轉),以及修改損失函式/loss function的辦法來處理正負樣本不平衡的問題。

2.5 特徵處理

在特徵處理的過程中,我們會面對各種型別的資料,比如數值型(比如年齡的大小)、類別型(比如某個品牌的口紅可能有十八種色號,比如衣服大小L XL XLL,比如星期幾)、時間類、文字型、統計型等等。

2.5.1 數值型資料

針對數值型資料的特徵處理有以下幾種方法:幅度調整、Log等資料域變化、統計值max, min, mean, std、離散化、Hash分桶、每個類別下對應的變數統計值histogram(分佈狀況),以及試試 數值型 => 類別型。

接下來,重點闡述下其中幾種方法。比如,把資料幅度調整到[0,1]範圍內,如下程式碼所示

640?wx_fmt=png

這個操作有一個專有名詞,即叫歸一化。

為什麼要歸一化呢?很多同學並未搞清楚,維基百科給出的解釋:1)歸一化後加快了梯度下降求最優解的速度;2)歸一化有可能提高精度。


下面再簡單擴充套件解釋下這兩點。
1 歸一化為什麼能提高梯度下降法求解最優解的速度?
如下兩圖所示(來源:斯坦福機器學習視訊)

640?wx_fmt=png

藍色的圈圈圖代表的是兩個特徵的等高線。其中左圖兩個特徵X1和X2的區間相差非常大,X1區間是[0,2000],X2區間是[1,5],像這種有的資料那麼大,有的資料那麼小,兩類之間的幅度相差這麼大,其所形成的等高線非常尖。當使用梯度下降法尋求最優解時,很有可能走“之字型”路線(垂直等高線走),從而導致需要迭代很多次才能收斂;
而右圖對兩個原始特徵進行了歸一化,其對應的等高線顯得很圓,在梯度下降進行求解時能較快的收斂。

因此如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂。

2 歸一化有可能提高精度
一些分類器需要計算樣本之間的距離(如歐氏距離),例如KNN。如果一個特徵值域範圍非常大,那麼距離計算就主要取決於這個特徵,從而與實際情況相悖(比如這時實際情況是值域範圍小的特徵更重要)。

3 歸一化的型別
1)線性歸一化

640?wx_fmt=png

這種歸一化方法比較適用在數值比較集中的情況。這種方法有個缺陷,如果max和min不穩定,很容易使得歸一化結果不穩定,使得後續使用效果也不穩定。實際使用中可以用經驗常量值來替代max和min。


2)標準差標準化
經過處理的資料符合標準正態分佈,即均值為0,標準差為1,其轉化函式為:

640?wx_fmt=png

其中μ為所有樣本資料的均值,σ為所有樣本資料的標準差。


3)非線性歸一化
經常用在資料分化比較大的場景,有些數值很大,有些很小。通過一些數學函式,將原始值進行對映。該方法包括 log、指數,正切等。需要根據資料分佈的情況,決定非線性函式的曲線,比如log(V, 2)還是log(V, 10)等。

再比如,對資料做標準化

640?wx_fmt=png640?wx_fmt=png

再比如,對資料做統計值

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png

或者,對資料做離散化。比如說一個人的年齡是一個連續值,但連續值放進一些模型裡比如Logistic Regression則不太好使,這個時候便要對資料進行離散化,通俗理解就是把連續的值分成不同的段,每一段列成特徵,從而分段處理。

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png

以及對資料做柱狀分佈(比例)

640?wx_fmt=png

2.5.2 型別型資料

當我們面對一些類別型的資料,比如某品牌的口紅具有多種色號,如果是人,不同的色號人類一眼即可看出。但計算機不像人的眼睛對顏色有感知,計算機只能讀懂數字,嚴格來說,只能讀懂01二進位制。所以計算機為了辨別顏色,需要給各種顏色編碼。

針對口紅色號這種類別型資料的特徵,可以使用One-hot編碼/啞變數。

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png

而針對一些文字形式的類別型資料時,也可以使用Hash技巧做一些詞頻統計

640?wx_fmt=png

最後,還有一種類別型的資料,比如男性女性在很多行為上會有差別,對此,可以使用Histogram對映方法統計男女生的愛好。

640?wx_fmt=png

男:[1/3,2/3,0]; 女:[0,1/3,2/3]; 21:[1,0,0];22:[0,0,1]…

2.5.3 時間型資料

對於時間型資料既可以看做連續值,也可以看做離散值。比如

•  這些時間型資料可以看做是連續值:持續時間(使用者單頁的瀏覽時長)、間隔時間(使用者上次購買/點選離現在的時間)。

•  這些時間型資料可以看做是離散值:一天中哪個時間段(hour_0-23)、一週中星期幾(week_monday...)、一年中哪個星期、一年中哪個季度、工作日/週末等方面的資料。

2.5.4 文字型資料

如果是文字型別的資料,比如詞袋,則可以在文字資料預處理後,去掉停用詞,剩下的片語成的list, 在詞庫中的對映稀疏向量。

640?wx_fmt=png

下圖所示的操作是詞袋的Python處理方法

640?wx_fmt=png

這個時候會遇到一個問題,比如李雷喜歡韓梅梅,跟韓梅梅喜歡李雷這兩句話的含義是不一樣的,但用上面那種詞袋模型無法區分男追女還是女追男這種順序。

為處理這個問題,可以把詞袋中的詞擴充到n-gram

640?wx_fmt=png

2.5.5 文字型資料

對於文字型的資料,會經常用到Tf–idf 特徵。它是用來解決這樣一個問題:即怎麼來判定某個詞在整個文件中的重要性呢?只看它出現的頻次麼?好像不是,因為想的、得、地這種詞通常在各篇文件中會經常出現,但不代表這類詞在文件中很重要。

為了更準確的評估一字詞對於一個檔案集或一個語 料庫中的其中一份檔案的重要程度,我們會用到TF-IDF這種統計方法。字詞的重要性隨著它在檔案中 出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成 反比下降。