kaggle比賽實例:房價預測之xgboost調參

自學了半年的python和機器學習,準備嘗試一下Kaggle比賽,選擇了回歸問題的House Prices: Advanced Regression Techniques來練手。

讀入數據後,首先看一下特徵的數量

這裡的數據已經剔除了目標變數SalePrice

一共有79個特徵,下面看一下特徵的類型:

一共有43個分類型變數,33個整數變數和3個浮點型變數,下面對數據進行一個簡單的處理:

  1. 將訓練集和測試集合併
  2. 對分類型變數用get_dummies進行獨熱編碼
  3. 用均值填充缺失值

轉換後,看一下特徵的變化:

可以看到特徵變成了288個,獨熱編碼增加了特徵的維度。

先用xgboost嘗試著跑一下,得到了預測結果preds

接下來用訓練集的數據對模型進行打分:

分數是0.963,還不錯,這裡需要注意的是評分標準r2_score,這裡使用的是XGBRegressor,是回歸模型,所以要選用回歸模型的評分標準,不熟悉評分標準可以查看scikit-learn的文檔

下面開始對模型進行調參,這裡的調參參考了國外網上一片文章的方法Complete Guide to Parameter Tuning in XGBoost (with codes in Python),就是不斷的用GridSearchCV嘗試不同的參數,整個調參過程比較長,特別是在我這台10年買的電腦上運行,速度十分感人......

調參過程如下:

首先導入需要的包

然後定義一個用來評價模型的函數

接下來我們嘗試第一個模型的參數配置,先按經驗值設定參數:

運行完上面的代碼後,得到評分0.9634。

先嘗試對max_depth和min_child_weight調參,下面max_depth實際設置的值是3, 5, 7, 9,min_child_weight是1,3,5

運行完上面的代碼,我們看一下結果如何:

理想的max_depth值為5,min_child_weight值為3。grid_scores_是0.882(注意這和前面的模型評分r2_score不一樣,這裡的grid_scores_是cross-validation scores)在這個值附近再進一步調整,把上下範圍各拓展1,因為之前進行組合的時候,參數調整的步長是2。

運行完上面的代碼,我們看一下新的參數結果如何:

max_depth值為6,min_child_weight值為4時得到了最高分0.884,這比前面的0.882進步了一點,因為第一輪調參已經嘗試過 max_depth值為7,min_child_weight值為5,所以6和4已經是最理想的值

按照這種調參的方法,可以對參數gamma,subsample,colsample_bytree等參數進行調優。最終得到的模型如下:

最後的得分r2_score是0.9919,這個分數比最初的模型0.9634有了一定程度的提高。

下面可以嘗試使用較低的學習速率(減小learning_rate),以及使用更多的決策樹(增大n_estimators),看一下效果,這裡可以直接進行設定,不需要使用GridSearchCV,模型參數如下:

r2_score是 0.9998,比前面又有了提高,至此調參完畢。

用這個模型的得到的預測結果提交到kaggle上,Public leaderbord排名842位,大概是top42%,一天後就滑落到944位,比賽參與的人還是蠻多的。


推薦閱讀:

比賽心路 駕駛行為預測駕駛風險(二)
機器學習篇-數據劃分
機器學習篇-評估機器學習的模型
基於模糊層次綜合評價法和聚類演算法的多人戰鬥競技類遊戲平衡性分析
Facebook如何利用機器演算法人工智慧教計算機閱讀

TAG:機器學習 | 數據挖掘 | Kaggle |