100多次競賽後,他研發了一個幾乎可以解決所有機器學習問題的框架
作者 | XI YANG
來源 | 知乎(機器學習之路)
一個叫 Abhishek Thakur 的資料科學家,在他的 Linkedin 發表了一篇文章 Approaching (Almost) Any Machine Learning Problem,介紹他建立的一個自動的機器學習框架,幾乎可以解決任何機器學習問題,專案很快也會發布出來。這篇文章迅速火遍 Kaggle,他參加過100多個資料科學相關的競賽,積累了很多寶貴的經驗,看他很幽默地說“寫這樣的框架需要很多豐富的經驗,不是每個人都有這樣的經歷,而很多人有寶貴的經驗,但是他們不願意分享,我呢恰好是又有一些經驗,又願意分享的人”。當然這篇文章也是受到爭議的,很多人覺得並不全面。
我最近也在準備參加 Kaggle,之前看過幾個例子,自己也總結了一個分析的流程,今天看了這篇文章,裡面提到了一些高效的方法,最乾貨的是,他做了一個表格,列出了各個演算法通常需要訓練的引數。
這個問題很重要,因為大部分時間都是通過調節引數,訓練模型來提高精度。作為一個初學者,第一階段,最想知道的問題,就是如何調節引數。因為分析的套路很簡單,就那麼幾步,常用的演算法也就那麼幾個,以為把演算法呼叫一下就可以了麼,那是肯定不行的。實際過程中,呼叫完演算法後,結果一般都不怎麼好,這個時候還需要進一步分析,哪些引數可以調優,哪些資料需要進一步處理,還有什麼更合適的演算法等等問題。
接下來一起來看一下他的框架。
據說資料科學家 60-70% 的時間都花在資料清洗和應用模型演算法上面,這個框架主要針對演算法的應用部分。
Pipeline
什麼是 Kaggle?
Kaggle是一個資料科學競賽的平臺,很多公司會發布一些接近真實業務的問題,吸引愛好資料科學的人來一起解決,可以通過這些資料積累經驗,提高機器學習的水平。
應用演算法解決 Kaggle 問題,一般有以下幾個步驟:
-
第一步:識別問題
-
第二步:分離資料
-
第三步:構造提取特徵
-
第四步:組合資料
-
第五步:分解
-
第六步:選擇特徵
-
第七步:選擇演算法進行訓練
當然,工欲善其事,必先利其器,要先把工具和包都安好。
最方便的就是安裝 Anaconda,這裡麵包含大部分資料科學所需要的包,直接引入就可以了,常用的包有:
-
pandas:常用來將資料轉化成 dataframe 形式進行操作
-
scikit-learn:裡面有要用到的機器學習演算法模型
-
matplotlib:用來畫圖
-
以及 xgboost,keras,tqdm 等。
第一步:識別問題
在這一步先明確這個問題是分類還是迴歸。通過問題和資料就可以判斷出來,資料由 X 和 label 列構成,label 可以一列也可以多列,可以是二進位制也可以是實數,當它為二進位制時,問題屬於分類,當它為實數時,問題屬於迴歸。
第二步:分離資料
為什麼需要將資料分成兩部分?
用 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 0record 2:1 0record 3:0 1
這個過程 sklearn 也可以幫你做到:
from sklearn.preprocessing import LabelEncoder
或者
from sklearn.preprocessing import OneHotEncoder
第四步:組合資料
處理完 Feature 之後,就將它們組合到一起。如果資料是稠密的,就可以用 numpy 的 hstack:
import numpy as npX = np.hstack((x1, x2, ...))
如果是稀疏的,就用 sparse 的 hstack:
from scipy import sparseX = sparse.hstack((x1, x2, ...))
組合之後,就可以應用以下演算法模型:
-
RandomForestClassifier
-
RandomForestRegressor
-
ExtraTreesClassifier
-
ExtraTreesRegressor
-
XGBClassifier
-
XGBRegressor
但是不能應用線性模型,線性模型之前需要對資料進行正則化而不是上述預處理。
第五步:分解
這一步是為了進一步優化模型,可以用以下方法:
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 測試了1 79種分類模型在UCI所有的121個資料上的效能,發現Random Forests 和 SVM 效能最好。
我們可以學習一下里面的調研思路,看看是怎麼樣得到比較結果的,在我們的實踐中也有一定的指導作用。
各演算法比較
但是直接應用演算法後,一般精度都不是很理想,這個時候需要調節引數,最乾貨的問題來了, 什麼模型需要調節什麼引數呢?
雖然在sklearn的文件裡,會列出所有演算法所帶有的引數,但是裡面並不會說調節哪個會有效。在一些mooc課程裡,有一些專案的程式碼,裡面可以看到一些演算法應用時,他們重點調節的引數,但是有的也不會說清楚為什麼不調節別的。這裡作者根據他100多次比賽的經驗,列出了這個表,我覺得可以借鑑一下,當然,如果有時間的話,去對照文件裡的引數列表,再查一下演算法的原理,通過理論也是可以判斷出來哪個引數影響比較大的。
調參之後,也並不就是大功告成,這個時候還是需要去思考,是什麼原因造成精度低的,是哪些資料的深意還沒有被挖掘到,這個時候 需要用統計和視覺化去再一次探索資料,之後就再走一遍上面的過程。
我覺得這裡還提到了很有用的一條經驗是, 把所有的 transformer 都儲存起來,方便在 validation 資料集上面應用:
文章裡介紹了分析問題的思路,還提到了幾條很實用的經驗,不過經驗終究是別人的經驗,只能借鑑,要想提高自己的水平,還是要看到作者背後的事情,就是參加了100多次實戰,接下來就去行動吧,享受用演算法和程式碼與資料玩耍的興奮吧。
原文連結:
https://zhuanlan.zhihu .com/p/61657532
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2658948/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解決機器學習問題的一般流程機器學習
- 面試了8家公司,他們問了我這些機器學習題目......面試機器學習
- OkHttp框架的一個Http500問題解決HTTP框架
- Redis學習的幾個小問題Redis
- 【學習】分享幾個學習中的小問題
- 低程式碼平臺可以解決軟體開發的所有問題嗎
- 機器學習 - 競賽網站,演算法刷題網站機器學習網站演算法
- 關於解決問題的幾個段位
- 對抗式協作:一個框架解決多個無監督學習視覺問題框架視覺
- 如何解決機器學習樹整合模型的解釋性問題機器學習模型
- 用深度學習解決競爭性編碼問題 | DeepMind深度學習
- 機器學習無法解決自然語言理解問題 - thegradient機器學習
- 前端學習(2577):Nuxt解決了什麼問題前端UX
- 完成20個問題後不敢發問題了
- 機器學習 | 八大步驟解決90%的NLP問題機器學習
- 簡明機器學習——01機器學習的幾個基本要素機器學習
- 超詳細!如何準備機器學習競賽?機器學習
- 一圖看懂所有機器學習概念機器學習
- 從 Quora 的 187 個問題中學習機器學習和 NLP機器學習
- 解決所有環境問題
- mysql學習整理所有問題MySql
- 基本操作能解決的問題,不必勞煩機器學習機器學習
- 機器學習-習題(一)機器學習
- 這幾道Java集合框架面試題在面試中幾乎必問Java框架面試題
- 機器學習中比較重要的幾個概念機器學習
- 解決原子性問題?腦海中有這個模型就可以了模型
- 藍橋杯競賽題目:”機器人繁殖“解析及題解機器人
- 一生一芯預學習1 | 如何科學的提問(解決問題)
- 6分鐘瞭解所有機器學習模型機器學習模型
- 一個真實資料集的完整機器學習解決方案(上)機器學習
- 一個真實資料集的完整機器學習解決方案(下)機器學習
- 值得探索的 8 個機器學習 JavaScript 框架機器學習JavaScript框架
- C#開發中,學習整理的 New 的幾個常見問題C#
- 機器學習:迴歸問題機器學習
- 研發了 5 年的時序資料庫,到底要解決什麼問題?資料庫
- AI 回答物理學問題,MIT 開發自動繪製材料相圖機器學習框架AIMIT機器學習框架
- 如何避免學習linux必然會遇到的幾個問題Linux
- 機器學習應用面臨的一些問題機器學習