天天看點

BAT機器學習特征工程工作經驗總結(三)如何做特征處理和建構(附python代碼)

特征處理和建構一般對以下幾種資料類型做處理:

  • 數值型
  • 類别型
  • 時間型
  • 文本型
  • 統計型
  • 組合特征

2.1 數值型

1 幅度調整/歸一化:python中會有一些函數比如preprocessing.MinMaxScaler()将幅度調整到 [0,1] 區間。

2.統計值:包括max, min, mean, std等。python中用pandas庫序列化資料後,可以得到資料的統計值。

3.離散化:把連續值轉成非線性資料。例如電商會有各種連續的價格表,從0.03到100元,假如以一進制錢的間距分割成99個區間,用99維的向量代表每一個價格所處的區間,1.2元和1.6元的向量都是 [0,1,0,…,0]。pd.cut() 可以直接把資料分成若幹段。

4.柱狀分布:離散化後統計每個區間的個數做柱狀圖。

2.2 類别型

類别型一般是文本資訊,比如顔色是紅色、黃色還是藍色,我們存儲資料的時候就需要先處理資料。處理方法有:

   1. one-hot編碼,編碼後得到啞變量。統計這個特征上有多少類,就設定幾維的向量,pd.get_dummies()可以進行one-hot編碼。

  2. 序數編碼

  3. Histogram映射:把每一列的特征拿出來,根據target内容做統計,把target中的每個内容對應的百分比填到對應的向量的位置。優點是把兩個特征聯系起來。

  上表中,我們來統計“性别與愛好的關系”,性别有“男”、“女”,愛好有三種,表示成向量 [散步、足球、看電視劇],分别計算男性和女性中每個愛好的比例得到:男[1/3, 2/3, 0],女[0, 1/3, 2/3]。即反映了兩個特征的關系。

2.3 時間型

時間型特征的用處特别大,既可以看做連續值(持續時間、間隔時間),也可以看做離散值(星期幾、幾月份)。資料挖掘中經常會用時間作為重要特征,比如電商可以分析節假日和購物的關系,一天中使用者喜好的購物時間等。

2.4 地理位置

對地理位置資訊(類别型變量)最簡單的處理方式是獨熱編碼(one-hot encoding), 但是這樣會得到很高維的稀疏特征,影響模型的學習。是以我們可以在獨熱編碼的基礎上,做了特征選擇。我們可以将地理位置和目标變量做相關性分析,比如違約中可以挑違約率較高的地方,然後做獨熱編碼 ,如果地理位置變量是城市,那獨熱編碼後會産生很高維的特征,這時就要用模型(xgboost)進行特征選擇,選出相關性較高的特征。

另外,地理位置還可以做城市等級合并,經緯度特征引入等。

城市等級合并按照城市等級,将類别變量合并,例如一 線城市北京、上海、廣州、深圳合并,指派為 1,同樣地,二線城市合并為 2,三線城市合 并為 3。

我們另外收集了各個城市的經緯度, 将城市名用經緯度替換,這樣就可以将類别型的變量轉化為數值型的變量,比如北京市,用 經緯度(39.92,116.46)替換,得到北緯和東經兩個數值型特征。加入經緯度後,線下的 cross validation 一般都有千分位的提升。

2.5 文本型

1. 詞袋:文本資料預處理後,去掉停用詞,剩下的詞組成的list,在詞庫中的映射稀疏向量。Python中用CountVectorizer處理詞袋.

2. 把詞袋中的詞擴充到n-gram:n-gram代表n個詞的組合。比如“我喜歡你”、“你喜歡我”這兩句話如果用詞袋表示的話,分詞後包含相同的三個詞,組成一樣的向量:“我 喜歡 你”。顯然兩句話不是同一個意思,用n-gram可以解決這個問題。如果用2-gram,那麼“我喜歡你”的向量中會加上“我喜歡”和“喜歡你”,“你喜歡我”的向量中會加上“你喜歡”和“喜歡我”。這樣就區分開來了。

  

3. 使用TF-IDF特征:TF-IDF是一種統計方法,用以評估一字詞對于一個檔案集或一個語料庫中的其中一份檔案的重要程度。字詞的重要性随着它在檔案中出現的次數成正比增加,但同時會随着它在語料庫中出現的頻率成反比下降。TF(t) = (詞t在目前文中出現次數) / (t在全部文檔中出現次數),IDF(t) = ln(總文檔數/ 含t的文檔數),TF-IDF權重 = TF(t) * IDF(t)。自然語言進行中經常會用到。

