丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給汪思穎
發(fā)送

1

分分鐘帶你殺入Kaggle Top 1%

本文作者: 汪思穎 2017-10-10 15:31
導(dǎo)語:雖然關(guān)于kaggle比賽的經(jīng)驗(yàn)分享已足夠多,但這篇一定不要錯過。

雷鋒網(wǎng) AI科技評論按,本文首發(fā)于知乎專欄AI帶路黨,作者吳曉暉,雷鋒網(wǎng) AI科技評論獲其授權(quán)轉(zhuǎn)載。

不知道你有沒有這樣的感受,在剛剛?cè)腴T機(jī)器學(xué)習(xí)的時候,我們一般都是從MNIST、CIFAR-10這一類知名公開數(shù)據(jù)集開始快速上手,復(fù)現(xiàn)別人的結(jié)果,但總覺得過于簡單,給人的感覺太不真實(shí)。因?yàn)檫@些數(shù)據(jù)太“完美”了(干凈的輸入,均衡的類別,分布基本一致的測試集,還有大量現(xiàn)成的參考模型),要成為真正的數(shù)據(jù)科學(xué)家,光在這些數(shù)據(jù)集上跑模型是遠(yuǎn)遠(yuǎn)不夠的?,F(xiàn)實(shí)中你幾乎不可能遇到這樣的數(shù)據(jù)(現(xiàn)實(shí)數(shù)據(jù)往往有著殘缺的輸入,類別嚴(yán)重不均衡,分布不一致甚至隨時變動的測試集,幾乎沒有可以參考的論文),這往往讓剛進(jìn)入工作的同學(xué)手忙腳亂,無所適從。

Kaggle則提供了一個介于“完美”與真實(shí)之間的過渡,問題的定義基本良好,卻夾著或多或少的難點(diǎn),一般沒有完全成熟的解決方案。在參賽過程中與論壇上的其他參賽者互動,能不斷地獲得啟發(fā),受益良多。即使對于一些學(xué)有所成的高手乃至大牛,參加Kaggle也常常會獲得很多啟發(fā),與來自世界各地的隊(duì)伍進(jìn)行廝殺的刺激更讓人欲罷不能。更重要的是,Kaggle是業(yè)界普遍承認(rèn)的競賽平臺,能從Kaggle上的一些高質(zhì)量競賽獲取好名次,是對自己實(shí)力極好的證明,還能給自己的履歷添上光輝的一筆。如果能獲得金牌,殺入獎金池,那更是名利兼收,再好不過。

Kaggle適用于以下人群:

  • 我是小白,但是對數(shù)據(jù)科學(xué)充滿求知欲。

  • 我想要?dú)v練自己的數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)技能,成為一名真正的數(shù)據(jù)科(lao)學(xué)(si)家(ji)。

  • 我想贏取獎金,成為人生贏家。

簡介

Kaggle創(chuàng)辦于2010年,目前已經(jīng)被Google收購,是全球頂級的數(shù)據(jù)科學(xué)競賽平臺,在數(shù)據(jù)科學(xué)領(lǐng)域中享有盛名。筆者參加了由Quora舉辦的Quora Question Pairs比賽,并且獲得了前1%的成績(3307支隊(duì)伍)。這是筆者Kaggle首戰(zhàn),所以寫下此文來系統(tǒng)化地梳理比賽的思路,并且和大家分享我們參賽的一些心得。

Quora Question Pairs是一個自然語言(NLP)比賽,比賽的題目可以簡單地概括為“預(yù)測兩個問句的語義相似的概率”。其中的樣本如下:

分分鐘帶你殺入Kaggle Top 1%

也許是作為Kaggle上為數(shù)不多的NLP比賽,這看似簡單的比賽卻吸引了眾多的參賽隊(duì)伍。由于這是NLP問題,所以接下來的介紹都會偏向于NLP,本文會分為以下三個部分:

  1. 打Kaggle比賽的大致套路。(比賽篇)

  2. 我們隊(duì)伍和其他出色隊(duì)伍的參賽經(jīng)驗(yàn)。(經(jīng)驗(yàn)篇)

  3. 完成Kaggle比賽需要學(xué)會哪些實(shí)用的工具。(工具篇)

1、比賽篇

