一個框架解決幾乎所有機器學(xué)習(xí)問題

上周一個叫 Abhishek Thakur 的數(shù)據(jù)科學(xué)家围来,在他的 Linkedin 發(fā)表了一篇文章 Approaching (Almost) Any Machine Learning Problem变丧,介紹他建立的一個自動的機器學(xué)習(xí)框架伶氢,幾乎可以解決任何機器學(xué)習(xí)問題,項目很快也會發(fā)布出來拯腮。這篇文章迅速火遍 Kaggle,他參加過100多個數(shù)據(jù)科學(xué)相關(guān)的競賽夹姥,積累了很多寶貴的經(jīng)驗咬摇,看他很幽默地說“寫這樣的框架需要很多豐富的經(jīng)驗,不是每個人都有這樣的經(jīng)歷司致,而很多人有寶貴的經(jīng)驗拆吆,但是他們不愿意分享,我呢恰好是又有一些經(jīng)驗脂矫,又愿意分享的人”枣耀。當然這篇文章也是受到爭議的,很多人覺得并不全面庭再。

我最近也在準備參加 Kaggle捞奕,之前看過幾個例子,自己也總結(jié)了一個分析的流程拄轻,今天看了這篇文章颅围,里面提到了一些高效的方法,最干貨的是恨搓,他做了一個表格院促,列出了各個算法通常需要訓(xùn)練的參數(shù)。

這個問題很重要斧抱,因為大部分時間都是通過調(diào)節(jié)參數(shù)常拓,訓(xùn)練模型來提高精度。作為一個初學(xué)者辉浦,第一階段墩邀,最想知道的問題,就是如何調(diào)節(jié)參數(shù)盏浙。因為分析的套路很簡單眉睹,就那么幾步荔茬,常用的算法也就那么幾個,以為把算法調(diào)用一下就可以了么竹海,那是肯定不行的慕蔚。實際過程中,調(diào)用完算法后斋配,結(jié)果一般都不怎么好孔飒,這個時候還需要進一步分析,哪些參數(shù)可以調(diào)優(yōu)艰争,哪些數(shù)據(jù)需要進一步處理坏瞄,還有什么更合適的算法等等問題。

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

據(jù)說數(shù)據(jù)科學(xué)家 60-70% 的時間都花在數(shù)據(jù)清洗和應(yīng)用模型算法上面鸠匀,這個框架主要針對算法的應(yīng)用部分。

Pipeline

什么是 Kaggle逾柿?
Kaggle是一個數(shù)據(jù)科學(xué)競賽的平臺缀棍,很多公司會發(fā)布一些接近真實業(yè)務(wù)的問題,吸引愛好數(shù)據(jù)科學(xué)的人來一起解決机错,可以通過這些數(shù)據(jù)積累經(jīng)驗爬范,提高機器學(xué)習(xí)的水平。

應(yīng)用算法解決 Kaggle 問題弱匪,一般有以下幾個步驟:

  • 第一步:識別問題
  • 第二步:分離數(shù)據(jù)
  • 第三步:構(gòu)造提取特征
  • 第四步:組合數(shù)據(jù)
  • 第五步:分解
  • 第六步:選擇特征
  • 第七步:選擇算法進行訓(xùn)練

當然青瀑,工欲善其事,必先利其器萧诫,要先把工具和包都安好狱窘。
最方便的就是安裝 Anaconda,這里面包含大部分數(shù)據(jù)科學(xué)所需要的包财搁,直接引入就可以了蘸炸,常用的包有:

  • pandas:常用來將數(shù)據(jù)轉(zhuǎn)化成 dataframe 形式進行操作
  • scikit-learn:里面有要用到的機器學(xué)習(xí)算法模型
  • matplotlib:用來畫圖
  • 以及 xgboost,keras尖奔,tqdm 等搭儒。

第一步:識別問題

在這一步先明確這個問題是分類還是回歸。通過問題和數(shù)據(jù)就可以判斷出來提茁,數(shù)據(jù)由 X 和 label 列構(gòu)成淹禾,label 可以一列也可以多列,可以是二進制也可以是實數(shù)茴扁,當它為二進制時铃岔,問題屬于分類,當它為實數(shù)時,問題屬于回歸毁习。