2.6 統計型

曆屆的Kaggle/天池比賽, 天貓/京東排序和推薦業務線裡模型用到的特征。統計的内容包括加減平均、分位線、次序型、比例類等。

比如“天池大資料之移動推薦算法大賽”中,給比賽選手兩張表,介紹使用者和商品資訊,要求預測把哪些商品推薦給使用者,使用者最有可能購買。

(1)加減平均:商品價格高于平均價格多少,使用者在某個品類下消費超過平均使用者多少,使用者連續登陸天數超過平均多少

(2)分位線:商品屬于售出商品價格的多少分位線處

(3)次序:排位第幾

(4)比例:超過百分之多少

2.7 組合特征

1.拼接型

簡單的組合特征。例如挖掘使用者對某種類型的喜愛,對使用者和類型做拼接。正負權重,代表喜歡或不喜歡某種類型。

  - user_id&&category: 10001&&女裙 10002&&男士牛仔

  - user_id&&style: 10001&&蕾絲 10002&&全棉

2.模型特征組合

 - 用GBDT産出特征組合路徑

 - 組合特征和原始特征一起放進LR訓練

3.兩兩特征相除/相乘/相加/相減

乘法特征(取對數):log(x*y),選擇出重要度高的特征,加入到原始特征體系中,會有千分位提高。這種特征組合有助于表示非線性關系。

我們可以建立很多不同種類的特征組合。例如:

[A X B]:将兩個特征的值相乘形成的特征組合。

[A x B x C x D x E]:将五個特征的值相乘形成的特征組合。

[A x A]:對單個特征的值求平方形成的多項式特征組合。(二階,三階等)

争對第三個的可以生成n次方,A的二次方,三次方等,還可以對多個特征進行不同的n次方,比如A的2次方乘與B的三次方等,增加非線性。

4.互動特征:組合獨熱矢量

在實踐中,機器學習模型很少會組合連續特征。不過,機器學習模型卻經常組合獨熱特征矢量,将獨熱特征矢量的特征組合視為邏輯連接配接.例如,假設我們具有以下兩個特征:國家/地區和語言。對每個特征進行獨熱編碼會生成具有二進制特征的矢量,這些二進制特征可解讀為 country=USA, country=France 或language=English,language=Spanish。然後,如果您對這些獨熱編碼進行特征組合,則會得到可解讀為邏輯連接配接的二進制特征。

假設我們的模型需要根據以下兩個特征來預測狗主人對狗狗的滿意程度:

行為類型(吠叫、叫、偎依等)

時段

如果我們根據這兩個特征建構特征組合。我們最終獲得的預測能力将遠遠超過任一特征單獨的預測能力。例如,如果狗狗在下午 5 點主人下班回來時(快樂地)叫喊,可能表示對主人滿意度的正面預測結果。如果狗狗在淩晨 3 點主人熟睡時(也許痛苦地)哀叫,可能表示對主人滿意度的強烈負面預測結果。

5.分桶特征(分箱)

例如,我們可以将 population 分為以下 3 個分桶:

bucket_0 (< 5000):對應于人口分布較少的街區

bucket_1 (5000 - 25000):對應于人口分布适中的街區

bucket_2 (> 25000):對應于人口分布較多的街區

根據前面的分桶定義,以下 population 矢量:

[[10001], [42004], [2500], [18000]]

将變成以下經過分桶的特征矢量:

[[1], [2], [0], [1]]

這些特征值現在是分桶索引。請注意,這些索引被視為離散特征。通常情況下,這些特征将被進一步轉換為獨熱編碼表示。

6.最大最小特征

最小最大值一直都是特征提取的重點,目前值與最大最小值之間的差更是值得嘗試的特征。

7.還可以用FM模型進行特征組合和降維

總結:組合兩個(或更多個)特征是使用線性模型來學習非線性關系的一種聰明做法。在我們的問題中,如果我們隻使用 latitude 特征進行學習,那麼該模型可能會發現特定緯度(或特定緯度範圍内,因為我們已經将其分桶)的城市街區更可能比其他街區住房成本高昂。longitude 特征的情況與此類似。但是,如果我們将 longitude 與 latitude 組合,産生的組合特征則代表一個明确的城市街區。如果模型發現某些城市街區(位于特定緯度和經度範圍内)更可能比其他街區住房成本高昂,那麼這将是比單獨考慮兩個特征更強烈的信号。