此文主要用于個人備忘
kaggle 目前是散兵游勇使用真實數據進行機器學習實踐的最佳場所,擁有真實的數據和大量有經驗的參賽者,以及良好的討論共享氛圍。
基于樹的 boosting/ensemble 方法在實戰中取得良好效果,陳天奇提供的高質量的算法實現 xgboost 也使得構建基于該方法的解決方案更加容易高效,很多比賽的獲勝方案都使用了 xgboost 。
本文記錄一個從零開始到最終用 xgboost 給出一個完整模型的全部(簡略但是完整)過程,如果你對機器學習有一些基本概念的了解,但是沒有在真實數據上實戰過,那么本文可能正對你需求,: )。
實戰,Homesite Competition
不聞不若聞之,聞之不若見之;見之不若知之,知之不若行之;學至于行而止矣
-- 荀子
那我們開始一個具體的比賽,Homesite Competition ,這個比賽是保險公司根據以往的用戶信息和保險報價,以及最后是否購買了保險這些數據,希望最后得到一個分類模型,根據用戶信息和報價,預測該用戶是否會購買該單保險。
有很多參賽者會放出自己的代碼供大家參考討論(在 kaggle 中這樣一份供大家共享討論的代碼稱為一個 kernel)。我們從一個簡略但是效果還不錯的基于 xgboost 的代碼開始。
將 Homesite Competition 所需的數據和前面提到的 kernel 代碼下載下來后,各文件的結構大致如下:
如果你已經裝好了 numpy, scikit-learn, pandas, xgboost 等需要的包,那么進入 src 文件夾運行代碼就可以產出一份結果了。
代碼詳解
一行一行詳細的介紹就太啰嗦了,挑一些重要的部分寫上注釋:
讀入數據
首先是導入需要的包,然后讀取數據,查看一下數據大概長什么樣子:
去掉無意義的feature
QuoteNumber 只是用來標識每單生意的一個屬性,沒有任何物理含義,可以放心地從 feature 中去掉,不用擔心影響訓練出的模型效果:
轉換feature到更有物理含義的格式
發現數據中的日期只是 str, 我們需要將它轉為 datetime :
如果我們將 datetime 轉為年月日,則為物理含義更好的 feature:
然后就可以把 datetime 一列去掉了:
檢查缺失值
其實這一步應該更早一點做,不過就本文中涉及的數據倒沒太大影響。
發現數據中確實有缺失值,
看看這些缺失的數據大致在哪兒,長什么樣:
雖然 xgboost 內置了對缺失值的處理,但是更合理的處理方式總是需要具體數據具體分析的,可以看 Detailed Data Cleaning/Visualization 這個kernel里是怎么對缺失值做處理的。
這里先簡單處理一下,把所有缺失值填上一個不太可能出現的取值:
對類別性質的feature做LabelEncode
現實數據中很多特征并不是數值類型,而是類別類型,比如紅色/藍色/白色之類,雖然決策樹天然擅長處理類別類型的特征,但是還是需要我們把原始的字符串值轉為類別編號。
發現train和test中的feature并不一致,train中的QuoteConversion_Flag屬性在test中沒有(這里的QuoteConversion_Flag是表示這一單生意最后是否做成,test_set里當然不應該有這一屬性,不然讓你預測個啥),
而其他的屬性都是一樣的:
對非數值類型的特征做 LabelEncode:
做完之后字符串轉為類別編號:
使用 CV (cross validation) 做 xgb 分類器模型的調參
使用 CV 來調超參,當然參數空間是自己選的:
導出最后的結果:
當然你也可以看看各參數下的模型的表現是怎樣的:
到這里,基本上就完成了該次雖然簡略,但也大體完整的數據分析實戰了。