前言
最近去Kaggle觀摩學(xué)習(xí)了各路大牛們分享的數(shù)據(jù)挖掘(DM,Data Mining)思路趋厉,收獲頗豐寨闹,因此想記錄一下這段時間的一些感悟。
這篇文章主要結(jié)合個人實(shí)踐經(jīng)歷和在Kaggle上的學(xué)習(xí)觅廓,依據(jù)Guide to Intelligent Data Analysis (Berthold, et al., 2010)提供的CRISP-DM流程圖鼻忠,梳理一下(我認(rèn)為的)DM過程中每一步的要點(diǎn)。
有些地方可能理解有偏差或者概括不全,歡迎指正:)
DM流程與要點(diǎn)總結(jié)
先上流程圖帖蔓。
上圖涵蓋了DM的6大步驟矮瘟,每個步驟對應(yīng)有需要思考的一系列問題。以下我僅遵循大步驟的邏輯塑娇,各個步驟下涉及的細(xì)節(jié)可能和圖上的有所不同澈侠。
0. 數(shù)據(jù)收集(Data Collection)
先簡單談?wù)劦?步,數(shù)據(jù)收集埋酬。
數(shù)據(jù)收集并不包含在上面的DM流程里哨啃,事實(shí)上由于對DM的定義不同,不少書本都把數(shù)據(jù)收集排除在DM流程之外写妥。這一步主要涉及數(shù)據(jù)平臺(e.g. hadoop, spark)拳球、開發(fā)語言(e.g. c++, java, phthon)等方面的知識,我個人不是太了解珍特,就不細(xì)說了祝峻。
提數(shù)據(jù)收集的原因,一是我發(fā)現(xiàn)國內(nèi)不少數(shù)據(jù)挖掘崗都有涉及到數(shù)據(jù)收集扎筒、數(shù)據(jù)平臺搭建等工作莱找,二是高質(zhì)量的數(shù)據(jù)對后續(xù)的分析工作來說實(shí)在是太重要了。
研究生期間我給英國某個公司做DM項(xiàng)目嗜桌,那個公司使用的是第三方的數(shù)據(jù)系統(tǒng)(非常爛)奥溺,并且沒有專門的數(shù)據(jù)工程師/程序員做數(shù)據(jù)處理和維護(hù),我和小伙伴拿到一堆亂碼的時候真的相當(dāng)崩潰骨宠。也因?yàn)檫@樣浮定,我們當(dāng)時花了很多力氣來從頭整理數(shù)據(jù),耽誤了不少時間诱篷。但無論再怎么整理壶唤,我們的數(shù)據(jù)質(zhì)量始終不高(大量的信息缺失和無法溯源的數(shù)據(jù)錄入失誤),導(dǎo)致最終模型不太理想棕所。如果數(shù)據(jù)收集環(huán)節(jié)能得到把控闸盔,結(jié)果可能會不一樣。(望天
1. 問題理解(Project Understanding)
準(zhǔn)確來說project應(yīng)該翻譯成「項(xiàng)目」琳省,但一個DM項(xiàng)目的最終目的是解決問題迎吵,所以我就直接把這一步譯作「問題理解」了。
我個人認(rèn)為這一步關(guān)鍵是弄明白兩件事:
- 對方想要得到什么問題的答案
- 怎么把這個問題數(shù)學(xué)語言化
前者的關(guān)鍵在于「聽」和「問」:聽明白對方說了什么针贬,問清楚對方?jīng)]說明白或者沒被挖掘的需求击费。有時候一個DM項(xiàng)目的需求會很模糊,舉個極端點(diǎn)的例子桦他,比如對方說“我想要產(chǎn)品A和用戶之間的insight”蔫巩,insight是一個很廣的詞,TA真正想知道的可能是“哪些用戶能帶來更多的利潤”,也有可能是“下個月哪些用戶會繼續(xù)購買產(chǎn)品A”圆仔。問題稍微不一樣垃瞧,很可能就會導(dǎo)致完全不同的分析過程。所以一定要先和問題的提出方在需求上達(dá)成百分之百的共識坪郭,并且需求越詳細(xì)越好个从。
后者考察的是analyst的經(jīng)驗(yàn)和功力。在拿到問題/需求的時候歪沃,腦子里應(yīng)該對「這個問題轉(zhuǎn)換成數(shù)學(xué)語言是什么」嗦锐、「能不能實(shí)現(xiàn)」、「適合什么分析方法/方向」有初步的把握沪曙。舉個簡單例子奕污,現(xiàn)在有一個需求:“我有產(chǎn)品A,我有用戶的歷史購買數(shù)據(jù)液走,能不能預(yù)測一下下個月每個用戶繼續(xù)購買產(chǎn)品A的概率菊值?” 對于這個問題,在著手分析數(shù)據(jù)之前育灸,一個可能的思路是:這是預(yù)測問題,預(yù)測的是用戶買產(chǎn)品A的概率昵宇,概率介于0和1之間磅崭,0代表用戶一定不買產(chǎn)品A,1代表用戶一定買產(chǎn)品A瓦哎,那么本質(zhì)上這是二元分類問題砸喻,可以通過二元分類算法來實(shí)現(xiàn)。
有不少思考框架可以幫助理清問題蒋譬,比如CLD(Causal Loop Diagram)割岛、Cognitive Map等等。我個人最常用的是思維導(dǎo)圖犯助。
2. 數(shù)據(jù)理解(Data Understanding)
這一步又叫Exploratory Analysis癣漆,意在通過數(shù)據(jù)分析(如平均值等統(tǒng)計量,各種圖表)來了解手上的數(shù)據(jù)剂买。(當(dāng)然啦惠爽,有時候數(shù)據(jù)分析本身就是一個項(xiàng)目。)
數(shù)據(jù)理解影響分析方法的選取和確立瞬哼。比如婚肆,理解我的目標(biāo)變量是數(shù)值還是文本,是離散的還是連續(xù)的坐慰,是截面數(shù)據(jù)還是時間序列较性。不同的數(shù)據(jù)類型有不同的分析方法。
與此同時,這一步也是探究數(shù)據(jù)質(zhì)量的關(guān)鍵:我的數(shù)據(jù)是否和問題相關(guān)赞咙,數(shù)據(jù)是否合理责循,有無缺失值和異常值等。任何一個環(huán)節(jié)一旦得到“否”的答案人弓,就需要相應(yīng)的對策去解決沼死。
很多復(fù)雜的DM項(xiàng)目,比如Kaggle里的各種競賽崔赌,涵蓋的都是幾百甚至上千兆的數(shù)據(jù)意蛀,有時候還不只一個數(shù)據(jù)集。這種量級的數(shù)據(jù)健芭,一開始也許根本懵得無從下手(好啦县钥,指的就是本渣渣我),不花費(fèi)大量時間去理解慈迈、分析若贮,很難察覺出其中的異常點(diǎn)或關(guān)聯(lián)性。只有對數(shù)據(jù)十分了解痒留,才有可能在后續(xù)步驟做出好的策略(e.g. 變量選取谴麦,變量構(gòu)造,算法選壬焱贰)匾效。
總而言之,對數(shù)據(jù)越了解恤磷,后續(xù)走的彎路越少面哼,項(xiàng)目成功率越高。
3. 數(shù)據(jù)準(zhǔn)備(Data Preparation)
這一步在機(jī)器學(xué)習(xí)中又叫特征工程(Feature Engineering)扫步,要考慮的事很多魔策。比如,這些變量(特征)需不需要處理異常值(outliers)河胎?用不用填補(bǔ)缺失值(missing values)闯袒?要不要做標(biāo)準(zhǔn)化/歸一化/離散化?哪些變量對我的分析有幫助仿粹?需不需要降維搁吓?有沒有必要構(gòu)造新變量?簡而言之就是對數(shù)據(jù)反復(fù)調(diào)戲反復(fù)處理吭历、轉(zhuǎn)換堕仔,直至可以丟進(jìn)模型里跑出好結(jié)果為止。
這一步有多重要呢晌区,這么說吧摩骨,Kaggle上的高分玩家通贞,除去對算法的設(shè)計、應(yīng)用外恼五,數(shù)據(jù)準(zhǔn)備(特征工程)都是做到了極致的昌罩。高質(zhì)量的數(shù)據(jù),光是跑benchmark模型都能得到不錯的結(jié)果灾馒。我最近觀摩的一個DM競賽(已結(jié)束)茎用,6組數(shù)據(jù)集,3,000,000+樣本睬罗,其中一個用XGBoost做benchmark模型跑出了很好結(jié)果的參賽者轨功,用了19個變量,其中18個是構(gòu)造出來的新變量容达。
此外古涧,想提一下WoE編碼(Weight of Evidence Encoding)。WoE編碼在提高二元分類模型的性能上花盐,真的屢試不爽羡滑。雖然WoE編碼和邏輯回歸是最加拍檔,但用在tree-based模型上算芯,效果也很不錯柒昏。但不知道為什么這個東西很少有人談?wù)摚?/p>
再說說工具。在實(shí)際操作一個DM項(xiàng)目的時候熙揍,無論是數(shù)據(jù)理解還是數(shù)據(jù)準(zhǔn)備昙楚,都涉及到大量的數(shù)據(jù)拆分、結(jié)合诈嘿、轉(zhuǎn)換。就這些方面而言削葱,R的dplyr
+caret
(對應(yīng)python的pandas
+sklearn
)是很好的實(shí)現(xiàn)工具奖亚。
4. 建模(Modeling)
建模整體上分為兩個方向:一是搭前人輪子造車,二是自行構(gòu)造算法析砸。后者就不說了昔字,說說前者。
大部分analyst都是依靠已有算法做分析首繁,而能否成功完成一個DM任務(wù)作郭,關(guān)鍵有兩點(diǎn):
一,有扎實(shí)的理論基礎(chǔ)弦疮,對各個類型的DM問題有所了解夹攒,對各類DM問題下的各類算法有所了解,知道什么算法對什么類型的數(shù)據(jù)有效胁塞,知道如何調(diào)參等咏尝。
二是創(chuàng)新能力压语,很多時候光靠一種算法是解決不了問題的,因?yàn)槊糠N算法都有自己的內(nèi)在缺陷编检,這個時候就需要組合算法去彌補(bǔ)這些缺陷胎食,即Ensemble Methods吓著,如 Bagging撑教、Boosting、Stacking等未檩,Kaggle里很多冠軍模型都屬于這種情況蕾总。(我曾經(jīng)見過某個冠軍團(tuán)隊(duì)的模型粥航,模型一共疊加了好幾層,而每一層基本都是算法組合谤专,看完我整個人都不好了躁锡。)
現(xiàn)在很多analyst喜歡拿XGBoost(Chen & Guestrin, 2016)或者GBM(Friedman, 2001) 做benchmark模型,因?yàn)檫@兩個算法性能很不錯置侍,在數(shù)據(jù)質(zhì)量好的前提下映之,一般都能得到不錯的結(jié)果。(我個人感覺這兩個算法比隨機(jī)森林要好使蜡坊;AdaBoost的話之前不知道為什么在我的電腦上跑不起來杠输,所以說不準(zhǔn)。) 用好這類模型的關(guān)鍵點(diǎn)在于調(diào)參秕衙,有經(jīng)驗(yàn)的analyst和好的計算機(jī)是關(guān)鍵蠢甲。
工具方面,R中當(dāng)之無愧是caret
据忘,對應(yīng)python中的sklearn
鹦牛。
5. 評估(Evaluation)
上文的流程圖把這一步定義為對整個DM項(xiàng)目的評估,但這里我想講講模型評估(這個部分在流程圖中被歸到建模那一步里了)勇吊。
一般來說曼追,跑模型的時候數(shù)據(jù)會被分為三部分:訓(xùn)練集(Training Set)、驗(yàn)證集(Validation Set)和測試集(Test Set)汉规。訓(xùn)練集拿來建模礼殊,驗(yàn)證集拿來調(diào)參,測試集拿來評估模型性能针史。
但上述過程存在一個問題:這種方法只適用于數(shù)據(jù)量大的時候晶伦,數(shù)據(jù)量小的時候,測試集是不valid的啄枕。我之前做過的一個DM項(xiàng)目婚陪,因?yàn)榉N種原因樣本量非常小,在這種情況下频祝,分割數(shù)據(jù)的時候只能三選二近忙,也就是只要訓(xùn)練集和驗(yàn)證集竭业,或是訓(xùn)練集和測試集。但除此之外更大的問題是及舍,因?yàn)閿?shù)據(jù)量過小未辆,只要訓(xùn)練集和驗(yàn)證集/測試集中的樣本稍有變化,模型的評估結(jié)果(比如AUC值)就會有很大的不一樣锯玛。也就是說咐柜,單個評估結(jié)果不可靠。
針對這種情況攘残,建議做Bootstrap或Cross Validation拙友,通過統(tǒng)計指標(biāo)(平均值,方差等)來評估模型歼郭。在R里遗契,通過caret
包可以很容易實(shí)現(xiàn)。
6. Deployment
這部分略過:)
結(jié)語
說是總結(jié)病曾,結(jié)果寫的過程中磕磕碰碰牍蜂,很多思路理不清楚,句子寫不通順泰涂,果然要學(xué)習(xí)鲫竞、要思考的地方還有很多。(笑
再來就是逼蒙,打算今后每隔一段時間就做一次DM總結(jié)从绘。這篇因?yàn)槭堑谝黄鞣N亂七八糟的都想一次寫下來是牢,所以內(nèi)容比較多僵井,今后的話題應(yīng)該會更專,篇幅也不會那么大驳棱。
最后驹沿,立個flag,下一篇一定要比現(xiàn)在有進(jìn)步蹈胡。(握拳
References
Berthold, M. R., Borgelt, C., Hppner, F., & Klawonn, F. (2010). Guide to Intelligent Data Analysis: How to Intelligently Make Sense of Real Data. Springer London.
Chen, T., & Guestrin, C. (2016). XGBoost: A Scalable Tree Boosting System. ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (pp.785-794). ACM.
Friedman, J., 2001. Greedy function approximation: a gradient boosting machine. Annals of statistics, 29(5), pp. 1189-1232.