為了方便,我們先定義幾個名詞:

  1. Feature 特征變量,也叫自變量,是樣本可以觀測到的特征,通常是模型的輸入。

  2. Label 標(biāo)簽,也叫目標(biāo)變量,需要預(yù)測的變量,通常是模型的標(biāo)簽或者輸出。

  3. Train Data 訓(xùn)練數(shù)據(jù),有標(biāo)簽的數(shù)據(jù),由舉辦方提供。

  4. Test Data 測試數(shù)據(jù),標(biāo)簽未知,是比賽用來評估得分的數(shù)據(jù),由舉辦方提供。

  5. Train Set訓(xùn)練集,從Train Data中分割得到的,用于訓(xùn)練模型(常用于交叉驗(yàn)證)。

  6. Valid Set 驗(yàn)證集,從Train Data中分割得到的,用于驗(yàn)證模型(常用于交叉驗(yàn)證)。

1.1分析題目

拿到賽題以后,第一步就是要破題,我們需要將問題轉(zhuǎn)化為相應(yīng)的機(jī)器學(xué)習(xí)問題。其中,Kaggle最常見的機(jī)器學(xué)習(xí)問題類型有:

  1. 回歸問題

  2. 分類問題(二分類、多分類、多標(biāo)簽):多分類只需從多個類別中預(yù)測一個類別,而多標(biāo)簽則需要預(yù)測出多個類別。

比如Quora的比賽就是二分類問題,因?yàn)橹恍枰袛鄡蓚€問句的語義是否相似。

1.2 數(shù)據(jù)分析(Data Exploration)

所謂數(shù)據(jù)挖掘,當(dāng)然是要從數(shù)據(jù)中去挖掘我們想要的東西,我們需要通過人為地去分析數(shù)據(jù),才可以發(fā)現(xiàn)數(shù)據(jù)中存在的問題和特征。我們需要在觀察數(shù)據(jù)的過程中思考以下幾個問題:

  1. 數(shù)據(jù)應(yīng)該怎么清洗和處理才是合理的?

  2. 根據(jù)數(shù)據(jù)的類型可以挖掘怎樣的特征?

  3. 數(shù)據(jù)中的哪些特征會對標(biāo)簽的預(yù)測有幫助?

1.2.1 統(tǒng)計(jì)分析

對于數(shù)值類變量(Numerical Variable),我們可以得到min,max,mean,meduim,std等統(tǒng)計(jì)量,用pandas可以方便地完成,結(jié)果如下:

分分鐘帶你殺入Kaggle Top 1%

從上圖中可以觀察Label是否均衡,如果不均衡則需要進(jìn)行over sample少數(shù)類,或者down sample多數(shù)類。我們還可以統(tǒng)計(jì)Numerical Variable之間的相關(guān)系數(shù),用pandas就可以輕松獲得相關(guān)系數(shù)矩陣:

分分鐘帶你殺入Kaggle Top 1%

觀察相關(guān)系數(shù)矩陣可以讓你找到高相關(guān)的特征,以及特征之間的冗余度。而對于文本變量,可以統(tǒng)計(jì)詞頻(TF),TF-IDF,文本長度等等,更詳細(xì)的內(nèi)容可以參考這里(https://www.kaggle.com/sudalairajkumar/simple-leaky-exploration-notebook-quora?scriptVersionId=1184830)

1.2.2 可視化

人是視覺動物,更容易接受圖形化的表示,因此可以將一些統(tǒng)計(jì)信息通過圖表的形式展示出來,方便我們觀察和發(fā)現(xiàn)。比如用直方圖展示問句的頻數(shù):

分分鐘帶你殺入Kaggle Top 1%

或者繪制相關(guān)系數(shù)矩陣:

分分鐘帶你殺入Kaggle Top 1%

常用的可視化工具有matplotlib和seaborn。當(dāng)然,你也可以跳過這一步,因?yàn)榭梢暬皇墙鉀Q問題的重點(diǎn)。

1.3 數(shù)據(jù)預(yù)處理(Data Preprocessing)

剛拿到手的數(shù)據(jù)會出現(xiàn)噪聲,缺失,臟亂等現(xiàn)象,我們需要對數(shù)據(jù)進(jìn)行清洗與加工,從而方便進(jìn)行后續(xù)的工作。針對不同類型的變量,會有不同的清洗和處理方法:

  1. 對于數(shù)值型變量(Numerical Variable),需要處理離群點(diǎn),缺失值,異常值等情況。

  2. 對于類別型變量(Categorical Variable),可以轉(zhuǎn)化為one-hot編碼。

  3. 文本數(shù)據(jù)是較難處理的數(shù)據(jù)類型,文本中會有垃圾字符,錯別字(詞),數(shù)學(xué)公式,不統(tǒng)一單位和日期格式等。我們還需要處理標(biāo)點(diǎn)符號,分詞,去停用詞,對于英文文本可能還要詞性還原(lemmatize),抽取詞干(stem)等等。

