一文讀懂特徵工程

v_JULY_v發表於2018-07-31

                                                   一文讀懂特徵工程

 

作者:July

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

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

 

0 前言

我所在公司七月線上每個月都是各種機器學習、深度學習、人工智慧課程,通過三年半的打磨,內容質量已經足夠精良,我也在這耳聞目染中不斷被各種從傳統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學員海闊天空對特徵工程一課的總結):

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]範圍內,如下程式碼所示

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

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

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

藍色的圈圈圖代表的是兩個特徵的等高線。其中左圖兩個特徵X1和X2的區間相差非常大,X1區間是[0,2000],X2區間是[1,5],像這種有的資料那麼大,有的資料那麼小,兩類之間的幅度相差這麼大,其所形成的等高線非常尖。

當使用梯度下降法尋求最優解時,很有可能走“之字型”路線(垂直等高線走),從而導致需要迭代很多次才能收斂;而右圖對兩個原始特徵進行了歸一化,其對應的等高線顯得很圓,在梯度下降進行求解時能較快的收斂。

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

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

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

這種歸一化方法比較適用在數值比較集中的情況。這種方法有個缺陷,如果max和min不穩定,很容易使得歸一化結果不穩定,使得後續使用效果也不穩定。實際使用中可以用經驗常量值來替代max和min。
2)標準差標準化
經過處理的資料符合標準正態分佈,即均值為0,標準差為1,其轉化函式為:

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

在實際應用中,通過梯度下降法求解的模型一般都是需要歸一化的,比如線性迴歸、logistic迴歸、KNN、SVM、神經網路等模型。

但樹形模型不需要歸一化,因為它們不關心變數的值,而是關心變數的分佈和變數之間的條件概率,如決策樹、隨機森林(Random Forest)。

接下來,我們再看下對資料做標準化的操作

再比如,對資料做統計值



 

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



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



2.5.2 型別型資料

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

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

One-hot編碼一般使用稀疏向量來節省空間,比如只有某一維取值為1,其他位置取值均為0。且需要配合特徵選擇來降低維度,畢竟高維度會帶來一些問題

  1. 比如K近鄰演算法中,高維空間下兩點之間的距離不好測量;
  2. 再比如logistic迴歸中,引數的數量會隨著維度的增高而增加,容易引起過擬合問題;
  3. 又比如某些分類場景下,只有部分維度有用。



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



 

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



