使用者特徵工程

原文地址:點選開啟連結

這裡寫圖片描述

這張圖將使用者特徵工程裡的大面基本都囊括了。因為ppt本身做得比較簡單,現在我們試圖針對圖裡的每一項,結合具體的業務場景,做個比較詳細的分析。

1.原始資料提取

原作者畫圖的時候將第一項命名為特徵提取,我覺得作者想表達的本意應該是從哪獲得相關資料,所以叫原始資料提取可能更為合適一些。

1.業務logs

這部分資料肯定是實際應用場景的大頭。只要是個IT公司,每家肯定都有自己的日誌或者業務資料。像電商網站的訂單資料一般都是存在mysql/oracle/sqlserver等資料庫中,使用者瀏覽item/search等行為的資料一般都有相應的日誌進行記錄。拿到這些資料之後就可以進行後續的分析挖掘動作了。

2.web公開資料抓取

這部分資料就是通過爬蟲抓取的資料了,比如最常見的搜尋引擎抓取網站內容用於索引的那些搜尋引擎爬蟲。 
看到過一些有趣的資料:2013年來自Incapsula一份網際網路報告顯示,目前有61.5%的網際網路流量不是由人類產生的,如果你讀到了這篇文章,你就是那個少數派(人類)。換句話說,實際上網際網路流量大部分都是爬蟲產生的。。。 
正因為現在爬蟲已經氾濫成災,所以很多網站限制爬蟲的爬取。所以大家使用爬蟲的時候,也儘可能文明使用,做一隻文明的爬蟲。。。 
http://blog.csdn.net/bitcarmanlee/article/details/51824080 這是之前寫過的一個簡單的爬取糗事百科段子的爬蟲,供大家參考。

3.第三方合作

這部分沒有太多可說的。當自己資料不夠的情況下,可以通過某些渠道與其他公司或者專門的資料公司合作,獲得相關資料。例如廣告系統中,很多公司都會使用秒針或者Admaster之類的第三方監測機構的資料。

2.資料清洗

拿到原始資料以後,對原始資料進行清洗時非常重要的步驟。因為獲得的原始資料裡面有非常多的髒資料甚至錯誤資料,如果不對這些資料進行處理,會極大地影響最後模型的效果。所以資料清洗時非常重要的一個步驟。

1.異常值分析過濾

顧名思義,異常值分析過濾是分析檢驗資料中是否有錯誤資料或者不合理的資料。如果有,則將這些資料剔除。常見的異常值分析方法有;

1)簡單統計量分析方法 
可以對變數做一個描述性的統計與分析,然後檢視資料是否合理。例如比較常用的統計量包括最大值與最小值,如果變數超過了最大值最小值的範圍,那這個值就為異常值。例如年齡屬性,如果某人填寫為200或者-1,這顯然都是屬於異常值的範疇。

這部分內容最後給一張高斯分佈的曲線圖: 
這裡寫圖片描述

2.資料型別檢查

這一個步驟能避免後續出現的很多問題。例如年齡這個屬性,應該全是數值型別。但是很多時候這個欄位出現了字串型別的值,很明顯這就是異常值,需要進行相應的處理。比如根據身份證號來進行計算,或者給個特殊的值-99來標識等等。

3.清洗換行符製表符空格等特殊字元

如果原始資料某些欄位中存在換行符空格製表符等特殊字元,絕大部分情況下會影響後面進一步的分析。所以在資料清洗階段,根據業務需求處理掉這些特殊字元是很有必要的。例如在大部分場景中,清洗掉字串中的換行符,都是很必要的。

3.資料預處理

在原圖中,作者將這一步命名為值處理,表達的意思應該是一致的。這一步的處理過程非常重要,涉及到的點也比較多,為大家選擇一些常見的一一道來。

1.資料平滑