1.4 特征工程(Feature Engineering)

都說特征為王,特征是決定效果最關(guān)鍵的一環(huán)。我們需要通過探索數(shù)據(jù),利用人為先驗(yàn)知識,從數(shù)據(jù)中總結(jié)出特征。

1.4.1 特征抽取(Feature Extraction)

我們應(yīng)該盡可能多地抽取特征,只要你認(rèn)為某個特征對解決問題有幫助,它就可以成為一個特征。特征抽取需要不斷迭代,是最為燒腦的環(huán)節(jié),它會在整個比賽周期折磨你,但這是比賽取勝的關(guān)鍵,它值得你耗費(fèi)大量的時間。

那問題來了,怎么去發(fā)現(xiàn)特征呢?光盯著數(shù)據(jù)集肯定是不行的。如果你是新手,可以先耗費(fèi)一些時間在Forum上,看看別人是怎么做Feature Extraction的,并且多思考。雖然Feature Extraction特別講究經(jīng)驗(yàn),但其實(shí)還是有章可循的:

  1. 對于Numerical Variable,可以通過線性組合、多項(xiàng)式組合來發(fā)現(xiàn)新的Feature。

  2. 對于文本數(shù)據(jù),有一些常規(guī)的Feature。比如,文本長度,Embeddings,TF-IDF,LDA,LSI等,你甚至可以用深度學(xué)習(xí)提取文本特征(隱藏層)。

  3. 如果你想對數(shù)據(jù)有更深入的了解,可以通過思考數(shù)據(jù)集的構(gòu)造過程來發(fā)現(xiàn)一些magic feature,這些特征有可能會大大提升效果。在Quora這次比賽中,就有人公布了一些magic feature。

  4. 通過錯誤分析也可以發(fā)現(xiàn)新的特征(見1.5.2小節(jié))。

1.4.2 特征選擇(Feature Selection)

在做特征抽取的時候,我們是盡可能地抽取更多的Feature,但過多的Feature會造成冗余,噪聲,容易過擬合等問題,因此我們需要進(jìn)行特征篩選。特征選擇可以加快模型的訓(xùn)練速度,甚至還可以提升效果。

特征選擇的方法多種多樣,最簡單的是相關(guān)度系數(shù)(Correlation coefficient),它主要是衡量兩個變量之間的線性關(guān)系,數(shù)值在[-1.0, 1.0]區(qū)間中。數(shù)值越是接近0,兩個變量越是線性不相關(guān)。但是數(shù)值為0,并不能說明兩個變量不相關(guān),只是線性不相關(guān)而已。

我們通過一個例子來學(xué)習(xí)一下怎么分析相關(guān)系數(shù)矩陣:

分分鐘帶你殺入Kaggle Top 1%

相關(guān)系數(shù)矩陣是一個對稱矩陣,所以只需要關(guān)注矩陣的左下角或者右上角。我們可以拆成兩點(diǎn)來看:

  1. Feature和Label的相關(guān)度可以看作是該Feature的重要度,越接近1或-1就越好。

  2. Feature和Feature之間的相關(guān)度要低,如果兩個Feature的相關(guān)度很高,就有可能存在冗余。

除此之外,還可以訓(xùn)練模型來篩選特征,比如帶L1或L2懲罰項(xiàng)的Linear Model、Random Forest、GDBT等,它們都可以輸出特征的重要度。在這次比賽中,我們對上述方法都進(jìn)行了嘗試,將不同方法的平均重要度作為最終參考指標(biāo),篩選掉得分低的特征。

1.5 建模(Modeling)

終于來到機(jī)器學(xué)習(xí)了,在這一章,我們需要開始煉丹了。

1.5.1 模型

機(jī)器學(xué)習(xí)模型有很多,建議均作嘗試,不僅可以測試效果,還可以學(xué)習(xí)各種模型的使用技巧。其實(shí),幾乎每一種模型都有回歸和分類兩種版本,常用模型有:

  • KNN

  • SVM

  • Linear Model(帶懲罰項(xiàng))

  • ExtraTree

  • RandomForest

  • Gradient Boost Tree

  • Neural Network

