前言
最近去Kaggle觀摩學(xué)習(xí)了各路大牛們分享的數(shù)據(jù)挖掘(DM,Data Mining)思路,收獲頗豐,因此想記錄一下這段時(shí)間的一些感悟。
這篇文章主要結(jié)合個(gè)人實(shí)踐經(jīng)歷和在Kaggle上的學(xué)習(xí),依據(jù)Guide to Intelligent Data Analysis (Berthold, et al., 2010)提供的CRISP-DM流程圖,梳理一下(我認(rèn)為的)DM過(guò)程中每一步的要點(diǎn)。
有些地方可能理解有偏差或者概括不全,歡迎指正:)
DM流程與要點(diǎn)總結(jié)
先上流程圖。

上圖涵蓋了DM的6大步驟,每個(gè)步驟對(duì)應(yīng)有需要思考的一系列問(wèn)題。以下我僅遵循大步驟的邏輯,各個(gè)步驟下涉及的細(xì)節(jié)可能和圖上的有所不同。
0. 數(shù)據(jù)收集(Data Collection)
先簡(jiǎn)單談?wù)劦?步,數(shù)據(jù)收集。
數(shù)據(jù)收集并不包含在上面的DM流程里,事實(shí)上由于對(duì)DM的定義不同,不少書(shū)本都把數(shù)據(jù)收集排除在DM流程之外。這一步主要涉及數(shù)據(jù)平臺(tái)(e.g. hadoop, spark)、開(kāi)發(fā)語(yǔ)言(e.g. c++, java, phthon)等方面的知識(shí),我個(gè)人不是太了解,就不細(xì)說(shuō)了。
提數(shù)據(jù)收集的原因,一是我發(fā)現(xiàn)國(guó)內(nèi)不少數(shù)據(jù)挖掘崗都有涉及到數(shù)據(jù)收集、數(shù)據(jù)平臺(tái)搭建等工作,二是高質(zhì)量的數(shù)據(jù)對(duì)后續(xù)的分析工作來(lái)說(shuō)實(shí)在是太重要了。
研究生期間我給英國(guó)某個(gè)公司做DM項(xiàng)目,那個(gè)公司使用的是第三方的數(shù)據(jù)系統(tǒng)(非常爛),并且沒(méi)有專門(mén)的數(shù)據(jù)工程師/程序員做數(shù)據(jù)處理和維護(hù),我和小伙伴拿到一堆亂碼的時(shí)候真的相當(dāng)崩潰。也因?yàn)檫@樣,我們當(dāng)時(shí)花了很多力氣來(lái)從頭整理數(shù)據(jù),耽誤了不少時(shí)間。但無(wú)論再怎么整理,我們的數(shù)據(jù)質(zhì)量始終不高(大量的信息缺失和無(wú)法溯源的數(shù)據(jù)錄入失誤),導(dǎo)致最終模型不太理想。如果數(shù)據(jù)收集環(huán)節(jié)能得到把控,結(jié)果可能會(huì)不一樣。(望天
1. 問(wèn)題理解(Project Understanding)
準(zhǔn)確來(lái)說(shuō)project應(yīng)該翻譯成「項(xiàng)目」,但一個(gè)DM項(xiàng)目的最終目的是解決問(wèn)題,所以我就直接把這一步譯作「問(wèn)題理解」了。
我個(gè)人認(rèn)為這一步關(guān)鍵是弄明白兩件事:
- 對(duì)方想要得到什么問(wèn)題的答案
- 怎么把這個(gè)問(wèn)題數(shù)學(xué)語(yǔ)言化
前者的關(guān)鍵在于「聽(tīng)」和「問(wèn)」:聽(tīng)明白對(duì)方說(shuō)了什么,問(wèn)清楚對(duì)方?jīng)]說(shuō)明白或者沒(méi)被挖掘的需求。有時(shí)候一個(gè)DM項(xiàng)目的需求會(huì)很模糊,舉個(gè)極端點(diǎn)的例子,比如對(duì)方說(shuō)“我想要產(chǎn)品A和用戶之間的insight”,insight是一個(gè)很廣的詞,TA真正想知道的可能是“哪些用戶能帶來(lái)更多的利潤(rùn)”,也有可能是“下個(gè)月哪些用戶會(huì)繼續(xù)購(gòu)買產(chǎn)品A”。問(wèn)題稍微不一樣,很可能就會(huì)導(dǎo)致完全不同的分析過(guò)程。所以一定要先和問(wèn)題的提出方在需求上達(dá)成百分之百的共識(shí),并且需求越詳細(xì)越好。
后者考察的是analyst的經(jīng)驗(yàn)和功力。在拿到問(wèn)題/需求的時(shí)候,腦子里應(yīng)該對(duì)「這個(gè)問(wèn)題轉(zhuǎn)換成數(shù)學(xué)語(yǔ)言是什么」、「能不能實(shí)現(xiàn)」、「適合什么分析方法/方向」有初步的把握。舉個(gè)簡(jiǎn)單例子,現(xiàn)在有一個(gè)需求:“我有產(chǎn)品A,我有用戶的歷史購(gòu)買數(shù)據(jù),能不能預(yù)測(cè)一下下個(gè)月每個(gè)用戶繼續(xù)購(gòu)買產(chǎn)品A的概率?” 對(duì)于這個(gè)問(wèn)題,在著手分析數(shù)據(jù)之前,一個(gè)可能的思路是:這是預(yù)測(cè)問(wèn)題,預(yù)測(cè)的是用戶買產(chǎn)品A的概率,概率介于0和1之間,0代表用戶一定不買產(chǎn)品A,1代表用戶一定買產(chǎn)品A,那么本質(zhì)上這是二元分類問(wèn)題,可以通過(guò)二元分類算法來(lái)實(shí)現(xiàn)。
有不少思考框架可以幫助理清問(wèn)題,比如CLD(Causal Loop Diagram)、Cognitive Map等等。我個(gè)人最常用的是思維導(dǎo)圖。
2. 數(shù)據(jù)理解(Data Understanding)
這一步又叫Exploratory Analysis,意在通過(guò)數(shù)據(jù)分析(如平均值等統(tǒng)計(jì)量,各種圖表)來(lái)了解手上的數(shù)據(jù)。(當(dāng)然啦,有時(shí)候數(shù)據(jù)分析本身就是一個(gè)項(xiàng)目。)
數(shù)據(jù)理解影響分析方法的選取和確立。比如,理解我的目標(biāo)變量是數(shù)值還是文本,是離散的還是連續(xù)的,是截面數(shù)據(jù)還是時(shí)間序列。不同的數(shù)據(jù)類型有不同的分析方法。
與此同時(shí),這一步也是探究數(shù)據(jù)質(zhì)量的關(guān)鍵:我的數(shù)據(jù)是否和問(wèn)題相關(guān),數(shù)據(jù)是否合理,有無(wú)缺失值和異常值等。任何一個(gè)環(huán)節(jié)一旦得到“否”的答案,就需要相應(yīng)的對(duì)策去解決。
很多復(fù)雜的DM項(xiàng)目,比如Kaggle里的各種競(jìng)賽,涵蓋的都是幾百甚至上千兆的數(shù)據(jù),有時(shí)候還不只一個(gè)數(shù)據(jù)集。這種量級(jí)的數(shù)據(jù),一開(kāi)始也許根本懵得無(wú)從下手(好啦,指的就是本渣渣我),不花費(fèi)大量時(shí)間去理解、分析,很難察覺(jué)出其中的異常點(diǎn)或關(guān)聯(lián)性。只有對(duì)數(shù)據(jù)十分了解,才有可能在后續(xù)步驟做出好的策略(e.g. 變量選取,變量構(gòu)造,算法選取)。
總而言之,對(duì)數(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)化/歸一化/離散化?哪些變量對(duì)我的分析有幫助?需不需要降維?有沒(méi)有必要構(gòu)造新變量?簡(jiǎn)而言之就是對(duì)數(shù)據(jù)反復(fù)調(diào)戲反復(fù)處理、轉(zhuǎn)換,直至可以丟進(jìn)模型里跑出好結(jié)果為止。
這一步有多重要呢,這么說(shuō)吧,Kaggle上的高分玩家,除去對(duì)算法的設(shè)計(jì)、應(yīng)用外,數(shù)據(jù)準(zhǔn)備(特征工程)都是做到了極致的。高質(zhì)量的數(shù)據(jù),光是跑benchmark模型都能得到不錯(cuò)的結(jié)果。我最近觀摩的一個(gè)DM競(jìng)賽(已結(jié)束),6組數(shù)據(jù)集,3,000,000+樣本,其中一個(gè)用XGBoost做benchmark模型跑出了很好結(jié)果的參賽者,用了19個(gè)變量,其中18個(gè)是構(gòu)造出來(lái)的新變量。
此外,想提一下WoE編碼(Weight of Evidence Encoding)。WoE編碼在提高二元分類模型的性能上,真的屢試不爽。雖然WoE編碼和邏輯回歸是最加拍檔,但用在tree-based模型上,效果也很不錯(cuò)。但不知道為什么這個(gè)東西很少有人談?wù)摚?/p>
再說(shuō)說(shuō)工具。在實(shí)際操作一個(gè)DM項(xiàng)目的時(shí)候,無(wú)論是數(shù)據(jù)理解還是數(shù)據(jù)準(zhǔn)備,都涉及到大量的數(shù)據(jù)拆分、結(jié)合、轉(zhuǎn)換。就這些方面而言,R的dplyr+caret(對(duì)應(yīng)python的pandas+sklearn)是很好的實(shí)現(xiàn)工具。
4. 建模(Modeling)
建模整體上分為兩個(gè)方向:一是搭前人輪子造車,二是自行構(gòu)造算法。后者就不說(shuō)了,說(shuō)說(shuō)前者。
大部分analyst都是依靠已有算法做分析,而能否成功完成一個(gè)DM任務(wù),關(guān)鍵有兩點(diǎn):
一,有扎實(shí)的理論基礎(chǔ),對(duì)各個(gè)類型的DM問(wèn)題有所了解,對(duì)各類DM問(wèn)題下的各類算法有所了解,知道什么算法對(duì)什么類型的數(shù)據(jù)有效,知道如何調(diào)參等。
二是創(chuàng)新能力,很多時(shí)候光靠一種算法是解決不了問(wèn)題的,因?yàn)槊糠N算法都有自己的內(nèi)在缺陷,這個(gè)時(shí)候就需要組合算法去彌補(bǔ)這些缺陷,即Ensemble Methods,如 Bagging、Boosting、Stacking等,Kaggle里很多冠軍模型都屬于這種情況。(我曾經(jīng)見(jiàn)過(guò)某個(gè)冠軍團(tuán)隊(duì)的模型,模型一共疊加了好幾層,而每一層基本都是算法組合,看完我整個(gè)人都不好了。)
現(xiàn)在很多analyst喜歡拿XGBoost(Chen & Guestrin, 2016)或者GBM(Friedman, 2001) 做benchmark模型,因?yàn)檫@兩個(gè)算法性能很不錯(cuò),在數(shù)據(jù)質(zhì)量好的前提下,一般都能得到不錯(cuò)的結(jié)果。(我個(gè)人感覺(jué)這兩個(gè)算法比隨機(jī)森林要好使;AdaBoost的話之前不知道為什么在我的電腦上跑不起來(lái),所以說(shuō)不準(zhǔn)。) 用好這類模型的關(guān)鍵點(diǎn)在于調(diào)參,有經(jīng)驗(yàn)的analyst和好的計(jì)算機(jī)是關(guān)鍵。
工具方面,R中當(dāng)之無(wú)愧是caret,對(duì)應(yīng)python中的sklearn。
5. 評(píng)估(Evaluation)
上文的流程圖把這一步定義為對(duì)整個(gè)DM項(xiàng)目的評(píng)估,但這里我想講講模型評(píng)估(這個(gè)部分在流程圖中被歸到建模那一步里了)。
一般來(lái)說(shuō),跑模型的時(shí)候數(shù)據(jù)會(huì)被分為三部分:訓(xùn)練集(Training Set)、驗(yàn)證集(Validation Set)和測(cè)試集(Test Set)。訓(xùn)練集拿來(lái)建模,驗(yàn)證集拿來(lái)調(diào)參,測(cè)試集拿來(lái)評(píng)估模型性能。
但上述過(guò)程存在一個(gè)問(wèn)題:這種方法只適用于數(shù)據(jù)量大的時(shí)候,數(shù)據(jù)量小的時(shí)候,測(cè)試集是不valid的。我之前做過(guò)的一個(gè)DM項(xiàng)目,因?yàn)榉N種原因樣本量非常小,在這種情況下,分割數(shù)據(jù)的時(shí)候只能三選二,也就是只要訓(xùn)練集和驗(yàn)證集,或是訓(xùn)練集和測(cè)試集。但除此之外更大的問(wèn)題是,因?yàn)閿?shù)據(jù)量過(guò)小,只要訓(xùn)練集和驗(yàn)證集/測(cè)試集中的樣本稍有變化,模型的評(píng)估結(jié)果(比如AUC值)就會(huì)有很大的不一樣。也就是說(shuō),單個(gè)評(píng)估結(jié)果不可靠。
針對(duì)這種情況,建議做Bootstrap或Cross Validation,通過(guò)統(tǒng)計(jì)指標(biāo)(平均值,方差等)來(lái)評(píng)估模型。在R里,通過(guò)caret包可以很容易實(shí)現(xiàn)。
6. Deployment
這部分略過(guò):)
結(jié)語(yǔ)
說(shuō)是總結(jié),結(jié)果寫(xiě)的過(guò)程中磕磕碰碰,很多思路理不清楚,句子寫(xiě)不通順,果然要學(xué)習(xí)、要思考的地方還有很多。(笑
再來(lái)就是,打算今后每隔一段時(shí)間就做一次DM總結(jié)。這篇因?yàn)槭堑谝黄?,各種亂七八糟的都想一次寫(xiě)下來(lái),所以內(nèi)容比較多,今后的話題應(yīng)該會(huì)更專,篇幅也不會(huì)那么大。
最后,立個(gè)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.