因為現在機器學習的主流是統計機器學習,既然是統計,自然就離不開概率的計算。例如在對文字進行分類時,語料庫畢竟是有限的。假設w1w1,w2w2,w3w3沒在語料庫中出現過,那根據最大似然估計MLE,這些詞出現的概率為0。但是實際上這些詞出現的概率肯定是不為0的。像最大似然估計裡涉及到很多概率的連乘計算,如果一個概率為0,就會導致整體計算結果為0。這時候,就需要我們對資料進行平滑了。 
平滑的演算法有很多。最簡單的平滑方式屬於加1平滑了,就是給每種情況出現的次數都加上1,這樣就避免了概率為0的情況。這種方式簡單粗暴,實際使用的效果一般也不會特別理想。當然還有Good-turning平滑,線性插值平滑(Linear Interpolation Smoothing)等其他演算法,根據具體的業務場景進行選擇。

2.歸一化

歸一化也是常見的資料預處理操作。歸一化的具體細節請參考http://blog.csdn.net/bitcarmanlee/article/details/51353016一文。

3.離散化

離散化是把連續型的資料分為若干段,是資料分析與資料探勘中經常採用的一種方法。對資料進行離散化,最大的好處就是有些演算法只接受離散型變數。例如決策樹,樸素貝葉斯等演算法,不能以連續型變數為輸入。如果輸入時連續型資料,必須要先經過離散化處理。 
常見的離散化方式有等距與等頻離散化,都比較容易理解。等距就是將連續型隨機變數的取值範圍均勻劃為n等份,每份的間距相等。例如年齡本來是個連續值,用等距離散化以後,1-10,10-20,20-30,30-40等各劃為一組。而等頻則是把觀察點均分為n等份,每份裡面包含的樣本相同。例如有1萬個樣本,將樣本按取樣時間順序排列,然後按一千個樣本為一組,將全部的樣本分為十等份。 
當然離散化,包括前面的歸一化,都是會有負面效果的,這個負面效果就是會帶來資訊的損失。比如本來我們本來有詳盡的年齡資料,在決策樹演算法或者貝葉斯演算法中為了演算法的需要,不得已將年齡變為兒童青少年壯年老年這樣的離散變數,資訊肯定就不如具體的年齡大小那麼準確與詳盡。所以在使用歸一化,離散化等資料處理分析手段時,要結合具體的實際情況,謹慎使用。 
http://blog.csdn.net/bitcarmanlee/article/details/51472816一文中專門講解了one-hot編碼,就是資料離散化的一種具體形式。

4.dummy coding

這部分實際中我沒怎麼使用過,後續找相關資料再進行補充。

5.缺失值填充

資料中某些欄位缺失是資料分析挖掘中非常頭疼的一個問題。現實世界中的資料往往非常雜亂非常髒,原始資料中某個欄位或者某些欄位缺失是非常常見的現象。但是儘管資料有缺失,生活還要繼續,工作還得繼續。面對這種情況,該怎樣繼續呢?

方法一:丟棄 
最簡單的方式,如果發現資料有缺失,直接刪除這個欄位或者將整個樣本丟棄。如果大部分樣本的某個欄位都缺失,那麼很明顯這個欄位就是不可用狀態。如果某條樣本的大部分欄位都缺失,那麼很明顯這個樣本就是不可用狀態。這種處理方式簡單粗暴,效率高,但是很明顯適用範圍有限,只適合資料缺失較少的情況。如果某個特徵特別重要,資料缺失情況還特別嚴重,那麼美別的辦法,老老實實重新採集資料吧。

方法二:統計值填充 
如果某個屬性缺失,特別是數值型別的屬性,可以根據所有樣本關於這維屬性的統計值填充,常見的有平均值、中值、分位數、眾數、隨機值等。這種方式難度也不大,效果一般。最大的副作用就是人為帶來了不少噪聲。

方法三:預測填充 
用其他變數做預測模型來預測缺失值,效果一般比統計值填充要好一些。但是此方法有一個根本缺陷,如果其他變數和缺失變數無關,則預測的結果無意義。如果預測結果相當準確,則又說明這個變數是沒必要加入建模的。一般情況下,介於兩者之間。

方法四:將變數對映到高維空間 
比如性別,有男、女、缺失三種情況,則對映成3個變數:是否男、是否女、是否缺失。連續型變數也可以這樣處理。比如Google、百度的CTR預估模型,預處理時會把所有變數都這樣處理,達到幾億維。這樣做的好處是完整保留了原始資料的全部資訊、不用考慮缺失值、不用考慮線性不可分之類的問題。缺點是計算量大大提升。而且只有在樣本量非常大的時候效果才好,否則會因為過於稀疏,效果很差。(本小結內容來自知乎)