幸運(yùn)的是,這些模型都已經(jīng)有現(xiàn)成的工具(如scikit-learn、XGBoost、LightGBM等)可以使用,不用自己重復(fù)造輪子。但是我們應(yīng)該要知道各個模型的原理,這樣在調(diào)參的時候才會游刃有余。當(dāng)然,你也可以使用PyTorch/Tensorflow/Keras等深度學(xué)習(xí)工具來定制自己的Deep Learning模型,玩出自己的花樣。

1.5.2 錯誤分析

人無完人,每個模型不可能都是完美的,它總會犯一些錯誤。為了解某個模型在犯什么錯誤,我們可以觀察被模型誤判的樣本,總結(jié)它們的共同特征,我們就可以再訓(xùn)練一個效果更好的模型。這種做法有點(diǎn)像后面Ensemble時提到的Boosting,但是我們是人為地觀察錯誤樣本,而Boosting是交給了機(jī)器。通過錯誤分析->發(fā)現(xiàn)新特征->訓(xùn)練新模型->錯誤分析,可以不斷地迭代出更好的效果,并且這種方式還可以培養(yǎng)我們對數(shù)據(jù)的嗅覺。

舉個例子,這次比賽中,我們在錯誤分析時發(fā)現(xiàn),某些樣本的兩個問句表面上很相似,但是句子最后提到的地點(diǎn)不一樣,所以其實(shí)它們是語義不相似的,但我們的模型卻把它誤判為相似的。比如這個樣本:

  • Question1: Which is the best digital marketing institution in banglore?

  • Question2: Which is the best digital marketing institute in Pune?

為了讓模型可以處理這種樣本,我們將兩個問句的最長公共子串(Longest Common Sequence)去掉,用剩余部分訓(xùn)練一個新的深度學(xué)習(xí)模型,相當(dāng)于告訴模型看到這種情況的時候就不要判斷為相似的了。因此,在加入這個特征后,我們的效果得到了一些提升。

1.5.3 調(diào)參

在訓(xùn)練模型前,我們需要預(yù)設(shè)一些參數(shù)來確定模型結(jié)構(gòu)(比如樹的深度)和優(yōu)化過程(比如學(xué)習(xí)率),這種參數(shù)被稱為超參(Hyper-parameter),不同的參數(shù)得到的模型效果也會不同??偸钦f調(diào)參就像是在“煉丹”,像一門“玄學(xué)”,但是根據(jù)經(jīng)驗(yàn),還是可以找到一些章法的:

  1. 根據(jù)經(jīng)驗(yàn),選出對模型效果影響較大的超參。

  2. 按照經(jīng)驗(yàn)設(shè)置超參的搜索空間,比如學(xué)習(xí)率的搜索空間為[0.001,0.1]。

  3. 選擇搜索算法,比如Random Search、Grid Search和一些啟發(fā)式搜索的方法。

  4. 驗(yàn)證模型的泛化能力(詳見下一小節(jié))。

1.5.4 模型驗(yàn)證(Validation)

在Test Data的標(biāo)簽未知的情況下,我們需要自己構(gòu)造測試數(shù)據(jù)來驗(yàn)證模型的泛化能力,因此把Train Data分割成Train Set和Valid Set兩部分,Train Set用于訓(xùn)練,Valid Set用于驗(yàn)證。

  • 簡單分割

將Train Data按一定方法分成兩份,比如隨機(jī)取其中70%的數(shù)據(jù)作為Train Set,剩下30%作為Valid Set,每次都固定地用這兩份數(shù)據(jù)分別訓(xùn)練模型和驗(yàn)證模型。這種做法的缺點(diǎn)很明顯,它沒有用到整個訓(xùn)練數(shù)據(jù),所以驗(yàn)證效果會有偏差。通常只會在訓(xùn)練數(shù)據(jù)很多,模型訓(xùn)練速度較慢的時候使用。

  • 交叉驗(yàn)證

交叉驗(yàn)證是將整個訓(xùn)練數(shù)據(jù)隨機(jī)分成K份,訓(xùn)練K個模型,每次取其中的K-1份作為Train Set,留出1份作為Valid Set,因此也叫做K-fold。至于這個K,你想取多少都可以,但一般選在3~10之間。我們可以用K個模型得分的mean和std,來評判模型的好壞(mean體現(xiàn)模型的能力,std體現(xiàn)模型是否容易過擬合),并且用K-fold的驗(yàn)證結(jié)果通常會比較可靠。