第二步:分離數(shù)據(jù)

為什么需要將數(shù)據(jù)分成兩部分智嚷?
用 Training Data 來訓(xùn)練模型,用 Validation Data 來檢驗這個模型的表現(xiàn)纺且,不然的話盏道,通過各種調(diào)節(jié)參數(shù),模型可以在訓(xùn)練數(shù)據(jù)集上面表現(xiàn)的非常出色载碌,但是這可能會是過擬合猜嘱,過擬合就是太依賴現(xiàn)有的數(shù)據(jù)了,擬合的效果特別好嫁艇,但是只適用于訓(xùn)練集朗伶,以致于來一個新的數(shù)據(jù),就不知道該預(yù)測成什么了步咪。所以需要有 Validation 來驗證一下论皆,看這個模型是在那里自娛自樂呢,還是真的表現(xiàn)出色歧斟。

在 scikit learn 包里就有工具可以幫你做到這些:
分類問題用 StrtifiedKFold

from sklearn.cross_validation import StratifiedKFold

回歸問題用 KFold

from sklearn.cross_validation import KFold

第三步:構(gòu)造特征

這個時候纯丸,需要將數(shù)據(jù)轉(zhuǎn)化成模型需要的形式偏形。數(shù)據(jù)有三種類型:數(shù)字静袖,類別,文字俊扭。當數(shù)據(jù)是類別的形式時队橙,需要將它的每一類提取出來作為單獨一列,然后用二進制表示每條記錄相應(yīng)的值萨惑。例如:

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

轉(zhuǎn)化之后就是:

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

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

from sklearn.preprocessing import LabelEncoder

或者

from sklearn.preprocessing import OneHotEncoder

第四步:組合數(shù)據(jù)

處理完 Feature 之后捐康,就將它們組合到一起。
如果數(shù)據(jù)是稠密的庸蔼,就可以用 numpy 的 hstack:

import numpy as np
X = np.hstack((x1, x2, ...))

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

from scipy import sparse
X = sparse.hstack((x1, x2, ...))

組合之后,就可以應(yīng)用以下算法模型:

  • RandomForestClassifier
  • RandomForestRegressor
  • ExtraTreesClassifier
  • ExtraTreesRegressor
  • XGBClassifier
  • XGBRegressor

但是不能應(yīng)用線性模型姐仅,線性模型之前需要對數(shù)據(jù)進行正則化而不是上述預(yù)處理花枫。

第五步:分解

這一步是為了進一步優(yōu)化模型,可以用以下方法:

PCA:Principal components analysis掏膏,主成分分析劳翰,是一種分析、簡化數(shù)據(jù)集的技術(shù)佳簸。用于減少數(shù)據(jù)集的維數(shù),同時保持數(shù)據(jù)集中的對方差貢獻最大的特征颖变。

from sklearn.decomposition import PCA

對于文字數(shù)據(jù)生均,在轉(zhuǎn)化成稀疏矩陣之后听想,可以用 SVD

from sklearn.decomposition import TruncatedSVD

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

第六步:選擇特征

當特征個數(shù)越多時邻吞,分析特征崔列、訓(xùn)練模型所需的時間就越長,容易引起“維度災(zāi)難”耿眉,模型也會越復(fù)雜组底,推廣能力也會下降,所以需要剔除不相關(guān)或亢余的特征。

常用的算法有完全搜索告唆,啟發(fā)式搜索棺弊,和隨機算法茄螃。

例如,Random Forest:

from sklearn.ensemble import RandomForestClassifier

或者 xgboost:

import xgboost as xgb

對于稀疏的數(shù)據(jù)夏伊,一個比較有名的方法是 chi-2:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

第七步:選擇算法進行訓(xùn)練

選擇完最相關(guān)的參數(shù)之后咏连,接下來就可以應(yīng)用算法垄懂,常用的算法有:

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里可以看到分類和回歸的可用的算法一覽痛垛,包括它們的原理和例子代碼抖剿。

