Kaggle爆文:一個框架解決幾乎所有機器學習問題

上周一個叫 Abhishek Thakur 的數據科學家,在他的 Linkedin 發表了一篇文章?Approaching (Almost) Any Machine Learning Problem,介紹他建立的一個自動的機器學習框架,幾乎可以解決任何機器學習問題,項目很快也會發布出來。

?

這篇文章迅速火遍 Kaggle,他參加過100多個數據科學相關的競賽,積累了很多寶貴的經驗,看他很幽默地說“寫這樣的框架需要很多豐富的經驗,不是每個人都有這樣的經歷,而很多人有寶貴的經驗,但是他們不愿意分享,我呢恰好是又有一些經驗,又愿意分享的人”。當然這篇文章也是受到爭議的,很多人覺得并不全面。

?

這篇文章,里面提到了一些高效的方法,最干貨的是,他做了一個表格,列出了各個算法通常需要訓練的參數。

?

這個問題很重要,因為大部分時間都是通過調節參數,訓練模型來提高精度。作為一個初學者,第一階段,最想知道的問題,就是如何調節參數。

?

因為分析的套路很簡單,就那么幾步,常用的算法也就那么幾個,以為把算法調用一下就可以了么,那是肯定不行的。實際過程中,調用完算法后,結果一般都不怎么好,這個時候還需要進一步分析,哪些參數可以調優,哪些數據需要進一步處理,還有什么更合適的算法等等問題。

?

接下來一起來看一下他的框架。

?

據說數據科學家 60-70% 的時間都花在數據清洗和應用模型算法上面,這個框架主要針對算法的應用部分。

?

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

Pipeline

?

什么是 Kaggle?

?

Kaggle是一個數據科學競賽的平臺,很多公司會發布一些接近真實業務的問題,吸引愛好數據科學的人來一起解決,可以通過這些數據積累經驗,提高機器學習的水平。

?

應用算法解決 Kaggle 問題,一般有以下幾個步驟:

?

  • 第一步:識別問題

  • 第二步:分離數據

  • 第三步:構造提取特征

  • 第四步:組合數據

  • 第五步:分解

  • 第六步:選擇特征

  • 第七步:選擇算法進行訓練

?

當然,工欲善其事,必先利其器,要先把工具和包都安好。

最方便的就是安裝 Anaconda,這里面包含大部分數據科學所需要的包,直接引入就可以了,常用的包有:

?

  • pandas:常用來將數據轉化成 dataframe 形式進行操作

  • scikit-learn:里面有要用到的機器學習算法模型

  • matplotlib:用來畫圖

  • 以及 xgboost,keras,tqdm 等。

?

第一步:識別問題

?

在這一步先明確這個問題是分類還是回歸。通過問題和數據就可以判斷出來,數據由 X 和 label 列構成,label 可以一列也可以多列,可以是二進制也可以是實數,當它為二進制時,問題屬于分類,當它為實數時,問題屬于回歸。

?

第二步:分離數據

?

640?wx_fmt=png

?

為什么需要將數據分成兩部分?

?

用 Training Data 來訓練模型,用 Validation Data 來檢驗這個模型的表現,不然的話,通過各種調節參數,模型可以在訓練數據集上面表現的非常出色,但是這可能會是過擬合,過擬合就是太依賴現有的數據了,擬合的效果特別好,但是只適用于訓練集,以致于來一個新的數據,就不知道該預測成什么了。所以需要有 Validation 來驗證一下,看這個模型是在那里自娛自樂呢,還是真的表現出色。

?

在 scikit learn 包里就有工具可以幫你做到這些:

分類問題用 StrtifiedKFold

?

from sklearn.cross_validation import StratifiedKFold

?

回歸問題用 KFold

?

from sklearn.cross_validation import KFold

?

第三步:構造特征

?

這個時候,需要將數據轉化成模型需要的形式。數據有三種類型:數字,類別,文字。當數據是類別的形式時,需要將它的每一類提取出來作為單獨一列,然后

?

用二進制表示每條記錄相應的值。例如:

record 1: 性別 女
record 2:性別 女
record 3:性別 男

?

轉化之后就是:

女 男
record 1: 1 0
record 2:1 0
record 3:0 1

這個過程 sklearn 也可以幫你做到:

?

from sklearn.preprocessing import LabelEncoder

?

或者

?

from sklearn.preprocessing import OneHotEncoder

?

第四步:組合數據

?

處理完 Feature 之后,就將它們組合到一起。
如果數據是稠密的,就可以用 numpy 的 hstack:

?

import numpy as np

X = np.hstack((x1, x2, ...))

?

如果是稀疏的,就用 sparse 的 hstack:

?

from scipy import sparse

X = sparse.hstack((x1, x2, ...))

?

組合之后,就可以應用以下算法模型:

?

  • RandomForestClassifier

  • RandomForestRegressor

  • ExtraTreesClassifier

  • ExtraTreesRegressor

  • XGBClassifier

  • XGBRegressor

?

但是不能應用線性模型,線性模型之前需要對數據進行正則化而不是上述預處理。

