Kaggle HousePrice : LB 0.11666(前15%), 用搭積木的方式(3.實踐-訓練、調參和Stacking)
關鍵詞:
機器學習, Kaggle, 調參,泛化,Sklearn Pipeline,線形回歸,標準化,Cross Validation, GridSearch, RandomedSearch
本文預計閱讀時間15分鐘。 假設讀者對機器學習,線形回歸有一定了解。
首先,
非常感謝大家 對Kaggle House Price 之積木刷分法分享系列文章喜歡,你們的贊和評論是本文沒有太監的主要原因。
2017年就要過去,這一年我花了很多業餘時間在學習Python 和機器學習,主要的方法就是在Kaggle 上面刷各種比賽。2017年就要過去,就以此文作為,我在2017年的機器學習的一個告別文章。
在開篇文章- 原理中,我談到了要:
- 總結的搭積木式刷分大法。(即,利用Pandas 的Pipe 和 Sklearn的 Pipeline)
Pandas 的Pipe 在第二篇文章中已經介紹。本文將主要介紹 Sklearn 的Pipeline. Pipeline和 Gridsearch 或RandomedSearch 聯合使用,可以組合多個轉換和預測的演算法,並且可以調參,選演算法。 後文會說明。註:後文用Gridsearch 泛指(Gridsearch 或RandomedSearch)
- 特徵工程中做法的自我理解。(例如:為什麼要Log transfer,正態化等)
LogTransfer 在第二篇文章也已經介紹。本文也會談到正態化。正態化有多種方法,StandardScaler(均值為0,標準差為1), RobustScaler(針對Outlier作了特別處理)等
將自己碰到的問題(特徵工程導致的過擬合)分享出來,求高人解惑
這個問題主要是數據泄露的問題。在訓練集中作了一個新特徵(每平米單價),本地CV, 結果RMSE非常好(0.05 左右)。PB的成績就非常差(0.3左右). 主要原因是簡單的利用了銷售價格來產生新特徵,通常這種做法,即降低了泛化成績,也是不可取的。
簡介SkLearn 的PipeLine
如果說Pandas 的Pipe是蒸汽火車的話,Sklearn的 Pipeline就是電力火車加上調度中心。火車是各種演算法,調度中心讓火車的演算法按照順序進行,不多也不少,不快也不慢。
在數據準備好後訓練時,最基本的就是要調整超參(Hypter Parameter).耗時耗力,並且和發生錯誤和遺漏情況。
我自己和Stackoverflow上常見的演算法訓練錯誤有:
- 演算法預測的結果差異非常大。 其中一個可能就是訓練時的標準化步驟,在預測時遺漏了。
- 演算法的調參結果差異非常大。(有的是0.01,有的就是10)。其中的一個可能就是不同的訓練步驟中採用的標準化演算法不同(例如,一次用了StandardScaler, 另一次用了RobustScaler)
- 此外,繁多的超參數調整起來異常繁瑣。比較容易錯誤或者寫錯。
我的解決方法:Pipeline + Gridsearch + 參數字典 + 容器。
使用Pipeline的例子
針對線形回歸問題,Sklearn提供了超過15種回歸演算法。利用Pipeline 大法可以綜合測試所有演算法,找到最合適的演算法。 具體步驟如下:
1。初始化所有希望調測線形回歸。
2。建立一個字典容器。{"演算法名稱":[初始演算法對象,參數字典,訓練好的Pipeline模型對象,CV的成績}
3。在調參步驟,將初始演算法用Pipeline包裝起來,利用Gridsearch進行調參。調參完成後可以得到針對相應的CV而獲得的最後模型對象。 例如: lasso 演算法的步驟如下:
- 包裝 pipe=Pipeline([("scaler":None),("selector":None),("clf":Lasso())
- Pipe就是剛剛包裝好的演算法。可以直接用於 訓練(fit)和預測(predict)
- 使用Pipe來處理訓練集和測試集可以避免錯誤和遺漏,提高效率。
- 但是Pipe中演算法是默認的參數,直接訓練出的模型RMSE不太理想。(例如:local CV, 0.12~0.14左右)。這是可以考慮調參。
- 調參第一步:準備參數字典:
- Params_lasso ={
- "Scaler":[RobustScaler(),StandardScaler()], #兩個標準化演算法供調模型
- "selector__threshold":np.logspace(-5,-4,3), #3個選擇門限供選特徵
- "clf__alpha":np.logspace(-5,-1,10) , #10個alpha指供調參
- 調參第二步:暴力調參和生成模型 rsearch = GridSearchCV(pipe, param_grid=Params_lasso,scoring ="neg_mean_squared_error",verbose=verbose,cv=10,refit =True)
- GridSearch 是暴力調參。遍歷所有參數組合,另外有一個RandomedSearch 可以隨機選擇參數組合,縮短調參時間,並且獲得近似的調參性能
- Pipe就是剛剛包裝好的演算法。GridSearch把可選的參數和演算法(放入,或者更好的組合。
- 調參的訓練標準是「"neg_mean_squared_error", RMSE的負數。 這種處理方法,讓最大值稱為最小的MSE指。只需要對結果做一次np.sqrt( 結果負數)就能獲得RMSE值。
- cv=10. Cross Validate 數據集為9:1。數據集小的情況,例如House Price. 3折和10折結果甚至比調參差異還大。
- refit =True. 在調參完成後,再做一次所有數據集的fit. 生成完整的訓練模型
House Price 線形回歸演算法 比較
儘管我自己花了大量時間嘗試了所有的Sklearn回歸演算法,得出了Lasso,Ridge, Elasticnet,SVM和GradientBoost是RMSE成績最好的演算法。其實這個結果在Kaggle 上面大多數選手也是用了這些演算法,並且Sklearn的流程圖也給出了完全一樣的建議。 下次看看這張圖,可以節約許多時間和精力。
如上圖:House Price 數據不到5000個樣本,不用SGD.
如果某些特徵比較重要,就用Lasso, ElasticNet。
如果不能確定,就用Ridge,SVR的線形模式
效果不好,再加上SVR的高斯內核(RBF)或者集成模式(隨機森林,XGBoost或者LightGMB)
回歸問題之所有,優選Lasso,Elasticnet, Ridge, SVR(線形核)。 Sklearn沒有給出解釋。最近,我在一本Python 機器學習預測演算法核心中看的觀點是:
- 商業需要:量化交易,在線廣告業務中線形回歸演算法提供的高速性能和近乎最優解得性能。 在按秒來計算的業務中,線形回歸演算法是必須的選項。
- 測試迭代需求:通常一個商業問題,需要做100~200個模型。在幾十萬數據量時,線形演算法只要花幾分鐘可以得到近似最優解,而集成演算法往往要幾個小時甚至幾天。線形演算法可以用來快速過來大部分表現不佳的模型。
此外:sklearn的線形演算法利用了BLAS演算法庫。效率和集成演算法相比是十幾倍的提高。例如:在做CrossValidate, Lasso只需要20秒左右,而GradientBoost等集成演算法需要約200~300秒左右。
關於House Price,我在Kaggle 上面看到了兩個信息非常有啟發意義:
1。Lasso model for regression problem 在做好特徵工程後,只用Lasso 就獲得了0.117的方法
2. Multivariate_Data_Analysis_(7th_edition):HousePrice的冠軍得主說這本書提供了非常好的參考。 這是一個基於統計的商業分析書。相對一般的機器學習書,此書比較有深度,但又不知是理論推導。其中對數據,分布,離群點不但提供了原理推導,還提供了多種工程方法去假設和驗證。 最棒的是,經驗法則。例如:
- missing date 多餘50%時候怎麼處理, 少於10%怎麼處理。 是隨機的missing data還是有規律的, 如何檢測。
- outlier的檢測,統計工程方法
- 分布檢測等
自己寫的程序,比較零亂。 已經放到Kaggle 上面了,下面是鏈接。 註:在Baseline訓練時,SVR之前都比較快,LGBM,XGB等九比較慢了。
https://www.kaggle.com/wangyong101/for-zhihu-sharing-only/相關文章:
1個擲硬幣問題,4個Python解法:讀書筆記
Kaggle HousePrice : (前15%),(2.實踐-特徵工程部分-之上古魔法-統計檢驗)
Kaggle HousePrice : LB 0.11666(前15%), 用搭積木的方式(2.實踐-特徵工程部分)
Kaggle HousePrice : LB 0.11666(排名前15%), 用搭積木的方式(1.原理)
分享是對自己最好的投資
祝大家新年快樂!
王勇
推薦閱讀: