1. 程式人生 > >Kaggle機器學習實戰總結

Kaggle機器學習實戰總結

專 欄

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

❈王勇,Python中文社群專欄作者,目前感興趣專案商業分析、Python、機器學習、Kaggle。17年專案管理,通訊業幹了11年專案經理管合同交付,製造業幹了6年專案管理:PMO,變革,生產轉移,清算和資產處理。MBA, PMI-PBA, PMP。❈

2017年就要過去,這一年我花了很多業餘時間在學習Python 和機器學習,主要的方法就是在Kaggle 上面刷各種比賽。2017年就要過去,就以此文作為,我在2017年的機器學習的一個告別文章。

在開篇文章- 原理中,我談到了要:

1、總結的搭積木式刷分大法。(即,利用Pandas 的Pipe 和 Sklearn的 Pipeline)

Pandas 的Pipe 在第二篇文章中已經介紹。本文將主要介紹 Sklearn 的Pipeline. Pipeline和 Gridsearch 或RandomedSearch 聯合使用,可以組合多個轉換和預測的演算法,並且可以調參,選演算法。 後文會說明。注:後文用Gridsearch 泛指(Gridsearch 或RandomedSearch)

2、特徵工程中做法的自我理解。(例如:為什麼要Log transfer,正態化等)

LogTransfer 在第二篇文章也已經介紹。本文也會談到正態化。正態化有多種方法,StandardScaler(均值為0,標準差為1), RobustScaler(針對Outlier作了特別處理)等

3、將自己碰到的問題(特徵工程導致的過擬合)分享出來,求高人解惑

這個問題主要是資料洩露的問題。在訓練集中作了一個新特徵(每平米單價),本地CV, 結果RMSE非常好(0.05 左右)。PB的成績就非常差(0.3左右). 主要原因是簡單的利用了銷售價格來產生新特徵,通常這種做法,即降低了泛化成績,也是不可取的。

SkLearn的PipLine簡介

如果說Pandas的Pipe是蒸汽火車的話,Sklearn的Pipeline就是電力火車加上排程中心。火車是各種演算法,排程中心讓火車的演算法按照順序進行,不多也不少,不快也不慢。

0?wx_fmt=jpeg

在資料準備好後訓練時,最基本的就是要調整超參(Hypter Parameter),耗時耗力,並且會發生錯誤和遺漏情況。

我自己和Stackoverflow上常見的演算法訓練錯誤有:

1、演算法預測的結果差異非常大。 其中一個可能就是訓練時的標準化步驟,在預測時遺漏了。 
2、演算法的調參結果差異非常大。(有的是0.01,有的就是10)。其中的一個可能就是不同的訓練步驟中採用的標準化演算法不同(例如,一次用了StandardScaler, 另一次用了RobustScaler) 
3、此外,繁多的超引數調整起來異常繁瑣。比較容易錯誤或者寫錯。

我的解決方法: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的流程圖也給出了完全一樣的建議。 下次看看這張圖,可以節約許多時間和精力。

0?wx_fmt=jpeg

如上圖: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的檢測,統計工程方法

  • 分佈檢測等

Python中文社群將在元旦節進行免費送書活動,

歡迎關注!

長按掃描下方二維碼,

關注“程式設計狗”

640?wx_fmt=jpeg

編  程  狗

程式設計大牛技術分享平臺

Python 中 文 社 區

Python中文開發者的精神部落

合作、投稿請聯絡微信:

pythonpost

— 人生苦短,我用Python —

640?wx_fmt=jpeg