?

第五步:分解

?

這一步是為了進一步優化模型,可以用以下方法:

640?wx_fmt=png

?

PCA:Principal components analysis,主成分分析,是一種分析、簡化數據集的技術。用于減少數據集的維數,同時保持數據集中的對方差貢獻最大的特征。

?

from sklearn.decomposition import PCA

?

對于文字數據,在轉化成稀疏矩陣之后,可以用 SVD

?

from sklearn.decomposition import TruncatedSVD

?

SVD:Singular Value Decomposition,奇異值分解,是線性代數中一種重要的矩陣分解,它總能找到標準化正交基后方差最大的維度,因此用它進行降維去噪。

?

第六步:選擇特征

?

當特征個數越多時,分析特征、訓練模型所需的時間就越長,容易引起“維度災難”,模型也會越復雜,推廣能力也會下降,所以需要剔除不相關或亢余的特征。

常用的算法有完全搜索,啟發式搜索,和隨機算法。

?

例如,Random Forest:

?

from sklearn.ensemble import RandomForestClassifier

?

或者 xgboost:

?

import xgboost as xgb

?

對于稀疏的數據,一個比較有名的方法是 chi-2:

?

?

from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2

?

第七步:選擇算法進行訓練

選擇完最相關的參數之后,接下來就可以應用算法,常用的算法有:

?

Classification:
Random Forest
GBM
Logistic Regression
Naive Bayes
Support Vector Machines
k-Nearest Neighbors

Regression
Random Forest
GBM
Linear Regression
Ridge
Lasso
SVR

?

在scikit-learn里可以看到分類和回歸的可用的算法一覽,包括它們的原理和例子代碼。在應用各算法之前先要明確這個方法到底是否合適。

?

為什么那么多算法里,只提出這幾個算法呢,這就需要對比不同算法的性能了。

這篇神文?Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?測試了179種分類模型在UCI所有的121個數據上的性能,發現Random Forests 和 SVM 性能最好。

我們可以學習一下里面的調研思路,看看是怎么樣得到比較結果的,在我們的實踐中也有一定的指導作用。

?

640?wx_fmt=png

各算法比較

?

但是直接應用算法后,一般精度都不是很理想,這個時候需要調節參數,最干貨的問題來了,什么模型需要調節什么參數呢?

?

640?wx_fmt=png

?

雖然在sklearn的文檔里,會列出所有算法所帶有的參數,但是里面并不會說調節哪個會有效。在一些mooc課程里,有一些項目的代碼,里面可以看到一些算法應用時,他們重點調節的參數,但是有的也不會說清楚為什么不調節別的。

?

這里作者根據他100多次比賽的經驗,列出了這個表,我覺得可以借鑒一下,當然,如果有時間的話,去對照文檔里的參數列表,再查一下算法的原理,通過理論也是可以判斷出來哪個參數影響比較大的。

?

調參之后,也并不就是大功告成,這個時候還是需要去思考,是什么原因造成精度低的,是哪些數據的深意還沒有被挖掘到,這個時候需要用統計和可視化去再一次探索數據,之后就再走一遍上面的過程。

?

我覺得這里還提到了很有用的一條經驗是,把所有的 transformer 都保存起來,方便在 validation 數據集上面應用:

?

640?wx_fmt=png

?

?

?

轉載于:https://www.cnblogs.com/caodneg7/p/10292648.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387553.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# HttpWebRequest GET HTTP HTTPS 請求

這個需求來自于我最近練手的一個項目,在項目中我需要將一些自己發表的和收藏整理的網文集中到一個地方存放,如果全部采用手工操作工作量大而且繁瑣,因此周公決定利用C#來實現。在很多地方都需要驗證用戶身份才可以進行下一步操作,…

HttpStatusCode

https://docs.microsoft.com/en-us/dotnet/api/system.net.httpstatuscode?viewnetframework-4.7.2 422 UnprocessableEntity What HTTP status response code should I use if the request is missing a required parameter? Status 422 seems most appropiate based on the…

numpy 和tensorflow 中的乘法

矩陣乘法:tf.matmul() np.dot() , 逐元素乘法:tf.multiply() np.multiply()轉載于:https://www.cnblogs.com/lizhiqing/p/10307760.html

啟用了不安全的HTTP方法

安全風險:可能會在Web 服務器上上載、修改或刪除Web 頁面、腳本和文件。可能原因:Web 服務器或應用程序服務器是以不安全的方式配置的。修訂建議:如果服務器不需要支持WebDAV,請務必禁用它,或禁止不必要的HTTP 方法。方…

Mysql學習總結(4)——MySql基礎知識、存儲引擎與常用數據類型

2019獨角獸企業重金招聘Python工程師標準>>> 1、基礎知識 1.1、數據庫概述 簡單地說:數據庫(Database或DB)是存儲、管理數據的容器;嚴格地說:數據庫是“按照某種數據結構對數據進行組織、存儲和管理的容器”…

django權限二(多級菜單的設計以及展示)