6.分詞 tf/idf

嚴格意義上說,分詞屬於NLP的範疇。既然原圖中提到了分詞tf/idf,我們就簡單介紹一下。 
TF-IDF全稱為term frequency–inverse document frequency。TF就是term frequency的縮寫,意為詞頻。IDF則是inverse document frequency的縮寫,意為逆文件頻率。tf-idf通常用來提取關鍵詞。比如,對一個文章提取關鍵詞作為搜尋詞,就可以採用TF-IDF演算法。 
要找出一篇文章中的關鍵詞,通常的思路就是,就是找到出現次數最多的詞。如果某個詞很重要,它應該在這篇文章中多次出現。於是,我們進行詞頻TF統計。但是,在中文文獻裡,的地得了等類似的詞彙出現的頻率一定是最高的,而且這類詞沒什麼實際的含義,我們就叫他停用詞,一般遇到停用詞就將他扔掉。 
扔掉停用詞以後,我們也不能簡單地認為出現頻率最高的詞就是我們所需要的關鍵字。如果一個詞很少見,但是它在某個文章中反覆出現多次,那麼可以認為這個詞反應了這個文章的特性,可以把它作為關鍵詞。在資訊檢索中,這個權重非常重要,它決定了關鍵詞的重要度,這個權重叫做逆文件頻率,它的大小與一個詞的常見程度成反比。 
在知道了詞頻和權重之後,兩者相乘,就得到一個詞的TF-IDF值,某個詞對文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的幾個詞,就是這篇文章的關鍵詞。 
分詞有許多開源的工具包可以使用,例如中文分詞可以使用結巴分詞。

4.特徵選擇

終於到我們最關鍵的特徵選擇部分了。記得我看到過這麼一個觀點:不論什麼演算法與模型,效果的上限都是由特徵來決定的,而不同的演算法與模型只是不斷地去逼近這個上限而已。我自己對這個觀點也深以為然。特徵選擇的重要性由此就可見一斑。

特徵選擇演算法可以被視為搜尋技術和評價指標的結合。前者提供候選的新特徵子集,後者為不同的特徵子集打分。 最簡單的演算法是測試每個特徵子集,找到究竟哪個子集的錯誤率最低。這種演算法需要窮舉搜尋空間,難以算完所有的特徵集,只能涵蓋很少一部分特徵子集。 選擇何種評價指標很大程度上影響了演算法。而且,通過選擇不同的評價指標,可以吧特徵選擇演算法分為三類:包裝類(wrapper)、過濾類(filter)和嵌入類(embedded)方法。(本段描述來自wiki百科)

1.embedded 嵌入類方法

嵌入類演算法在模型建立的時候,會考慮哪些特徵對於模型的貢獻最大。最典型的即決策樹系列演算法,如ID3演算法、C4.5演算法以及CART等。決策樹演算法在樹生成過程中,每次回選擇一個特徵。這個特徵會將原樣本集劃分成較小的子集,而選擇特徵的依據是劃分後子節點的純度,劃分後子節點越純,則說明劃分效果越好。由此可見決策樹生成的過程也就是特徵選擇的過程。 
另外一個標準的嵌入類方法是正則的方式,例如我們反覆提到L1正則的方式可以用來做特徵選擇。L1正則中,最後係數為0的特徵說明對模型貢獻很小,我們保留係數不為0的特徵即可,這樣就達到了特徵選擇的目的。關於正則的詳細內容可以參考: 
http://blog.csdn.net/bitcarmanlee/article/details/51932055

2.wrapper 包裝類方法

封裝式特徵選擇是利用學習演算法的效能來評價特徵子集的優劣。因此,對於一個待評價的特徵子集,Wrapper方法需要訓練一個分類器,根據分類器的效能對該特徵子集進行評價。Wrapper方法中用以評價特徵的學習演算法是多種多樣的,例如決策樹、神經網路、貝葉斯分類器、近鄰法以及支援向量機等等。 
相對於Filter方法,Wrapper方法找到的特徵子集分類效能通常更好。但是因為Wrapper方法選出的特徵通用性不強,當改變學習演算法時,需要針對該學習演算法重新進行特徵選擇;由於每次對子集的評價都要進行分類器的訓練和測試,所以演算法計算複雜度很高,尤其對於大規模資料集來說,演算法的執行時間很長。(比部分內容來自jason的blog)