男:[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, 在詞庫中的對映稀疏向量。



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



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

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



2.5.5 文字型資料

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

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

TF: Term Frequency

TF(t) = (詞t在當前文中出現次數) / (t在全部文件中出現次數)

IDF:IDF(t) = ln(總文件數/ 含t的文件數)

實際使用中,我們便經常用TF-IDF來計算權重,即TF-IDF = TF(t) * IDF(t)

對於詞袋,Google於2013年提出了Word2Vec這個模型,成為目前最常用的詞嵌入模型之一。

對於這個模型,現在有各種開源工具,比如:google word2vec、gensim、facebook fasttext



2.5.6 統計型資料

對於統計特徵而言,歷屆的Kaggle/天池比賽,天貓/京東排序和推薦業務線裡 模型用到的特徵,比如

  • 加減平均:商品價格高於平均價格多少,使用者在某個品 類下消費超過平均使用者多少,使用者連續登入天數超過平 均多少...
  • 分位線:商品屬於售出商品價格的多少分位線處
  • 次序型:排在第幾位
  • 比例類:電商中,好/中/差評比例
  • 你已超過全國百分之…的同學

2.5.7 組合特徵

組合特徵型的資料我們們通過一個示例來說明。

之前阿里雲天池(目前是七月線上的長期合作方)上有一個移動推薦演算法大賽,比賽的目標是為了給移動使用者在合適的時間地點下精準推薦合適的商品/內容,以提升移動使用者的瀏覽或購買體驗。

比賽地址:https://tianchi.aliyun.com/competition/information.htm?spm=5176.11409106.5678.2.775611a3TEgD32&raceId=1

競賽題目 
在真實的業務場景下,我們往往需要對所有商品的一個子集構建個性化推薦模型。在完成這件任務的過程中,我們不僅需要利用使用者在這個商品子集上的行為資料,往往還需要利用更豐富的使用者行為資料。定義如下的符號:
U——使用者集合
I——商品全集
P——商品子集,P ⊆ I
D——使用者對商品全集的行為資料集合
那麼我們的目標是利用D來構造U中使用者對P中商品的推薦模型。

資料說明
競賽資料包含兩個部分。第一部分是使用者在商品全集上的移動端行為資料(D),表名為tianchi_mobile_recommend_train_user,包含如下欄位:





對於這個問題,我們要做大量的資料處理,比如:

  1. 前一天的購物車商品很有可能第二天就被購買 => 規則
  2. 剔除掉在30天裡從來不買東西的人 => 資料清洗
  3. 加車N件,只買了一件的,剩餘的不會買=> 規則
  4. 購物車購買轉化率 =>使用者維度統計特徵
  5. 商品熱度 =>商品維度統計特徵
  6. 對不同item點選/收藏/購物車/購買的總計 =>商品維度統計特徵
  7. 變熱門的品牌/商品 =>商品維度統計特徵(差值型)
  8. 對不同item點選/收藏/購物車/購買平均每個user的計數=>使用者維 度統計特徵
  9. 最近第1/2/3/7天的行為數與平均行為數的比值 =>使用者維度統計 特徵(比例型)
  10. 商品在類別中的排序 =>商品維度統計特徵(次序型)
  11. 商品互動的總人數 =>商品維度統計特徵(求和型)
  12. 商品的購買轉化率及轉化率與類別平均轉化率的比值=>商品維度統 計特徵(比例型)
  13. 商品行為/同類同行為均值=>商品維度統計特徵(比例型)
  14. 最近1/2/3天的行為(按4類統計)=>時間型+使用者維度統計特徵
  15. 最近的互動離現在的時間=>時間型
  16. 總互動的天數=>時間型
  17. 使用者A對品牌B的總購買數/收藏數/購物車數=>使用者維度統計特徵
  18. 使用者A對品牌B的點選數的平方 =>使用者維度統計特徵
  19. 使用者A對品牌B的購買數的平方=>使用者維度統計特徵
  20. 使用者A對品牌B的點選購買比=>使用者維度統計特徵(比例型)
  21. 使用者互動本商品前/後,互動的商品數=>時間型+使用者維度統計特徵
  22. 使用者前一天最晚的互動行為時間=>時間型
  23. 使用者購買商品的時間(平均,最早,最晚)=>時間型

而有些特徵也可以做一下組合,比如以下一些拼接型的簡單組合特徵

  • 簡單組合特徵:拼接型
  • user_id&&category: 10001&&女裙 10002&&男士牛仔
  • user_id&&style: 10001&&蕾絲 10002&&全棉

包括實際電商點選率預估中:正負權重,喜歡&&不喜歡某種型別

以及一些模型特徵組合

  • 用GBDT產出特徵組合路徑
  • 組合特徵和原始特徵一起放進LR訓練
  • 最早Facebook使用的方式,多家網際網路公司在用

包括另一種基於樹模型的組合特徵:GBDT+LR,每一條分支都可以是一個特徵,從而學習出來一系列組合特徵。



 

3 特徵選擇

通過上一節的各種特徵處理方法,可以產生很多特徵,但會有些問題,比如

  • 冗餘:部分特徵的相關度太高了,消耗計算效能
  • 噪聲:部分特徵是對預測結果有負影響

針對這兩個問題,我們們便得做下特徵選擇,包括降維

  • 特徵選擇是指踢掉原本特徵裡和結果預測關係不大的
  • SVD或者PCA確實也能解決一定的高維度問題

接下來,我們們瞭解下各種特徵選擇的方式。

3.1 過濾型

評估單個特徵和結果值之間的相關程度,排序留下Top相關的特徵部分。而計算相關程度可以用Pearson相關係數、互資訊、距離相關度來計算。

這種方法的缺點是:沒有考慮到特徵之間的關聯作用,可能把有用的關聯特徵誤踢掉。



過濾型特徵選擇Python包



3.2 包裹型

包裹型是指把特徵選擇看做一個特徵子集搜尋問題,篩選各種特徵子集,用模型評估效果。典型的包裹型演算法為 “遞迴特徵刪除演算法”(recursive feature elimination algorithm)。

比如用邏輯迴歸,怎麼做這個事情呢?

  1. 用全量特徵跑一個模型
  2. 根據線性模型的係數(體現相關性),刪掉5-10%的弱特徵,觀察準確率/auc的變化
  3. 逐步進行,直至準確率/auc出現大的下滑停止

包裹型特徵選擇Python包







3.3 嵌入型

嵌入型特徵選擇是指根據模型來分析特徵的重要性(有別於上面的方式, 是從生產的模型權重等)。最常見的方式為用正則化方式來做特徵選擇。

且慢,什麼是正則化?正則化一般分為兩種:L1正則化和L2正則化。

一般迴歸分析中迴歸w表示特徵的係數,從上式可以看到正則化項是對係數做了處理(限制)。L1正則化和L2正則化的說明如下:
L1正則化是指權值向量w中各個元素的絕對值之和,通常表示為||w||1
L2正則化是指權值向量w中各個元素的平方和然後再求平方根(可以看到Ridge迴歸的L2正則化項有平方符號),通常表示為||w||2

一般都會在正則化項之前新增一個係數,Python中用α表示,一些文章也用λ表示。這個係數需要使用者指定。

那新增L1和L2正則化有什麼用?
L1正則化可以產生稀疏權值矩陣,即產生一個稀疏模型,可以用於特徵選擇
L2正則化可以防止模型過擬合(overfitting)。當然,一定程度上,L1也可以防止過擬合

稀疏模型與特徵選擇
上面提到L1正則化有助於生成一個稀疏權值矩陣,進而可以用於特徵選擇。為什麼要生成一個稀疏矩陣?

稀疏矩陣指的是很多元素為0,只有少數元素是非零值的矩陣,即得到的線性迴歸模型的大部分系數都是0. 通常機器學習中特徵數量很多,例如文字處理時,如果將一個片語(term)作為一個特徵,那麼特徵數量會達到上萬個(bigram)。

在預測或分類時,那麼多特徵顯然難以選擇,但是如果代入這些特徵得到的模型是一個稀疏模型,表示只有少數特徵對這個模型有貢獻,絕大部分特徵是沒有貢獻的,或者貢獻微小(因為它們前面的係數是0或者是很小的值,即使去掉對模型也沒有什麼影響),此時我們就可以只關注係數是非零值的特徵。這就是稀疏模型與特徵選擇的關係。

舉個例子,最早在電商用LR做CTR預估,在3-5億維的係數 特徵上用L1正則化的LR模型。剩餘2-3千萬的feature,意 味著其他的feature重要度不夠。

嵌入型特徵選擇Python包



至於課程上的兩個實踐案例,比如kaggle自行車租賃預測比賽暫不更。有興趣的可以先自行檢視「七月線上機器學習第九期第五次課特徵工程」的視訊內容,本文基本就是這次課的課程筆記。

 

4 後記

本文還在不斷修改、完善。July、二零一八年八月二日下午6點,七月線上辦公室。

相關文章