多級權限菜單設計級標題欄 我們現在只有數據展示,要進入其他url還需要手動的輸入路徑,非常的麻煩,所以我們要設計 一個導航欄以及側邊多級菜單欄,這個展示是通過stark組件的設計的增刪改查頁面,而 每一個 頁面我們都需要有導航欄和側邊的權限菜單欄,所以把這個公共的部分提起到…

6.17 dokcer(一)Compose 簡介

Compose 簡介 Compose 項目是 Docker 官方的開源項目,負責實現對 Docker 容器集群的快速編排。從功能上看,跟 OpenStack 中的 Heat 十分類似。 其代碼目前在 https://github.com/docker/compose 上開源。 Compose 定位是 「定義和運行多個 Docker 容器的…

【系統架構理論】一篇文章精通:Spring Cloud Netflix Eureka

是官方文檔的總結 http://spring.io/projects/spring-cloud-netflix#overview 講解基于2.0.2版本官方文檔 https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.0.2.RELEASE/single/spring-cloud-netflix.html Netflix提供了以下功能: 服務發現&am…

Flink DataStream 編程入門

流處理是 Flink 的核心,流處理的數據集用 DataStream 表示。數據流從可以從各種各樣的數據源中創建(消息隊列、Socket 和 文件等),經過 DataStream 的各種 transform 操作,最終輸出文件或者標準輸出。這個過程跟之前文…

騰訊手游如何提早揭露游戲外掛風險?

目前騰訊SR手游安全測試限期開放免費專家預約!點擊鏈接:手游安全測試立即預約! 作者:sheldon,騰訊高級安全工程師 商業轉載請聯系騰訊WeTest獲得授權,非商業轉載請注明出處。 文中動圖無法顯示&#xff0c…

基于ARM Cortex-M0+ 的Bootloader 參考

源: 基于ARM Cortex-M0內核的bootloader程序升級原理及代碼解析轉載于:https://www.cnblogs.com/LittleTiger/p/10312784.html

小猿圈web前端之網站性能優化方案

現在前端不僅要能做出一個網站頁面,還要把這個頁面做的炫酷,那需要很大程度的優化,那么怎么優化才更好呢?小猿圈總結了一下自己優化的方案,感興趣的朋友可以看一下。一般網站優化都是優化后臺,如接口的響應…

下面介紹一個開源的OCR引擎Tesseract2。值得慶幸的是雖然是開源的但是它的識別率較高,并不比其他引擎差勁。網上介紹Tessnet2也是當時時間排名第三的識別引擎,只是后來慢慢不維護了,目前是G

下面介紹一個開源的OCR引擎Tesseract2。值得慶幸的是雖然是開源的但是它的識別率較高,并不比其他引擎差勁。網上介紹Tessnet2也是當時時間排名第三的識別引擎,只是后來慢慢不維護了,目前是Google在維護,大家都知道Google 在搞電子…

js 更改json的 key

let t data.map(item > {return{fee: item[費用],companyName1: item.companyName,remark1: item.remark,beginTime1: item.beginTime,endTime1: item.endTime}})console.log(t) 源地址:https://www.cnblogs.com/Marydon20170307/p/8676611.html轉載于:https:/…

1.4版本上線(第八次會議)

在小組成員連夜趕工的奮斗下,終于在昨天深夜成功實現了UI界面功能 至此,我們的系統終于真正可實用而不是局限在命令行進行互動了 由于python嵌入數據庫功能實現難度較大,迫于時間的局限性,我們選擇了用json文件與txt文件進行替代&…

分UV教程

第一步 首先,打開一個練習場景“空中預警機1.max”(這事小弟平時的練習做的不好獻丑了)。(圖01) 圖01 第二步 這里我們拿機翼來舉例子,隱藏除機翼意外的其他模型。(圖02) 圖02 第三步…

k8s系列--- dashboard認證及分級授權

http://blog.itpub.net/28916011/viewspace-2215214/ 因版本不一樣,略有改動 Dashboard官方地址: https://github.com/kubernetes/dashboard dashbord是作為一個pod來運行,需要serviceaccount賬號來登錄。 先給dashboad創建一個專用的認證信息…

JAVA項目開發

16年java軟件開發經驗,全職項目開發,項目可簽合同、開普票和專票。 主要承接項目: 1、網站開發項目 自主開發千帆CMS動態發布系統,基于java/springboot2/jpa/easyui開發,簡單易用,后臺與前端分離&#xff0…

3dmax基本操作

1、基本操作平移視圖(你所說的移動):CTRLP,或者用,滾輪。按住鼠標滾輪不放拖動,就行了。旋轉: ALT滾輪。按住ALT鍵不放,利用滾輪的移動(滾輪也要按著不放&#xff09…

padding影響整個div的實際寬度

padding影響整個div的實際寬度 1.不讓padding影響整個div的實際寬度 所以要設置css屬性: box-sizing:box-sizingposted on 2019-01-25 16:58 玉貔貅 閱讀(...) 評論(...) 編輯 收藏 轉載于:https://www.cnblogs.com/yupixiu/p/10320564.html