如果數(shù)據(jù)出現(xiàn)Label不均衡情況,可以使用Stratified K-fold,這樣得到的Train Set和Test Set的Label比例是大致相同。

1.6 模型集成(Ensemble)

曾經(jīng)聽過一句話,”Feature為主,Ensemble為后”。Feature決定了模型效果的上限,而Ensemble就是讓你更接近這個上限。Ensemble講究“好而不同”,不同是指模型的學(xué)習(xí)到的側(cè)重面不一樣。舉個直觀的例子,比如數(shù)學(xué)考試,A的函數(shù)題做的比B好,B的幾何題做的比A好,那么他們合作完成的分?jǐn)?shù)通常比他們各自單獨(dú)完成的要高。

常見的Ensemble方法有Bagging、Boosting、Stacking、Blending。

1.6.1 Bagging

Bagging是將多個模型(基學(xué)習(xí)器)的預(yù)測結(jié)果簡單地加權(quán)平均或者投票。Bagging的好處在于可以并行地訓(xùn)練基學(xué)習(xí)器,其中Random Forest就用到了Bagging的思想。舉個通俗的例子,如下圖:

分分鐘帶你殺入Kaggle Top 1%

老師出了兩道加法題,A同學(xué)和B同學(xué)答案的加權(quán)要比A和B各自回答的要精確。

Bagging通常是沒有一個明確的優(yōu)化目標(biāo)的,但是有一種叫Bagging Ensemble Selection的方法,它通過貪婪算法來Bagging多個模型來優(yōu)化目標(biāo)值。在這次比賽中,我們也使用了這種方法。

1.6.2 Boosting

Boosting的思想有點(diǎn)像知錯能改,每訓(xùn)練一個基學(xué)習(xí)器,是為了彌補(bǔ)上一個基學(xué)習(xí)器所犯的錯誤。其中著名的算法有AdaBoost,Gradient Boost。Gradient Boost Tree就用到了這種思想。

我在1.2.3節(jié)(錯誤分析)中提到Boosting,錯誤分析->抽取特征->訓(xùn)練模型->錯誤分析,這個過程就跟Boosting很相似。

1.6.3 Stacking

Stacking是用新的模型(次學(xué)習(xí)器)去學(xué)習(xí)怎么組合那些基學(xué)習(xí)器,它的思想源自于Stacked Generalization(http://www.machine-learning.martinsewell.com/ensembles/stacking/Wolpert1992.pdf)這篇論文。如果把Bagging看作是多個基分類器的線性組合,那么Stacking就是多個基分類器的非線性組合。Stacking可以很靈活,它可以將學(xué)習(xí)器一層一層地堆砌起來,形成一個網(wǎng)狀的結(jié)構(gòu),如下圖:

分分鐘帶你殺入Kaggle Top 1%

舉個更直觀的例子,還是那兩道加法題:

分分鐘帶你殺入Kaggle Top 1%

這里A和B可以看作是基學(xué)習(xí)器,C、D、E都是次學(xué)習(xí)器。

  • Stage1:  A和B各自寫出了答案。

  • Stage2:  C和D偷看了A和B的答案,C認(rèn)為A和B一樣聰明,D認(rèn)為A比B聰明一點(diǎn)。他們各自結(jié)合了A和B的答案后,給出了自己的答案。

  • Stage3:  E偷看了C和D的答案,E認(rèn)為D比C聰明,隨后E也給出自己的答案作為最終答案。

在實(shí)現(xiàn)Stacking時,要注意的一點(diǎn)是,避免標(biāo)簽泄漏(Label Leak)。在訓(xùn)練次學(xué)習(xí)器時,需要上一層學(xué)習(xí)器對Train Data的測試結(jié)果作為特征。如果我們在Train Data上訓(xùn)練,然后在Train Data上預(yù)測,就會造成Label Leak。為了避免Label Leak,需要對每個學(xué)習(xí)器使用K-fold,將K個模型對Valid Set的預(yù)測結(jié)果拼起來,作為下一層學(xué)習(xí)器的輸入。如下圖:

分分鐘帶你殺入Kaggle Top 1%

由圖可知,我們還需要對Test Data做預(yù)測。這里有兩種選擇,可以將K個模型對Test Data的預(yù)測結(jié)果求平均,也可以用所有的Train Data重新訓(xùn)練一個新模型來預(yù)測Test Data。所以在實(shí)現(xiàn)過程中,我們最好把每個學(xué)習(xí)器對Train Data和對Test Data的測試結(jié)果都保存下來,方便訓(xùn)練和預(yù)測。

對于Stacking還要注意一點(diǎn),固定K-fold可以盡量避免Valid Set過擬合,也就是全局共用一份K-fold,如果是團(tuán)隊(duì)合作,組員之間也是共用一份K-fold。如果想具體了解為什么需要固定K-fold,請看這里(https://www.zhihu.com/question/61467937/answer/188191424)。

1.6.4 Blending

Blending與Stacking很類似,它們的區(qū)別可以參考這里(https://mlwave.com/kaggle-ensembling-guide/)

1.7 后處理

有些時候在確認(rèn)沒有過擬合的情況下,驗(yàn)證集上做校驗(yàn)時效果挺好,但是將測試結(jié)果提交后的分?jǐn)?shù)卻不如人意,這時候就有可能是訓(xùn)練集的分布與測試集的分布不一樣而導(dǎo)致的。這時候?yàn)榱颂岣週eaderBoard的分?jǐn)?shù),還需要對測試結(jié)果進(jìn)行分布調(diào)整。

