自主機器學習工具:MLBox

自主機器學習工具:MLBox

來自專欄機器學習碎碎念4 人贊了文章

前言:開這個專欄的目的是為了記錄一些平時看到的和機器學習相關有意思的東西,一方面不至於過目即忘,從而加深自己的印象和理解;另一方面也可以通過文字的方式與看到文章的朋友分享。若有大牛點評與指正,更是不勝感激。開專欄並不代表自己已經學的很好了,反而是提醒自己離真正的「專欄」還有很長的路要走。登高者必自卑,遠行者必自邇。


在2017年年末的時候,Analytics Vidhya網站發布了其上讀者閱讀量最多的十一篇文

章,其中一篇名為「Tutorial on Automated Machine Learning using MLBox」的文章提到

一個叫MLBox的東西。這篇文章作者提到一個有趣的現象:在他與一位朋友解決一個實際問

題(類似Kaggle)時,他朋友花了8小時對數據進行各種處理並提交預測結果後leaderboard

排名為219;而他僅僅用了8行代碼(不知道他朋友能否承受8小時與8行代碼的對比,求他朋

友的心理陰影面積...)就獲得了108的排名。

他提到說自己使用了一個叫MLBox的庫。我也是第一次聽說這玩意兒,所以在這裡和大

家分享一下他文章里對MLBox的介紹。這裡只對要點進行概括,如果想看原文請轉至:

Tutorial on Automated Machine Learning using MLBox?

www.analyticsvidhya.com圖標

這篇文章的總結分為以下幾部分:

  1. MLBox的作用及特點
  2. MLBox的流程(Pipeline)
  3. MLBox搭建預測回歸模型
  4. MLBox的優缺點及一些概念理解

1 MLBox的作用及特點

定義:「MLBox is a powerful Automated Machine Learning Python library"

作用:

  • 快速閱讀和分散式數據預處理/清理/格式化
  • 高度穩定的功能選擇和泄漏檢測
  • 精確的高維度超參數優化
  • 最先進的分類和回歸預測模型(如Deep learning,Stacking,LGBM等)
  • 在預測同時能夠對模型進行解釋

特點:

  • 漂移識別(Drift Identification):使訓練集的分布和測試集相類似
  • 實體嵌入(Entity Embedding):一種類別特徵(categorical features)編碼技術
  • 超參數優化

2 MLBox的流程(Pipeline)

預處理:使用mlbox.preprocessing中的方法

讀入並清理數據

from mlbox.preprocessing import *#1 創建Reader類,當讀入的是csv文件時使用逗號作為分隔符s=","r=Reader(s)#2 給定訓練集和測試集文件路徑,及訓練集中的目標變數path=["訓練集所在路徑","測試集所在路徑 "]target_name="訓練集中目標變數名"#3 對訓練集和測試集進行清理,該清理過程主要有:刪除無名列、重複數據及提取日期特徵data=r.train_test_split(path,target_name)

移除漂移變數(漂移變數概念文末給出)

#1 創建Drift_thresholder類dft=Drift_thresholder()#2 移除漂移變數data=dft.fit_transform(data)

優化:使用mlbox.preprocessing中的方法對以下四個方面進行優化

  • 缺失值編碼:數值策略(利用均值,中位數等填充continuous column)和類別策略(利用nan等填充categorical column)
  • 類別數據編碼:label_encoding, dummification(就是one-hot編碼啦,pandas中的get_dummies), random_projection, entity_embedding(實體嵌入)
  • 特徵選擇:利用L1(就是大家熟知可以拿來進行特徵選擇的Lasso),方差,隨機森林等,以及閾值來選擇
  • 演算法選擇:選擇空間包括LGBM,xgboost等等

舉個例子:使用LightGBM作為基本演算法,其最大深度可選範圍是[3,5,7,9],n_estimators的

可選範圍是[250,500,700,1000],特徵選擇評估範圍是[variance, l1, random forest

feature importance],缺失值填充方法為mean、median和NAN,類別變數編碼器可選為

label encoding, entity embedding and random projection。

在上述情況下,令變數space為:

space={ne__numerical_strategy:{"search":"choice","space":[mean,median]},ne__categorical_strategy:{"search":"choice","space":[np.NaN]},ce__strategy:{"search":"choice","space":[label_encoding,entity_embedding,random_projection]},fs__strategy:{"search":"choice","space":[l1,variance,rf_feature_importance]},fs__threshold:{"search":"uniform","space":[0.01, 0.3]},est__max_depth:{"search":"choice","space":[3,5,7,9]},est__n_estimators:{"search":"choice","space":[250,500,700,1000]}}

優化過程設置的最後一步就是確定優化器(Optimiser)並得到最優參數

#對於分類問題,評估指標可以為:#"accuracy", "roc_auc", "f1", "log_loss", "precision", "recall"#對於回歸問題,評估指標可以為:#"mean_absolute_error", "mean_squarred_error", "median_absolute_error"#設置Optimizer, n_folds表示n折交叉驗證。類似tf.train.Optimizeropt=Optimiser(scoring="accuracy",n_folds=5)#得到最佳超參數bestbest=opt.optimise(space,data,40)

