在網(wǎng)上找到了美團(tuán)一位叫付晴川同學(xué)些的ppt,里面有一幅描述用戶特征工程的圖,感覺總結(jié)得還是比較到位的?,F(xiàn)在把圖片貼出來:
這張圖將用戶特征工程里的大面基本都囊括了。因為ppt本身做得比較簡單,現(xiàn)在我們試圖針對圖里的每一項,結(jié)合具體的業(yè)務(wù)場景,做個比較詳細(xì)的分析。
原作者畫圖的時候?qū)⒌谝豁椕麨樘卣魈崛。矣X得作者想表達(dá)的本意應(yīng)該是從哪獲得相關(guān)數(shù)據(jù),所以叫原始數(shù)據(jù)提取可能更為合適一些。
這部分?jǐn)?shù)據(jù)肯定是實際應(yīng)用場景的大頭。只要是個IT公司,每家肯定都有自己的日志或者業(yè)務(wù)數(shù)據(jù)。像電商網(wǎng)站的訂單數(shù)據(jù)一般都是存在mysql/oracle/sqlserver等數(shù)據(jù)庫中,用戶瀏覽item/search等行為的數(shù)據(jù)一般都有相應(yīng)的日志進(jìn)行記錄。拿到這些數(shù)據(jù)之后就可以進(jìn)行后續(xù)的分析挖掘動作了。
這部分?jǐn)?shù)據(jù)就是通過爬蟲抓取的數(shù)據(jù)了,比如最常見的搜索引擎抓取網(wǎng)站內(nèi)容用于索引的那些搜索引擎爬蟲。
看到過一些有趣的數(shù)據(jù):2013年來自Incapsula一份互聯(lián)網(wǎng)報告顯示,目前有61.5%的互聯(lián)網(wǎng)流量不是由人類產(chǎn)生的,如果你讀到了這篇文章,你就是那個少數(shù)派(人類)。換句話說,實際上互聯(lián)網(wǎng)流量大部分都是爬蟲產(chǎn)生的。。。
正因為現(xiàn)在爬蟲已經(jīng)泛濫成災(zāi),所以很多網(wǎng)站限制爬蟲的爬取。所以大家使用爬蟲的時候,也盡可能文明使用,做一只文明的爬蟲。。。
http://blog.csdn.net/bitcarmanlee/article/details/51824080 這是之前寫過的一個簡單的爬取糗事百科段子的爬蟲,供大家參考。
這部分沒有太多可說的。當(dāng)自己數(shù)據(jù)不夠的情況下,可以通過某些渠道與其他公司或者專門的數(shù)據(jù)公司合作,獲得相關(guān)數(shù)據(jù)。例如廣告系統(tǒng)中,很多公司都會使用秒針或者Admaster之類的第三方監(jiān)測機(jī)構(gòu)的數(shù)據(jù)。
拿到原始數(shù)據(jù)以后,對原始數(shù)據(jù)進(jìn)行清洗時非常重要的步驟。因為獲得的原始數(shù)據(jù)里面有非常多的臟數(shù)據(jù)甚至錯誤數(shù)據(jù),如果不對這些數(shù)據(jù)進(jìn)行處理,會極大地影響最后模型的效果。所以數(shù)據(jù)清洗時非常重要的一個步驟。
顧名思義,異常值分析過濾是分析檢驗數(shù)據(jù)中是否有錯誤數(shù)據(jù)或者不合理的數(shù)據(jù)。如果有,則將這些數(shù)據(jù)剔除。常見的異常值分析方法有;
1)簡單統(tǒng)計量分析方法
可以對變量做一個描述性的統(tǒng)計與分析,然后查看數(shù)據(jù)是否合理。例如比較常用的統(tǒng)計量包括最大值與最小值,如果變量超過了最大值最小值的范圍,那這個值就為異常值。例如年齡屬性,如果某人填寫為200或者-1,這顯然都是屬于異常值的范疇。
2)3原則
如果數(shù)據(jù)的分布服從高斯分布(正態(tài)分布),3原則是指,測量值如果與平均值的偏差超過,即為異常值。理論依據(jù)如下:
當(dāng),,,。那么如果隨機(jī)變量服從正態(tài)分布,從到的區(qū)間內(nèi),概率密度曲線下的面積占總面積的99.7%。換句話說,隨機(jī)變量落在到的區(qū)間外的概率只有0.3%。這就是3原則。
原理很簡單,但是非常實際,三個標(biāo)準(zhǔn)差以外的數(shù)據(jù)就可以認(rèn)為是異常值了。另外,同學(xué)們請對一下三個數(shù)字敏感:0.683,0.954,0.997。
這部分內(nèi)容最后給一張高斯分布的曲線圖:
這一個步驟能避免后續(xù)出現(xiàn)的很多問題。例如年齡這個屬性,應(yīng)該全是數(shù)值類型。但是很多時候這個字段出現(xiàn)了字符串類型的值,很明顯這就是異常值,需要進(jìn)行相應(yīng)的處理。比如根據(jù)身份證號來進(jìn)行計算,或者給個特殊的值-99來標(biāo)識等等。
如果原始數(shù)據(jù)某些字段中存在換行符空格制表符等特殊字符,絕大部分情況下會影響后面進(jìn)一步的分析。所以在數(shù)據(jù)清洗階段,根據(jù)業(yè)務(wù)需求處理掉這些特殊字符是很有必要的。例如在大部分場景中,清洗掉字符串中的換行符,都是很必要的。
在原圖中,作者將這一步命名為值處理,表達(dá)的意思應(yīng)該是一致的。這一步的處理過程非常重要,涉及到的點(diǎn)也比較多,為大家選擇一些常見的一一道來。
因為現(xiàn)在機(jī)器學(xué)習(xí)的主流是統(tǒng)計機(jī)器學(xué)習(xí),既然是統(tǒng)計,自然就離不開概率的計算。例如在對文本進(jìn)行分類時,語料庫畢竟是有限的。假設(shè),,沒在語料庫中出現(xiàn)過,那根據(jù)最大似然估計MLE,這些詞出現(xiàn)的概率為0。但是實際上這些詞出現(xiàn)的概率肯定是不為0的。像最大似然估計里涉及到很多概率的連乘計算,如果一個概率為0,就會導(dǎo)致整體計算結(jié)果為0。這時候,就需要我們對數(shù)據(jù)進(jìn)行平滑了。
平滑的算法有很多。最簡單的平滑方式屬于加1平滑了,就是給每種情況出現(xiàn)的次數(shù)都加上1,這樣就避免了概率為0的情況。這種方式簡單粗暴,實際使用的效果一般也不會特別理想。當(dāng)然還有Good-turning平滑,線性插值平滑(Linear Interpolation Smoothing)等其他算法,根據(jù)具體的業(yè)務(wù)場景進(jìn)行選擇。
歸一化也是常見的數(shù)據(jù)預(yù)處理操作。歸一化的具體細(xì)節(jié)請參考http://blog.csdn.net/bitcarmanlee/article/details/51353016一文。
離散化是把連續(xù)型的數(shù)據(jù)分為若干段,是數(shù)據(jù)分析與數(shù)據(jù)挖掘中經(jīng)常采用的一種方法。對數(shù)據(jù)進(jìn)行離散化,最大的好處就是有些算法只接受離散型變量。例如決策樹,樸素貝葉斯等算法,不能以連續(xù)型變量為輸入。如果輸入時連續(xù)型數(shù)據(jù),必須要先經(jīng)過離散化處理。
常見的離散化方式有等距與等頻離散化,都比較容易理解。等距就是將連續(xù)型隨機(jī)變量的取值范圍均勻劃為n等份,每份的間距相等。例如年齡本來是個連續(xù)值,用等距離散化以后,1-10,10-20,20-30,30-40等各劃為一組。而等頻則是把觀察點(diǎn)均分為n等份,每份里面包含的樣本相同。例如有1萬個樣本,將樣本按采樣時間順序排列,然后按一千個樣本為一組,將全部的樣本分為十等份。
當(dāng)然離散化,包括前面的歸一化,都是會有負(fù)面效果的,這個負(fù)面效果就是會帶來信息的損失。比如本來我們本來有詳盡的年齡數(shù)據(jù),在決策樹算法或者貝葉斯算法中為了算法的需要,不得已將年齡變?yōu)閮和嗌倌陦涯昀夏赀@樣的離散變量,信息肯定就不如具體的年齡大小那么準(zhǔn)確與詳盡。所以在使用歸一化,離散化等數(shù)據(jù)處理分析手段時,要結(jié)合具體的實際情況,謹(jǐn)慎使用。
http://blog.csdn.net/bitcarmanlee/article/details/51472816一文中專門講解了one-hot編碼,就是數(shù)據(jù)離散化的一種具體形式。
這部分實際中我沒怎么使用過,后續(xù)找相關(guān)資料再進(jìn)行補(bǔ)充。
數(shù)據(jù)中某些字段缺失是數(shù)據(jù)分析挖掘中非常頭疼的一個問題?,F(xiàn)實世界中的數(shù)據(jù)往往非常雜亂非常臟,原始數(shù)據(jù)中某個字段或者某些字段缺失是非常常見的現(xiàn)象。但是盡管數(shù)據(jù)有缺失,生活還要繼續(xù),工作還得繼續(xù)。面對這種情況,該怎樣繼續(xù)呢?
方法一:丟棄
最簡單的方式,如果發(fā)現(xiàn)數(shù)據(jù)有缺失,直接刪除這個字段或者將整個樣本丟棄。如果大部分樣本的某個字段都缺失,那么很明顯這個字段就是不可用狀態(tài)。如果某條樣本的大部分字段都缺失,那么很明顯這個樣本就是不可用狀態(tài)。這種處理方式簡單粗暴,效率高,但是很明顯適用范圍有限,只適合數(shù)據(jù)缺失較少的情況。如果某個特征特別重要,數(shù)據(jù)缺失情況還特別嚴(yán)重,那么美別的辦法,老老實實重新采集數(shù)據(jù)吧。
方法二:統(tǒng)計值填充
如果某個屬性缺失,特別是數(shù)值類型的屬性,可以根據(jù)所有樣本關(guān)于這維屬性的統(tǒng)計值填充,常見的有平均值、中值、分位數(shù)、眾數(shù)、隨機(jī)值等。這種方式難度也不大,效果一般。最大的副作用就是人為帶來了不少噪聲。
方法三:預(yù)測填充
用其他變量做預(yù)測模型來預(yù)測缺失值,效果一般比統(tǒng)計值填充要好一些。但是此方法有一個根本缺陷,如果其他變量和缺失變量無關(guān),則預(yù)測的結(jié)果無意義。如果預(yù)測結(jié)果相當(dāng)準(zhǔn)確,則又說明這個變量是沒必要加入建模的。一般情況下,介于兩者之間。
方法四:將變量映射到高維空間
比如性別,有男、女、缺失三種情況,則映射成3個變量:是否男、是否女、是否缺失。連續(xù)型變量也可以這樣處理。比如Google、百度的CTR預(yù)估模型,預(yù)處理時會把所有變量都這樣處理,達(dá)到幾億維。這樣做的好處是完整保留了原始數(shù)據(jù)的全部信息、不用考慮缺失值、不用考慮線性不可分之類的問題。缺點(diǎn)是計算量大大提升。而且只有在樣本量非常大的時候效果才好,否則會因為過于稀疏,效果很差。(本小結(jié)內(nèi)容來自知乎)
嚴(yán)格意義上說,分詞屬于NLP的范疇。既然原圖中提到了分詞tf/idf,我們就簡單介紹一下。
TF-IDF全稱為term frequency–inverse document frequency。TF就是term frequency的縮寫,意為詞頻。IDF則是inverse document frequency的縮寫,意為逆文檔頻率。tf-idf通常用來提取關(guān)鍵詞。比如,對一個文章提取關(guān)鍵詞作為搜索詞,就可以采用TF-IDF算法。
要找出一篇文章中的關(guān)鍵詞,通常的思路就是,就是找到出現(xiàn)次數(shù)最多的詞。如果某個詞很重要,它應(yīng)該在這篇文章中多次出現(xiàn)。于是,我們進(jìn)行詞頻TF統(tǒng)計。但是,在中文文獻(xiàn)里,的地得了等類似的詞匯出現(xiàn)的頻率一定是最高的,而且這類詞沒什么實際的含義,我們就叫他停用詞,一般遇到停用詞就將他扔掉。
扔掉停用詞以后,我們也不能簡單地認(rèn)為出現(xiàn)頻率最高的詞就是我們所需要的關(guān)鍵字。如果一個詞很少見,但是它在某個文章中反復(fù)出現(xiàn)多次,那么可以認(rèn)為這個詞反應(yīng)了這個文章的特性,可以把它作為關(guān)鍵詞。在信息檢索中,這個權(quán)重非常重要,它決定了關(guān)鍵詞的重要度,這個權(quán)重叫做逆文檔頻率,它的大小與一個詞的常見程度成反比。
在知道了詞頻和權(quán)重之后,兩者相乘,就得到一個詞的TF-IDF值,某個詞對文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的幾個詞,就是這篇文章的關(guān)鍵詞。
分詞有許多開源的工具包可以使用,例如中文分詞可以使用結(jié)巴分詞。
終于到我們最關(guān)鍵的特征選擇部分了。記得我看到過這么一個觀點(diǎn):不論什么算法與模型,效果的上限都是由特征來決定的,而不同的算法與模型只是不斷地去逼近這個上限而已。我自己對這個觀點(diǎn)也深以為然。特征選擇的重要性由此就可見一斑。
特征選擇算法可以被視為搜索技術(shù)和評價指標(biāo)的結(jié)合。前者提供候選的新特征子集,后者為不同的特征子集打分。 最簡單的算法是測試每個特征子集,找到究竟哪個子集的錯誤率最低。這種算法需要窮舉搜索空間,難以算完所有的特征集,只能涵蓋很少一部分特征子集。 選擇何種評價指標(biāo)很大程度上影響了算法。而且,通過選擇不同的評價指標(biāo),可以吧特征選擇算法分為三類:包裝類(wrapper)、過濾類(filter)和嵌入類(embedded)方法。(本段描述來自wiki百科)
嵌入類算法在模型建立的時候,會考慮哪些特征對于模型的貢獻(xiàn)最大。最典型的即決策樹系列算法,如ID3算法、C4.5算法以及CART等。決策樹算法在樹生成過程中,每次回選擇一個特征。這個特征會將原樣本集劃分成較小的子集,而選擇特征的依據(jù)是劃分后子節(jié)點(diǎn)的純度,劃分后子節(jié)點(diǎn)越純,則說明劃分效果越好。由此可見決策樹生成的過程也就是特征選擇的過程。
另外一個標(biāo)準(zhǔn)的嵌入類方法是正則的方式,例如我們反復(fù)提到L1正則的方式可以用來做特征選擇。L1正則中,最后系數(shù)為0的特征說明對模型貢獻(xiàn)很小,我們保留系數(shù)不為0的特征即可,這樣就達(dá)到了特征選擇的目的。關(guān)于正則的詳細(xì)內(nèi)容可以參考:
http://blog.csdn.net/bitcarmanlee/article/details/51932055。
封裝式特征選擇是利用學(xué)習(xí)算法的性能來評價特征子集的優(yōu)劣。因此,對于一個待評價的特征子集,Wrapper方法需要訓(xùn)練一個分類器,根據(jù)分類器的性能對該特征子集進(jìn)行評價。Wrapper方法中用以評價特征的學(xué)習(xí)算法是多種多樣的,例如決策樹、神經(jīng)網(wǎng)絡(luò)、貝葉斯分類器、近鄰法以及支持向量機(jī)等等。
相對于Filter方法,Wrapper方法找到的特征子集分類性能通常更好。但是因為Wrapper方法選出的特征通用性不強(qiáng),當(dāng)改變學(xué)習(xí)算法時,需要針對該學(xué)習(xí)算法重新進(jìn)行特征選擇;由于每次對子集的評價都要進(jìn)行分類器的訓(xùn)練和測試,所以算法計算復(fù)雜度很高,尤其對于大規(guī)模數(shù)據(jù)集來說,算法的執(zhí)行時間很長。(比部分內(nèi)容來自jason的blog)
過濾類方法是實際中使用最廣泛最頻繁的特征選擇方法。過濾特征選擇方法運(yùn)用統(tǒng)計方法將一個統(tǒng)計值分配給每個特征,這些特征按照分?jǐn)?shù)排序,然后決定是被保留還是從數(shù)據(jù)集中刪除。
常見的統(tǒng)計量包括信息增益,信息熵類。詳情可參考http://blog.csdn.net/bitcarmanlee/article/details/51488204。
卡方也是常見的用于做特征選擇的方式。
另外fisher scores也是filter過濾類中常見的指標(biāo)。
嚴(yán)格意義上來說,特征組合也屬于特征選擇的一部分。取工業(yè)界最常見的LR模型為例,LR模型本質(zhì)上是廣義線性模型(對數(shù)線性模型),實現(xiàn)簡單而且容易并行,計算速度也比較快,同時使用的特征比較好解釋,預(yù)測輸出的概率在0與1之間也非常方便易用。但是,與一般模型的容易o(hù)verfitting不一樣,LR模型卻是一個underfitting模型,因為LR模型本身不夠復(fù)雜,甚至可以說相當(dāng)簡單。而現(xiàn)實中很多問題不僅僅是線性關(guān)系,更多是復(fù)雜的非線性關(guān)系。這個時候,我們就希望通過特征組合的方式,來描述這種更為復(fù)雜的非線性關(guān)系。
目前常見的用于特征組合的方法:
2014年facebook發(fā)表了一篇paper,講的就是GBDT+LR用于特征組合,發(fā)表以后引起比較大的反響。文章名為Practical Lessons from Predicting Clicks on Ads at Facebook,有興趣的同學(xué)們可以google一把。
FM算法也是用于對特征進(jìn)行組合的一種方式。FM算法的具體細(xì)節(jié),可以參考http://blog.csdn.net/bitcarmanlee/article/details/52143909。
降維,又被稱為維度規(guī)約?,F(xiàn)實世界中得到的數(shù)據(jù)一般都有冗余,要么有一些是無用信息,要么有一些是重復(fù)的信息,我們針對這部分冗余數(shù)據(jù)進(jìn)行一些處理之后,可以明顯減少數(shù)據(jù)的大小與維度的多少。給大家舉個很簡單的實際場景,用iphone拍出來的原始照片一般大小都為2-3M。但是我們通過qq或者微信等工具傳輸這些照片的時候,發(fā)現(xiàn)傳輸成功以后這些照片的大小就變成只有幾十KB了,這就是因為在傳輸照片的過程中,事先會對照片進(jìn)行壓縮,壓縮完畢以后再進(jìn)行傳送以節(jié)省寶貴的帶寬資源。而這個數(shù)據(jù)壓縮的過程,其實就等同于降維的過程。
很明顯數(shù)據(jù)經(jīng)過降維處理以后,會大大節(jié)約數(shù)據(jù)存儲空間。同時,也會大大較少數(shù)據(jù)的后續(xù)處理計算時間。因此,數(shù)據(jù)降維技術(shù)或者說數(shù)據(jù)壓縮技術(shù),在實際中有非常廣泛的應(yīng)用。
一般來說,數(shù)據(jù)降維可以從兩個方面來實施。比較簡單的一種方式是提取特征子集,然后用這部分子集來表示原有數(shù)據(jù)。例如圖像處理里面,如果一幅128*128的圖片,只有中心32*32的部分有非0值,那么就只取中心32*32的部分。另外一種是通過線性/非線性的方式將原來高維空間變換到一個新的空間,這個新的空間維度比原來的高維空間要小,這樣就達(dá)到了降維的目的。一般大家討論的所謂降維技術(shù),都是后面一種。
PCA是最常用的線性降維方法。PCA的理論認(rèn)為,特征的主方向,是特征幅度變化最大的方向,既改維度上數(shù)據(jù)的方差最大。這樣經(jīng)過PCA以后,就可以使用較小的數(shù)據(jù)維度,保留住較多的原數(shù)據(jù)點(diǎn)的特性,從而達(dá)到降維的目的。
PCA的具體過程,以后會寫相關(guān)的文章專門介紹。
SVD也是實際中使用非常廣泛的一種方法。關(guān)于SVD的詳細(xì)介紹,請參考http://blog.csdn.net/bitcarmanlee/article/details/52068118。
以上內(nèi)容,基本就涵蓋了用戶特征工程的各個大的方面。當(dāng)然某個實際項目中,不可能上面的所有方法都用到。還是得結(jié)合數(shù)據(jù)的具體情況與業(yè)務(wù)需求,選擇最適合自己的方法!
原文鏈接:http://blog.csdn.net/bitcarmanlee/article/details/52244237