Data Mining - 10月總結

前言

最近去Kaggle觀摩學習了各路大牛們分享的數據挖掘(DM,Data Mining)思路,收獲頗豐,因此想記錄一下這段時間的一些感悟。

這篇文章主要結合個人實踐經歷和在Kaggle上的學習,依據Guide to Intelligent Data Analysis (Berthold, et al., 2010)提供的CRISP-DM流程圖,梳理一下(我認為的)DM過程中每一步的要點。

有些地方可能理解有偏差或者概括不全,歡迎指正:)

DM流程與要點總結

先上流程圖。

CRISP-DM Process

上圖涵蓋了DM的6大步驟,每個步驟對應有需要思考的一系列問題。以下我僅遵循大步驟的邏輯,各個步驟下涉及的細節可能和圖上的有所不同。

0. 數據收集(Data Collection)

先簡單談談第0步,數據收集。

數據收集并不包含在上面的DM流程里,事實上由于對DM的定義不同,不少書本都把數據收集排除在DM流程之外。這一步主要涉及數據平臺(e.g. hadoop, spark)、開發語言(e.g. c++, java, phthon)等方面的知識,我個人不是太了解,就不細說了。

提數據收集的原因,一是我發現國內不少數據挖掘崗都有涉及到數據收集、數據平臺搭建等工作,二是高質量的數據對后續的分析工作來說實在是太重要了。