比如這次比賽,訓(xùn)練數(shù)據(jù)中正類的占比為0.37,那么預(yù)測結(jié)果中正類的比例也在0.37左右,然后Kernel上有人通過測試知道了測試數(shù)據(jù)中正類的占比為0.165,所以我們也對預(yù)測結(jié)果進(jìn)行了調(diào)整,得到了更好的分?jǐn)?shù)。具體可以看這里(https://www.kaggle.com/davidthaler/how-many-1-s-are-in-the-public-lb)。

2、經(jīng)驗(yàn)篇

2.1 我們的方案(33th)

深度學(xué)習(xí)具有很好的模型擬合能力,使用深度學(xué)習(xí)可以較快得獲取一個不錯的Baseline,對這個問題整體的難度有一個初始的認(rèn)識。雖然使用深度學(xué)習(xí)可以免去繁瑣的手工特征,但是它也有能力上限,所以提取傳統(tǒng)手工特征還是很有必要的。我們嘗試Forum上別人提供的方法,也嘗試自己思考去抽取特征??偨Y(jié)一下,我們抽取的手工特征可以分為以下4種:

  1. Text Mining Feature,比如句子長度;兩個句子的文本相似度,如N-gram的編輯距離,Jaccard距離等;兩個句子共同的名詞,動詞,疑問詞等。

  2. Embedding Feature,預(yù)訓(xùn)練好的詞向量相加求出句子向量,然后求兩個句子向量的距離,比如余弦相似度、歐式距離等等。

  3. Vector Space Feature,用TF-IDF矩陣來表示句子,求相似度。

  4. Magic Feature,是Forum上一些選手通過思考數(shù)據(jù)集構(gòu)造過程而發(fā)現(xiàn)的Feature,這種Feature往往與Label有強(qiáng)相關(guān)性,可以大大提高預(yù)測效果。

我們的系統(tǒng)整體上使用了Stacking的框架,如下圖:

分分鐘帶你殺入Kaggle Top 1%

  • Stage1:  將兩個問句與Magic Feature輸入Deep Learning中,將其輸出作為下一層的特征(這里的Deep Learning相當(dāng)于特征抽取器)。我們一共訓(xùn)練了幾十個Deep Learning Model。

  • Stage2:  將Deep Learning特征與手工抽取的幾百個傳統(tǒng)特征拼在一起,作為輸入。在這一層,我們訓(xùn)練各種模型,有成百上千個。

  • Stage3: 上一層的輸出進(jìn)行Ensemble Selection。

比賽中發(fā)現(xiàn)的一些深度學(xué)習(xí)的局限:

通過對深度學(xué)習(xí)產(chǎn)生的結(jié)果進(jìn)行錯誤分析,并且參考論壇上別人的想法,我們發(fā)現(xiàn)深度學(xué)習(xí)沒辦法學(xué)到的特征大概可以分為兩類:

  1. 對于一些數(shù)據(jù)的Pattern,在Train Data中出現(xiàn)的頻數(shù)不足以讓深度學(xué)習(xí)學(xué)到對應(yīng)的特征,所以我們需要通過手工提取這些特征。

  2. 由于Deep Learning對樣本做了獨(dú)立同分布假設(shè)(iid),一般只能學(xué)習(xí)到每個樣本的特征,而學(xué)習(xí)到數(shù)據(jù)的全局特征,比如TF-IDF這一類需要統(tǒng)計(jì)全局詞頻才能獲取的特征,因此也需要手工提取這些特征。

傳統(tǒng)的機(jī)器學(xué)習(xí)模型和深度學(xué)習(xí)模型之間也存在表達(dá)形式上的不同。雖然傳統(tǒng)模型的表現(xiàn)未必比深度學(xué)習(xí)好,但它們學(xué)到的Pattern可能不同,通過Ensemble來取長補(bǔ)短,也能帶來性能上的提升。因此,同時使用傳統(tǒng)模型也是很有必要的。

2.2 第一名的解決方案

比賽結(jié)束不久,第一名也放出了他們的解決方案(https://www.kaggle.com/c/quora-question-pairs/discussion/34355),我們來看看他們的做法。他們的特征總結(jié)為三個類別:

  1. Embedding Feature

  2. Text Mining Feature

  3. Structural Feature(他們自己挖掘的Magic Feature)

并且他們也使用了Stacking的框架,并且使用固定的k-fold:

  • Stage1: 使用了Deep Learning,XGBoost,LightGBM,ExtraTree,Random Forest,KNN等300個模型。

  • Stage2: 用了手工特征和第一層的預(yù)測和深度學(xué)習(xí)模型的隱藏層,并且訓(xùn)練了150個模型。

  • Stage3: 使用了分別是帶有L1和L2的兩種線性模型。

  • Stage4: 將第三層的結(jié)果加權(quán)平均。

對比以后發(fā)現(xiàn)我們沒有做LDA、LSI等特征,并且N-gram的粒度沒有那么細(xì)(他們用了8-gram),還有他們對Magic Feature的挖掘更加深入。還有一點(diǎn)是他們的Deep Learning模型設(shè)計(jì)更加合理,他們將篩選出來的手工特征也輸入到深度學(xué)習(xí)模型當(dāng)中,我覺得這也是他們?nèi)〉煤眯Ч年P(guān)鍵。因?yàn)轱@式地將手工特征輸入給深度學(xué)習(xí)模型,相當(dāng)于告訴“它你不用再學(xué)這些特征了,你去學(xué)其他的特征吧”,這樣模型就能學(xué)到更多的語義信息。所以,我們跟他們的差距還是存在的。

