如何提取特徵?

在此整理一下自己模型特徵提取的方法,不太成熟,請大家批評指教。

一.四類特徵

我將特徵分為四類:基本特徵,複雜特徵,統計特徵和自然特徵。

這裡的特徵設計主要針對非結構化數據,比如一個人的購物歷史,運營商通話記錄,位置的歷史記錄。當缺少領域知識無從下手的時候,可以從這四個方面來設計特徵。

首先是基本特徵,而後統計和複雜特徵層層遞進。其中針對圖像語音等抽提特徵有專用的知識方法,就不班門弄斧了。

掌握了這套特徵設計的思路,在複雜數據上幾乎可以設計出無窮無盡的特徵。而怎麼在最短的時間內,把數據中最有價值的特徵提煉出來,就要考驗數據挖掘工程師的功底。

二. 提取特徵思路

基本思路是2/8法則,要花20%的時間,做50%的特徵取得80%的效果。流程如下:

  1. 做經驗上最重要的

  2. 做容易做的

  3. 做可以批量產生的

  4. 觀察bad_case/good_feature,總結經驗回到1

我主要是分析人的行為數據,很大程度上要依賴生活經驗和領域知識。

將123步完成之後,通過數據去回歸特徵的效果,查看重要的特徵效果是否符合預期,不符合的話為什麼?怎麼修改?哪些意料之外的特徵很有效?對哪些人有效?為什麼?

在不斷的追問和查看數據的過程中,慢慢的積累領域知識和常識,形成自己的經驗,形成對目標客群的深入認識。

三.雜談

-經驗與偏見:

數據挖掘強調領域知識和常識經驗。但是不要用經驗生成一些很刻板的特徵。比如要找犯罪分子,經驗告訴你最近一個月刀具的人很可能是目標,製作特徵的時候,不妨把最近1/3/6/12個月購買過道具/化學藥品/火車票。。。。這一類相關的特徵都做出來,往往有新發現。要根據時間要求和對數據的熟悉程度,把握經驗思路和刻畫數據兩者的平衡。

-自動生成大量的特徵:

當你的數據量足夠大,可以嘗試著設計規則,自動生成大量的特徵。比如文本的one hot編碼,高頻電話通話次數。這種方式生成的特徵往往會非常稀疏,對數據量的要求較高。數據不夠經驗來湊,對於大量稀疏的特徵,又可以根據經驗對特徵分組合併來減少特徵維度,提升模型效果。

-空值,0值,特殊值(不存在的比例):

對建模不熟悉的工程師經常會把異常的特徵值都設置為0,或者把空值和0值混淆。一般來講特徵等於0是有特殊含義的,比如否或者數量上的0。對特徵值拿不準的時候,最好不要拿0來填充。可以用一個特殊值比如-999來標示一些奇怪的特徵取值(比如0/0),建模時候再做處理。實現特徵提取的時候盡量不要留空值,這樣一旦發現有特徵是空值,就說明代碼中有bug或者數據有異常,可以很方便的發現和處理邊邊角角的case。

-複雜數據,根據相似性降維:

還有一種生成特徵的思路很有意思。樣本並沒有明確的類別信息,但可以通過聚類將樣本劃歸成幾個類別,形成特徵。這個思路在神經科學中就是spike sort,先將很多信號根據波形劃分成幾類(即信號來自於幾個不同的細胞),而後再對每一個細胞產生的信號進行計算處理。

人或者軌跡同理,可以先通過降維聚類將相似的軌跡劃分類別,再將類別作為特徵進行處理。這樣就將很複雜的數據整理成了有意義的特徵。

暫時就這些,歡迎指教~


推薦閱讀:

#給自己發個博士招生廣告#
用戶畫像—打用戶行為標籤
推薦系統乾貨總結
機器學習/數據挖掘面試總結
用戶畫像——搜狗用戶挖掘:文本分類

TAG:數據挖掘 | 機器學習 | 特徵提取 |