在應(yīng)用各算法之前先要明確這個方法到底是否合適喻频。
為什么那么多算法里肘迎,只提出這幾個算法呢狰挡,這就需要對比不同算法的性能了加叁。
這篇神文 Do we Need Hundreds of Classifiers to Solve Real World Classification Problems 測試了179種分類模型在UCI所有的121個數(shù)據(jù)上的性能告希,發(fā)現(xiàn)Random Forests 和 SVM 性能最好烧给。
我們可以學(xué)習(xí)一下里面的調(diào)研思路,看看是怎么樣得到比較結(jié)果的涧尿,在我們的實踐中也有一定的指導(dǎo)作用。

各算法比較

但是直接應(yīng)用算法后,一般精度都不是很理想鸳粉,這個時候需要調(diào)節(jié)參數(shù),最干貨的問題來了届谈,什么模型需要調(diào)節(jié)什么參數(shù)呢枯夜?

雖然在sklearn的文檔里,會列出所有算法所帶有的參數(shù)艰山,但是里面并不會說調(diào)節(jié)哪個會有效湖雹。在一些mooc課程里,有一些項目的代碼曙搬,里面可以看到一些算法應(yīng)用時摔吏,他們重點調(diào)節(jié)的參數(shù)汤踏,但是有的也不會說清楚為什么不調(diào)節(jié)別的。這里作者根據(jù)他100多次比賽的經(jīng)驗舔腾,列出了這個表溪胶,我覺得可以借鑒一下,當然稳诚,如果有時間的話哗脖,去對照文檔里的參數(shù)列表,再查一下算法的原理扳还,通過理論也是可以判斷出來哪個參數(shù)影響比較大的才避。

調(diào)參之后,也并不就是大功告成氨距,這個時候還是需要去思考桑逝,是什么原因造成精度低的,是哪些數(shù)據(jù)的深意還沒有被挖掘到俏让,這個時候需要用統(tǒng)計和可視化去再一次探索數(shù)據(jù)楞遏,之后就再走一遍上面的過程。

我覺得這里還提到了很有用的一條經(jīng)驗是首昔,把所有的 transformer 都保存起來寡喝,方便在 validation 數(shù)據(jù)集上面應(yīng)用:

文章里介紹了分析問題的思路,還提到了幾條很實用的經(jīng)驗勒奇,不過經(jīng)驗終究是別人的經(jīng)驗预鬓,只能借鑒,要想提高自己的水平赊颠,還是要看到作者背后的事情格二,就是參加了100多次實戰(zhàn),接下來就去行動吧竣蹦,享受用算法和代碼與數(shù)據(jù)玩耍的興奮吧顶猜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市草添,隨后出現(xiàn)的幾起案子驶兜,更是在濱河造成了極大的恐慌扼仲,老刑警劉巖远寸,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屠凶,居然都是意外死亡驰后,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門矗愧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灶芝,“玉大人郑原,你說我怎么就攤上這事∫固椋” “怎么了犯犁?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長女器。 經(jīng)常有香客問我酸役,道長,這世上最難降的妖魔是什么驾胆? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任涣澡,我火速辦了婚禮,結(jié)果婚禮上丧诺,老公的妹妹穿的比我還像新娘入桂。我一直安慰自己,他們只是感情好驳阎,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布抗愁。 她就那樣靜靜地躺著,像睡著了一般呵晚。 火紅的嫁衣襯著肌膚如雪驹愚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天劣纲,我揣著相機與錄音逢捺,去河邊找鬼。 笑死癞季,一個胖子當著我的面吹牛劫瞳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绷柒,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼志于,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了废睦?” 一聲冷哼從身側(cè)響起伺绽,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗜湃,沒想到半個月后奈应,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡购披,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年杖挣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刚陡。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡惩妇,死狀恐怖株汉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歌殃,我是刑警寧澤乔妈,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站氓皱,受9級特大地震影響褒翰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匀泊,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一优训、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧各聘,春花似錦揣非、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至大脉,卻和暖如春搞监,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镰矿。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工琐驴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秤标。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓绝淡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親苍姜。 傳聞我的和親對象是個殘疾皇子牢酵,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容