3、工具篇

工欲善其事,必先利其器。

Kaggle 的常用工具除了大家耳熟能詳?shù)腦GBoost之外, 這里要著重推薦的是一款由微軟推出的LightGBM,這次比賽中我們就用到了。LightGBM的用法與XGBoost相似,兩者使用的區(qū)別是XGBoost調(diào)整的一個重要參數(shù)是樹的高度,而LightGBM調(diào)整的則是葉子的數(shù)目。與XGBoost 相比, 在模型訓(xùn)練時速度快, 單模型的效果也略勝一籌。

調(diào)參也是一項(xiàng)重要工作,調(diào)參的工具主要是Hyperopt,它是一個使用搜索算法來優(yōu)化目標(biāo)的通用框架,目前實(shí)現(xiàn)了Random Search和Tree of Parzen Estimators (TPE)兩個算法。

對于 Stacking,Kaggle 的一位名為Μαριο? Μιχαηλιδη?的GrandMaster使用Java開發(fā)了一款集成了各種機(jī)器學(xué)習(xí)算法的工具包StackNet,據(jù)說在使用了它以后你的效果一定會比原來有所提升,值得一試。

以下總結(jié)了一些常用的工具:

  • Numpy | 必用的科學(xué)計(jì)算基礎(chǔ)包,底層由C實(shí)現(xiàn),計(jì)算速度快。

  • Pandas | 提供了高性能、易用的數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)分析工具。

  • NLTK | 自然語言工具包,集成了很多自然語言相關(guān)的算法和資源。

  • Stanford CoreNLP | Stanford的自然語言工具包,可以通過NLTK調(diào)用。

  • Gensim | 主題模型工具包,可用于訓(xùn)練詞向量,讀取預(yù)訓(xùn)練好的詞向量。

  • scikit-learn | 機(jī)器學(xué)習(xí)Python包 ,包含了大部分的機(jī)器學(xué)習(xí)算法。

  • XGBoostLightGBM | Gradient Boosting 算法的兩種實(shí)現(xiàn)框架。

  • PyTorchTensorFlowKeras | 常用的深度學(xué)習(xí)框架。

  • StackNet |  準(zhǔn)備好特征之后,可以直接使用的Stacking工具包。

  • Hyperopt | 通用的優(yōu)化框架,可用于調(diào)參。