預測:利用mlbox.prediction

#pred保存了特徵重要性,漂移變數的係數和最終的預測結果pred=Predictor()pred.fit_predict(best,data)

3 MLBox搭建預測回歸模型

這裡作者用到了Big Marts sales problem這個數據集,目標就是預測某一物品的出口價格。

我們來看看是怎麼用7行代碼解決問題的,結果在Public Leaderboard上排名108(top 1%)

有點不敢相信自己的眼睛...

# 導入mlbox包from mlbox.preprocessing import *from mlbox.optimisation import *from mlbox.prediction import *# 讀取訓練集和測試集df=Reader(sep=",").train_test_split([train.csv,test.csv],Item_Outlet_Sales)# 移除漂移變數df=Drift_thresholder().fit_transform(df)# 設定超參數取值範圍space={ne__numerical_strategy:{"search":"choice","space":[mean,median]},ne__categorical_strategy:{"search":"choice","space":[np.NaN]},ce__strategy:{"search":"choice","space":[label_encoding,entity_embedding,random_projection]},fs__strategy:{"search":"choice","space":[l1,variance,rf_feature_importance]},fs__threshold:{"search":"uniform","space":[0.01, 0.3]},est__max_depth:{"search":"choice","space":[3,5,7,9]},est__n_estimators:{"search":"choice","space":[250,500,700,1000]}}# 計算最佳超參數best=Optimiser(scoring="mean_squared_error",n_folds=5).optimise(space,df,40)# 對測試集進行預測Predictor().fit_predict(best,df)

下圖是通過LGBM計算得到的特徵重要性:

thats it

4 MLBox優缺點及一些概念的理解

優點:

  • 自動識別回歸分類任務
  • 對數據自動進行基本預處理
  • 漂移變數的去除
  • 速度快,超參數找的准
  • 多樣的特徵選擇方法
  • 最少的代碼量
  • 通過實體嵌入進行特徵工程

缺點:

  • 仍處在活躍的開發階段
  • 不支持無監督學習
  • 只能進行最基本的特徵工程,大多數情況下仍需要人工干預
  • 有同時移除有用變數的風險
  • 並不是真正意義上的自動機器學習工具

一些概念的理解:

漂移(Drift)

概括一下就是訓練集和測試集的數據不滿足獨立同分布。另外還有數據內部的漂移現象,分為

covariate shift(在Batch Normalization論文里出現過)和concept shift

covariate shift的解釋曾在一個博客上看到過:

假設q1(x)是測試集中一個樣本點的概率密度,q0(x)是訓練集中一個樣本點的概率密

度。最終我們估計一個條件概率密度p(y|x,θ),它由x和一組參數θ={θ1,θ2......θm}所決定。對於一組參數來說,對應loss(θ)函數評估性能的好壞。

當我們找出在q0(x)分布上最優的一組θ時,能否保證q1(x)上測試時也最好呢?

傳統機器學習假設訓練集和測試集是獨立同分布的,即q0(x)=q1(x),所以可以推出最優θ依然可以保證q1(x)最優。但現實當中這個假設往往不成立,伴隨新數據產生,老數據會過時,當q0(x)不再等於q1(x)時,就被稱作covariate shift

作者給出的這張圖比較容易明白(可以看出covariate shift對應的中間這張圖中,虛線位置與

左邊的圖相比並未改變,而只是紅綠點群各自分布的改變,原文是「 independent features

changes」;但是右邊的concept shift就不同了,它指的是「the relationship between the

independent and dependent features change」):

漂移現象的解決方法:

實體嵌入(Entity Embedding):

來源於word2vec, 例如,可以用下面這種方式展示詞的矢量化表達。類似地,類別變數可以

被編碼來產生新的信息。在Kaggles Rossmann Sales Problem(銷售預測問題競賽)中,

其中一個團隊使用了實體嵌入和神經式網路,在沒有進行其他任何重要的特徵工程的情況下排

名第三。實體嵌入能夠捕獲德國各州之間的關係,如下所示:

上述提到的使用Entity Embedding方法的比賽主頁:Rossmann Store Sales | Kaggle,裡面

給出了源代碼地址:entron/entity-embedding-rossmann

其中的個別概念沒有深入探討,如果有興趣可以自行搜索相關文獻或博客。希望對大家有幫助

(註:封面圖片攝於杭州市拱墅區小河直街歷史文化街。昨天花了一個晚上讀了東野圭吾的新

書《假面山莊》(第一次讀他的書),最後的反轉有點意思,不過感覺故事和人物的設計仍有

瑕疵,接下去還有兩本阿婆的推理小說等著我!)

推薦閱讀:

智能知識發現將徹底改變數據分析方式
雨沐田:數據分析的目的 和 數據可視化
兩個月總結
使用python進行數據分析
新手想要做好數據分析的工作,需要掌握這些典型數據可視化圖表

TAG:機器學習 | 數據分析 |