研究生期間我給英國某個公司做DM項目,那個公司使用的是第三方的數據系統(非常爛),并且沒有專門的數據工程師/程序員做數據處理和維護,我和小伙伴拿到一堆亂碼的時候真的相當崩潰。也因為這樣,我們當時花了很多力氣來從頭整理數據,耽誤了不少時間。但無論再怎么整理,我們的數據質量始終不高(大量的信息缺失和無法溯源的數據錄入失誤),導致最終模型不太理想。如果數據收集環節能得到把控,結果可能會不一樣。(望天

1. 問題理解(Project Understanding)

準確來說project應該翻譯成「項目」,但一個DM項目的最終目的是解決問題,所以我就直接把這一步譯作「問題理解」了。

我個人認為這一步關鍵是弄明白兩件事:

  • 對方想要得到什么問題的答案
  • 怎么把這個問題數學語言化

前者的關鍵在于「聽」和「問」:聽明白對方說了什么,問清楚對方沒說明白或者沒被挖掘的需求。有時候一個DM項目的需求會很模糊,舉個極端點的例子,比如對方說“我想要產品A和用戶之間的insight”,insight是一個很廣的詞,TA真正想知道的可能是“哪些用戶能帶來更多的利潤”,也有可能是“下個月哪些用戶會繼續購買產品A”。問題稍微不一樣,很可能就會導致完全不同的分析過程。所以一定要先和問題的提出方在需求上達成百分之百的共識,并且需求越詳細越好。

后者考察的是analyst的經驗和功力。在拿到問題/需求的時候,腦子里應該對「這個問題轉換成數學語言是什么」、「能不能實現」、「適合什么分析方法/方向」有初步的把握。舉個簡單例子,現在有一個需求:“我有產品A,我有用戶的歷史購買數據,能不能預測一下下個月每個用戶繼續購買產品A的概率?” 對于這個問題,在著手分析數據之前,一個可能的思路是:這是預測問題,預測的是用戶買產品A的概率,概率介于0和1之間,0代表用戶一定不買產品A,1代表用戶一定買產品A,那么本質上這是二元分類問題,可以通過二元分類算法來實現。

有不少思考框架可以幫助理清問題,比如CLD(Causal Loop Diagram)、Cognitive Map等等。我個人最常用的是思維導圖。

2. 數據理解(Data Understanding)

這一步又叫Exploratory Analysis,意在通過數據分析(如平均值等統計量,各種圖表)來了解手上的數據。(當然啦,有時候數據分析本身就是一個項目。)

數據理解影響分析方法的選取和確立。比如,理解我的目標變量是數值還是文本,是離散的還是連續的,是截面數據還是時間序列。不同的數據類型有不同的分析方法。

與此同時,這一步也是探究數據質量的關鍵:我的數據是否和問題相關,數據是否合理,有無缺失值和異常值等。任何一個環節一旦得到“否”的答案,就需要相應的對策去解決。

很多復雜的DM項目,比如Kaggle里的各種競賽,涵蓋的都是幾百甚至上千兆的數據,有時候還不只一個數據集。這種量級的數據,一開始也許根本懵得無從下手(好啦,指的就是本渣渣我),不花費大量時間去理解、分析,很難察覺出其中的異常點或關聯性。只有對數據十分了解,才有可能在后續步驟做出好的策略(e.g. 變量選取,變量構造,算法選取)。

總而言之,對數據越了解,后續走的彎路越少,項目成功率越高。

3. 數據準備(Data Preparation)

這一步在機器學習中又叫特征工程(Feature Engineering),要考慮的事很多。比如,這些變量(特征)需不需要處理異常值(outliers)?用不用填補缺失值(missing values)?要不要做標準化/歸一化/離散化?哪些變量對我的分析有幫助?需不需要降維?有沒有必要構造新變量?簡而言之就是對數據反復調戲反復處理、轉換,直至可以丟進模型里跑出好結果為止。

這一步有多重要呢,這么說吧,Kaggle上的高分玩家,除去對算法的設計、應用外,數據準備(特征工程)都是做到了極致的。高質量的數據,光是跑benchmark模型都能得到不錯的結果。我最近觀摩的一個DM競賽(已結束),6組數據集,3,000,000+樣本,其中一個用XGBoost做benchmark模型跑出了很好結果的參賽者,用了19個變量,其中18個是構造出來的新變量。

此外,想提一下WoE編碼(Weight of Evidence Encoding)。WoE編碼在提高二元分類模型的性能上,真的屢試不爽。雖然WoE編碼和邏輯回歸是最加拍檔,但用在tree-based模型上,效果也很不錯。但不知道為什么這個東西很少有人談論?

再說說工具。在實際操作一個DM項目的時候,無論是數據理解還是數據準備,都涉及到大量的數據拆分、結合、轉換。就這些方面而言,R的dplyr+caret(對應python的pandas+sklearn)是很好的實現工具。

4. 建模(Modeling)

建模整體上分為兩個方向:一是搭前人輪子造車,二是自行構造算法。后者就不說了,說說前者。

大部分analyst都是依靠已有算法做分析,而能否成功完成一個DM任務,關鍵有兩點:

一,有扎實的理論基礎,對各個類型的DM問題有所了解,對各類DM問題下的各類算法有所了解,知道什么算法對什么類型的數據有效,知道如何調參等。

二是創新能力,很多時候光靠一種算法是解決不了問題的,因為每種算法都有自己的內在缺陷,這個時候就需要組合算法去彌補這些缺陷,即Ensemble Methods,如 Bagging、Boosting、Stacking等,Kaggle里很多冠軍模型都屬于這種情況。(我曾經見過某個冠軍團隊的模型,模型一共疊加了好幾層,而每一層基本都是算法組合,看完我整個人都不好了。)

現在很多analyst喜歡拿XGBoost(Chen & Guestrin, 2016)或者GBM(Friedman, 2001) 做benchmark模型,因為這兩個算法性能很不錯,在數據質量好的前提下,一般都能得到不錯的結果。(我個人感覺這兩個算法比隨機森林要好使;AdaBoost的話之前不知道為什么在我的電腦上跑不起來,所以說不準。) 用好這類模型的關鍵點在于調參,有經驗的analyst和好的計算機是關鍵。

工具方面,R中當之無愧是caret,對應python中的sklearn

5. 評估(Evaluation)

上文的流程圖把這一步定義為對整個DM項目的評估,但這里我想講講模型評估(這個部分在流程圖中被歸到建模那一步里了)。

一般來說,跑模型的時候數據會被分為三部分:訓練集(Training Set)、驗證集(Validation Set)和測試集(Test Set)。訓練集拿來建模,驗證集拿來調參,測試集拿來評估模型性能。

但上述過程存在一個問題:這種方法只適用于數據量大的時候,數據量小的時候,測試集是不valid的。我之前做過的一個DM項目,因為種種原因樣本量非常小,在這種情況下,分割數據的時候只能三選二,也就是只要訓練集和驗證集,或是訓練集和測試集。但除此之外更大的問題是,因為數據量過小,只要訓練集和驗證集/測試集中的樣本稍有變化,模型的評估結果(比如AUC值)就會有很大的不一樣。也就是說,單個評估結果不可靠。

針對這種情況,建議做BootstrapCross Validation,通過統計指標(平均值,方差等)來評估模型。在R里,通過caret包可以很容易實現。

6. Deployment

這部分略過:)

結語

說是總結,結果寫的過程中磕磕碰碰,很多思路理不清楚,句子寫不通順,果然要學習、要思考的地方還有很多。(笑

再來就是,打算今后每隔一段時間就做一次DM總結。這篇因為是第一篇,各種亂七八糟的都想一次寫下來,所以內容比較多,今后的話題應該會更專,篇幅也不會那么大。

最后,立個flag,下一篇一定要比現在有進步。(握拳

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.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容