3.filter 過濾類方法

過濾類方法是實際中使用最廣泛最頻繁的特徵選擇方法。過濾特徵選擇方法運用統計方法將一個統計值分配給每個特徵,這些特徵按照分數排序,然後決定是被保留還是從資料集中刪除。 
常見的統計量包括資訊增益,資訊熵類。詳情可參考http://blog.csdn.net/bitcarmanlee/article/details/51488204。 
卡方也是常見的用於做特徵選擇的方式。 
另外fisher scores也是filter過濾類中常見的指標。

5.特徵組合

嚴格意義上來說,特徵組合也屬於特徵選擇的一部分。取工業界最常見的LR模型為例,LR模型本質上是廣義線性模型(對數線性模型),實現簡單而且容易並行,計算速度也比較快,同時使用的特徵比較好解釋,預測輸出的概率在0與1之間也非常方便易用。但是,與一般模型的容易overfitting不一樣,LR模型卻是一個underfitting模型,因為LR模型本身不夠複雜,甚至可以說相當簡單。而現實中很多問題不僅僅是線性關係,更多是複雜的非線性關係。這個時候,我們就希望通過特徵組合的方式,來描述這種更為複雜的非線性關係。

目前常見的用於特徵組合的方法:

1.GBDT

2014年facebook發表了一篇paper,講的就是GBDT LR用於特徵組合,發表以後引起比較大的反響。文章名為Practical Lessons from Predicting Clicks on Ads at Facebook,有興趣的同學們可以google一把。

2.FM

FM演算法也是用於對特徵進行組合的一種方式。FM演算法的具體細節,可以參考http://blog.csdn.net/bitcarmanlee/article/details/52143909

6.資料降維

降維,又被稱為維度規約。現實世界中得到的資料一般都有冗餘,要麼有一些是無用資訊,要麼有一些是重複的資訊,我們針對這部分冗餘資料進行一些處理之後,可以明顯減少資料的大小與維度的多少。給大家舉個很簡單的實際場景,用iphone拍出來的原始照片一般大小都為2-3M。但是我們通過qq或者微信等工具傳輸這些照片的時候,發現傳輸成功以後這些照片的大小就變成只有幾十KB了,這就是因為在傳輸照片的過程中,事先會對照片進行壓縮,壓縮完畢以後再進行傳送以節省寶貴的頻寬資源。而這個資料壓縮的過程,其實就等同於降維的過程。

很明顯資料經過降維處理以後,會大大節約資料儲存空間。同時,也會大大較少資料的後續處理計算時間。因此,資料降維技術或者說資料壓縮技術,在實際中有非常廣泛的應用。

一般來說,資料降維可以從兩個方面來實施。比較簡單的一種方式是提取特徵子集,然後用這部分子集來表示原有資料。例如影象處理裡面,如果一幅128*128的圖片,只有中心32*32的部分有非0值,那麼就只取中心32*32的部分。另外一種是通過線性/非線性的方式將原來高維空間變換到一個新的空間,這個新的空間維度比原來的高維空間要小,這樣就達到了降維的目的。一般大家討論的所謂降維技術,都是後面一種。

1.主成分分析 Principal Component Analysis(PCA)

PCA是最常用的線性降維方法。PCA的理論認為,特徵的主方向,是特徵幅度變化最大的方向,既改維度上資料的方差最大。這樣經過PCA以後,就可以使用較小的資料維度,保留住較多的原資料點的特性,從而達到降維的目的。 
PCA的具體過程,以後會寫相關的文章專門介紹。

2.奇異值分解 Singular Value Decomposition(SVD)

SVD也是實際中使用非常廣泛的一種方法。關於SVD的詳細介紹,請參考http://blog.csdn.net/bitcarmanlee/article/details/52068118

3.線性判別分析 Linear Discriminant Analysis(LDA)

以上內容,基本就涵蓋了使用者特徵工程的各個大的方面。當然某個實際專案中,不可能上面的所有方法都用到。還是得結合資料的具體情況與業務需求,選擇最適合自己的方法!