4、總結(jié)與建議

  1. 在參加某個比賽前,要先衡量自己的機(jī)器資源能否足夠支撐你完成比賽。比如一個有幾萬張圖像的比賽,而你的顯存只有2G,那很明顯你是不適合參加這個比賽的。當(dāng)你選擇了一個比賽后,可以先“熱熱身”,稍微熟悉一下數(shù)據(jù),粗略地跑出一些簡單的模型,看看自己在榜上的排名,然后再去慢慢迭代。

  2. Kaggle有許多大牛分享Kernel, 有許多Kernel有對于數(shù)據(jù)精辟的分析,以及一些baseline 模型, 對于初學(xué)者來說是很好的入門資料。在打比賽的過程中可以學(xué)習(xí)別人的分析方法,有利于培養(yǎng)自己數(shù)據(jù)嗅覺。甚至一些Kernel會給出一些data leak,會對于比賽提高排名有極大的幫助。

  3. 其次是Kaggle已經(jīng)舉辦了很多比賽, 有些比賽有類似之處, 比如這次的Quora比賽就與之前的Home Depot Product Search Relevance 有相似之處,而之前的比賽前幾名已經(jīng)放出了比賽的idea甚至代碼,這些都可以借鑒。

  4. 另外,要足夠地重視Ensemble,這次我們組的最終方案實(shí)現(xiàn)了paper " Ensemble Selection from Libraries of Models" 的想法,所以有些比賽可能還需要讀一些paper,尤其對于深度學(xué)習(xí)相關(guān)的比賽,最新paper,最新模型的作用就舉足輕重了。

  5. 而且,將比賽代碼的流程自動化,是提高比賽效率的一個關(guān)鍵,但是往往初學(xué)者并不能很好地實(shí)現(xiàn)自己的自動化系統(tǒng)。我的建議是初學(xué)者不要急于構(gòu)建自動化系統(tǒng),當(dāng)你基本完成整個比賽流程后,自然而然地就會在腦海中形成一個框架,這時候再去構(gòu)建你的自動化系統(tǒng)會更加容易。

  6. 最后,也是最重要的因素之一就是時間的投入,對于這次比賽, 我們投入了差不多三個多月,涉及到了對于各種能夠想到的方案的嘗試。尤其最后一個月,基本上每天除了睡覺之外的時間都在做比賽。所以要想在比賽中拿到好名次,時間的投入必不可少。另外對于國外一些介紹kaggle比賽的博客(比如官方博客)也需要了解學(xué)習(xí),至少可以少走彎路,本文的結(jié)尾列出了一些參考文獻(xiàn),都值得細(xì)細(xì)研讀。

  7. 最后的最后,請做好心理準(zhǔn)備,這是一場持久戰(zhàn)。因?yàn)楸荣悤o你帶來壓力,也許過了一晚,你的排名就會一落千丈。還有可能造成出現(xiàn)失落感,焦慮感,甚至失眠等癥狀。但請你相信,它會給你帶來意想不到的驚喜,認(rèn)真去做,你會覺得這些都是值得的。

5. 致謝

感謝@劉思聰對本文詳細(xì)審閱,也感謝@鄭華濱對本文的指正。同時也感謝@一壺酒兮真狂士@ChingKitWong在比賽期間帶我一起努力拼殺,真的學(xué)到了很多。

參考文獻(xiàn):

1. Paper: Ensemble Selection from Libraries of Models

2. Kaggle 數(shù)據(jù)挖掘比賽經(jīng)驗(yàn)分享

3. Kaggle Ensembling Guide

如有錯誤之處,歡迎各位批評指正。如需轉(zhuǎn)載請私信聯(lián)系。

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

分分鐘帶你殺入Kaggle Top 1%

分享:
相關(guān)文章

編輯

關(guān)注AI學(xué)術(shù),例如論文
當(dāng)月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說