如何生成派生特徵
來自專欄黎曼-希爾伯特
本文主要是我對一本經典圖書某個章節的翻譯,可能有些辭彙翻譯不準,另外也會摻雜有些本人的閱讀體會。希望與大家友好交流
Derived features(派生特徵,擴展特徵)
數據清洗是數據挖掘中的一個重要步驟,從各種日誌中,清洗出一些初級特徵,將非結構化數據轉成結構化數據的,便於後續訓練模型和做預測。但有些時候,把一些初級特徵直接用到模型中效果未必好,根據這些初級特徵生成派生特徵能更好的提高模型效果。
生成派生特徵是數據挖掘領域最有創造性的步驟之一。派生特徵使建模過程融入更多人工經驗,並充分利用用戶,商品,市場的特性。構造合適的特徵集合是優秀演算法工程師必備技能。
派生特徵對模型效果指標,比如均方誤差,準確率,召回率等提升明顯。更為重要的是,好的派生特徵能提升模型的可解釋性。但是,沒有「放之四海而皆準」的特徵,一個特徵可能在一個場景效果良好,換個場景效果就大打折扣。演算法工程師不能有「懶人」心態,認為某個特徵包治百病。下面一個案例說明派生特徵的優點和局限:
變化的場景會影響一個特徵的效果
在一個場景中效果良好的特徵,換個場景未必好使
本文會首先會介紹如何利用單個特徵生成派生特徵,之後會介紹多個特徵的聯合如何生成派生特徵。最後會總結生成派生特徵的一些原則,還會介紹一些和時間和位置相關的派生特徵。
手機型號與轉化率
手機型號是服務商做業務建模的時候常用的一個特徵。用戶轉化率分析是一個常見的業務場景。但在模型中直接使用手機型號作為特徵有很多問題:手機型號更新換代很快,舊型號的淘汰周期越來越短,因此直接基於手機型號的演算法模型的效果衰減很快,因為幾乎每個月都有一些舊的型號被淘汰,被歸入「其他」類(可以理解成category value)。今天很酷的手機,很快可能變得無人問津。手機並非只是一個通訊設備,它越來越具有時尚屬性,而時尚是易變(fickle)的。
在某次使用手機型號作為特徵的場景中,建模者以為手機型號可能只有5到10種,但所有用戶使用的手機型號卻超過200多種,讓一個category 的feature有200多個category value,顯得太多。假如使用邏輯回歸模型中,就需要為每個value建一個示性因子,這會使模型變複雜。
只有最新或者比較popular的型號才有大量的活躍用戶,所以一個可行的方案是把那些流行的型號的機型才歸入「其他」類。一個更好的解決方案是直接利用目標函數對值做分類。比如把那些高轉化率的機型歸入「高」類,把那些低轉化率的機型歸入「低」類,其他的機型歸入「中」類。決策樹類的演算法中,我們常常這麼干。要這麼干就需要計算各個機型對應的轉化率,那為什麼不直接利用這些轉化率呢?這裡「手機型號對應的轉化率」就是一個派生特徵。
這個派生特徵用到了下文將會講到的兩個生成派生特徵的技巧:
1. 用數值特徵替換category value
2. 用目標變數的歷史值作為特徵
同樣是這個特徵,但在分析兩家運營商的業務的時候,效果差別很大。第一家運營商會給新用戶更大的折扣力度,給老用戶沒有啥折扣(很像中國聯通呀);而另一家運營商給新老用戶一樣的折扣。「手機型號對應的轉化率」 這個特徵在第一家運營商的場景中效果良好;在第二家運營商的業務場景中收效甚微。
大家想想手機型號還可以派生出哪些數值特徵?重量,價格等等,估計大家能想出不少。
單特徵派生
正則化
正則化是常用的數據預處理方法,其目的是把不同維度的數據映射到一個共同的scale,以方便後續的距離等度量計算。下面是正則化的兩個步驟:
1. 中心化
2. 中心化後的值除以標準差。
中心化
每個特徵值都減去均值。如果原始特徵值代表錢數,則中心化後的值代表原始值是否高於均值或者低於均值。比如用戶的訂單價格被中心化之後,就代表訂單價格時候高於平均客單價。
縮放
除以標準差把特徵值映射到-1至1的區間,
將數值轉成百分位(標準化)
父母們談論自己孩子身高,體重等身體參數時,直接說絕對值,比如「身高60cm」,不如說「身高處於同齡孩子身高的95分位」更能體現自己孩子的生理優勢,因為孩子 比95%的同齡兒童都高。而且正則化基於正態假設,而轉成分位數的方式與數值的分布無關。
將數值轉成比率
資料庫中往往有大量的數值:訂單數,呼叫數目,在線時長等。而這些數值往往和用戶的註冊時長和生命周期等有關:一個已經註冊6個月的用戶的訂單數和一個剛註冊一個月用戶的當擔數的絕對值比較意義不大。往往是將訂單數除以用戶生命周期(在線時長)等得到的比率更有意義。
類別特徵(category feature)的數值化
最常見的處理辦法是one hot representation,但one hot representation可能引起「維度爆炸」,大大增加模型的複雜度,當然,這可以用降維的方法來處理,不過如何降維不是本文的主題,後續會單獨介紹。將category value數值化,要抓取類別特徵的重要的數值特徵,但什麼樣的數值特徵是重要的呢?答案是和我們的目標關聯性強的數值。在手機的轉化率模型中,由手機型號派生出的重要的數值特徵:手機的價格,重量,上市時間,受歡迎程度(銷量),APP數量或者電池壽命等;而地理信息,或者國家可以派生出下列重要的數值特徵:人口,人口密度,經緯度,海拔,收入中位數,年降雨量等。
分箱
在某些場景,卻需要根據數值特徵生成類別特徵,比如樸素bayes模型只支持類別特徵(離散特徵)。分桶,又叫離散化,就是把數值映射到一組區間,而用區間號代替數值。分箱的方法,大概分位下面三種
- 等距(等寬)分箱
- 等頻(等權重)分箱
- 有監督分箱
================2018年7月8號===============
先更新到這裡,會繼續細化更新
【參考文獻】
《Data Mining Techniques》 Gordon S. Linoff and MIchael J.A. Berry
推薦閱讀:
※首篇數據分析報告出爐
※給妹子講python-S02E09Pandas引言與Series簡介
※Kaggle 數據清洗挑戰 Day 2 - 數據縮放及標準化處理
※如何用Mysql清洗數據
※數據處理流程個人總結(一)