机器学习技巧:如何(以及为什么需要)创建一个好的验证集
作者:Rachel Thomas? ?編譯:ronghuaiyang
導(dǎo)讀
驗(yàn)證集的劃分真的就是調(diào)用一個(gè)train_test_split函數(shù)這么簡(jiǎn)單么,其實(shí)并不是。
一個(gè)非常常見的場(chǎng)景:一個(gè)看起來非常好的機(jī)器學(xué)習(xí)模型在現(xiàn)實(shí)的生產(chǎn)環(huán)境中使用時(shí)是完全失敗的。其后果包括老板對(duì)現(xiàn)在的機(jī)器學(xué)習(xí)持懷疑態(tài)度,不愿再嘗試。怎么會(huì)這樣呢?
導(dǎo)致開發(fā)結(jié)果與生產(chǎn)結(jié)果之間脫節(jié)的最可能的原因之一是錯(cuò)誤地選擇了驗(yàn)證集(甚至更糟,根本沒有驗(yàn)證集)。根據(jù)數(shù)據(jù)的性質(zhì),選擇驗(yàn)證集可能是最重要的一步。雖然sklearn提供了一個(gè)train_test_split方法,但該方法只獲取數(shù)據(jù)的一個(gè)隨機(jī)子集,對(duì)于許多實(shí)際問題來說,這是一個(gè)糟糕的選擇。
訓(xùn)練集、驗(yàn)證集和測(cè)試集的定義可能非常微妙,而且這些術(shù)語有時(shí)使用不一致。在深度學(xué)習(xí)社區(qū)中,“測(cè)試時(shí)間推斷”通常指的是對(duì)生產(chǎn)中的數(shù)據(jù)進(jìn)行評(píng)估,這不是測(cè)試集的技術(shù)定義。如前所述,sklearn有個(gè)train_test_split方法,但沒有train_validation_test_split方法。Kaggle只提供訓(xùn)練和測(cè)試集,但是要做得好,你需要將它們的訓(xùn)練集分解為你自己的驗(yàn)證集和訓(xùn)練集。此外,Kaggle的測(cè)試集實(shí)際上被細(xì)分為兩個(gè)子集。許多初學(xué)者可能會(huì)感到困惑,這一點(diǎn)也不奇怪!我將在下面討論這些微妙之處。
首先,什么是“驗(yàn)證集”?
當(dāng)創(chuàng)建一個(gè)機(jī)器學(xué)習(xí)模型時(shí),最終的目標(biāo)是使它在新數(shù)據(jù)上是準(zhǔn)確的,而不僅僅是在你用來構(gòu)建它的數(shù)據(jù)上可以工作的很好。下面是一組數(shù)據(jù)的3個(gè)不同模型的例子:
under-fitting and over-fitting圖中數(shù)據(jù)點(diǎn)的誤差對(duì)于最右邊的模型來說是最小的(藍(lán)色曲線幾乎完美地通過了紅色點(diǎn)),但這并不是最好的選擇。這是為什么呢?如果你要收集一些新的數(shù)據(jù)點(diǎn),它們很可能不在右邊圖表的曲線上,而是更接近中間圖表的曲線。
其基本思想是:
訓(xùn)練集用于訓(xùn)練給定的模型
驗(yàn)證集用于在模型之間進(jìn)行選擇(例如,隨機(jī)森林還是神經(jīng)網(wǎng)絡(luò)更適合你的問題?)你想要一個(gè)有40棵樹的隨機(jī)森林還是50棵樹的隨機(jī)森林?)
測(cè)試集告訴你,你做的怎么樣。如果你嘗試了許多不同的模型,你可能會(huì)偶然得到一個(gè)在你的驗(yàn)證集上表現(xiàn)良好的模型,而擁有一個(gè)測(cè)試集有助于確保情況并非如此。
驗(yàn)證和測(cè)試集的一個(gè)關(guān)鍵屬性是它們必須代表你在將來看到的新數(shù)據(jù)。這聽起來似乎是一個(gè)不可能的命令!根據(jù)定義,你還沒有看到這些數(shù)據(jù)。但你還是知道一些關(guān)于這些數(shù)據(jù)的事情。
什么時(shí)候隨機(jī)的子集不夠好?
看幾個(gè)例子是有益的。雖然這些例子中有許多來自Kaggle競(jìng)賽,但它們代表了你在實(shí)際工作中所看到的問題。
時(shí)間序列
如果你的數(shù)據(jù)是一個(gè)時(shí)間序列,選擇一個(gè)隨機(jī)的數(shù)據(jù)子集就太簡(jiǎn)單了(你可以看看你試圖預(yù)測(cè)的之前和之后的數(shù)據(jù)日期),并不代表大多數(shù)業(yè)務(wù)樣本的情況(實(shí)際的業(yè)務(wù)是使用歷史數(shù)據(jù)建立一個(gè)模型用于未來的預(yù)測(cè))。如果你的數(shù)據(jù)包含日期,并且你正在構(gòu)建一個(gè)模型以供將來使用,那么你會(huì)希望選擇一個(gè)連續(xù)的部分,其中包含最新的日期作為你的驗(yàn)證集(例如,可用數(shù)據(jù)的最近兩周或上個(gè)月)。
假設(shè)你想把下面的時(shí)間序列數(shù)據(jù)分成訓(xùn)練集和驗(yàn)證集:
時(shí)間序列數(shù)據(jù)隨機(jī)的子集是一個(gè)糟糕的選擇(太容易填補(bǔ)空白,并不能說明你在生產(chǎn)中需要什么):
訓(xùn)練集的糟糕的選擇使用較早的數(shù)據(jù)作為訓(xùn)練集(和較晚的數(shù)據(jù)作為驗(yàn)證集):
訓(xùn)練集的一個(gè)更好的選擇Kaggle有個(gè)比賽,預(yù)測(cè)厄瓜多爾雜貨連鎖店的銷售額。Kaggle的“訓(xùn)練數(shù)據(jù)”從2013年1月1日到2017年8月15日,測(cè)試數(shù)據(jù)從2017年8月16日到2017年8月31日。一個(gè)好的方法是將2017年8月1日至8月15日作為你的驗(yàn)證集,并將所有之前的數(shù)據(jù)作為你的訓(xùn)練集。
新的人員,新的船,新的...
您還需要考慮在生產(chǎn)環(huán)境中進(jìn)行預(yù)測(cè)的數(shù)據(jù)可能與您必須訓(xùn)練模型使用的數(shù)據(jù)在性質(zhì)上有所不同。
在Kaggle的分心駕駛員競(jìng)賽中,數(shù)據(jù)是駕駛員開車的圖片,因變量是一個(gè)類別,如發(fā)短信、吃飯或安全向前看。如果你是一家根據(jù)這些數(shù)據(jù)構(gòu)建模型的保險(xiǎn)公司,請(qǐng)注意,你最感興趣的是模型在你以前沒有見過的駕駛員身上的表現(xiàn)(因?yàn)槟憧赡苤挥幸恍〔糠秩说挠?xùn)練數(shù)據(jù))。Kaggle競(jìng)賽也是如此:測(cè)試數(shù)據(jù)由沒有在訓(xùn)練集中使用的人員組成。
同一個(gè)人一邊開車一邊打電話的兩張圖片。如果你把上面的一張圖片放在你的訓(xùn)練集里,另一張放在驗(yàn)證集里,你的模型看起來會(huì)比它在新人身上表現(xiàn)得更好。另一種觀點(diǎn)是,如果你讓所有的人來訓(xùn)練你的模型,你的模型可能會(huì)對(duì)那些特定的人的特征過擬合,而不僅僅是學(xué)習(xí)到狀態(tài)(發(fā)短信,吃東西,等等)。
類似的動(dòng)態(tài)也在“Kaggle漁業(yè)競(jìng)賽“中發(fā)揮作用,該競(jìng)爭(zhēng)旨在確定漁船捕撈的魚類種類,以減少對(duì)瀕危種群的非法捕撈。測(cè)試集由沒有出現(xiàn)在訓(xùn)練數(shù)據(jù)中的船只組成。這意味著你希望你的驗(yàn)證集包括不在訓(xùn)練集中的船只。
有時(shí)可能不清楚你的測(cè)試數(shù)據(jù)是如何不同。例如,對(duì)于使用衛(wèi)星圖像的問題,你需要收集更多的信息,以確定訓(xùn)練集是否只包含特定的地理位置,還是來自地理上分散的數(shù)據(jù)。
交叉驗(yàn)證的危險(xiǎn)
sklearn之所以沒有train_validation_test是假定你會(huì)經(jīng)常使用交叉驗(yàn)證,用不同的訓(xùn)練集的子集作為驗(yàn)證集。例如,三折交叉驗(yàn)證,數(shù)據(jù)分為3組:A、B和C,,模型第一次在A和B組合起來的訓(xùn)練集上訓(xùn)練,在驗(yàn)證集C上評(píng)估C ,接下來,模型在A和C組合起來的訓(xùn)練集上訓(xùn)練,在驗(yàn)證集B上評(píng)估,等等。模型的表現(xiàn)是三個(gè)的平均。
然而,交叉驗(yàn)證的問題在于,它很少適用于現(xiàn)實(shí)世界中的問題,原因如上述各節(jié)所述。交叉驗(yàn)證只在可以隨機(jī)打亂數(shù)據(jù)以選擇驗(yàn)證集的情況下有效。
Kaggle的“訓(xùn)練數(shù)據(jù)集”=你的訓(xùn)練數(shù)據(jù)+驗(yàn)證數(shù)據(jù)
Kaggle競(jìng)賽的一大優(yōu)點(diǎn)是,它迫使你更嚴(yán)格地考慮驗(yàn)證集(以便做得更好)。對(duì)于那些剛接觸Kaggle的人來說,這是一個(gè)舉辦機(jī)器學(xué)習(xí)競(jìng)賽的平臺(tái)。Kaggle通常將數(shù)據(jù)分成兩組,你可以下載:
一個(gè)訓(xùn)練集,其中包括自變量,以及因變量(你試圖預(yù)測(cè)什么)。例如,厄瓜多爾雜貨店試圖預(yù)測(cè)銷售額,自變量包括商店id、商品id和日期,因變量是賣出的數(shù)量。例如,試圖確定一個(gè)司機(jī)是否在開車時(shí)做出了危險(xiǎn)的行為,自變量可以是司機(jī)的照片,因變量是一個(gè)類別(如發(fā)短信、吃東西或安全向前看)。
一個(gè)測(cè)試集,它只有自變量。你將對(duì)測(cè)試集進(jìn)行預(yù)測(cè),你可以將這些預(yù)測(cè)提交給Kaggle,并得到你的成績(jī)分?jǐn)?shù)。
這是開始機(jī)器學(xué)習(xí)所需要的基本思想,但是要想做得好,需要理解的復(fù)雜性要大一些。你會(huì)希望創(chuàng)建自己的訓(xùn)練和驗(yàn)證集(通過分割Kaggle“訓(xùn)練”數(shù)據(jù))。你只需使用較小的訓(xùn)練集(Kaggle訓(xùn)練數(shù)據(jù)的子集)來構(gòu)建模型,在提交給Kaggle之前,你可以在驗(yàn)證集(Kaggle訓(xùn)練數(shù)據(jù)的子集)上對(duì)其進(jìn)行評(píng)估。
最重要的原因是Kaggle將測(cè)試數(shù)據(jù)分為兩組:public和private排行榜。你在public排行榜上看到的分?jǐn)?shù)只是你預(yù)測(cè)的一部分(你不知道是哪一部分!)你的預(yù)測(cè)在private排行榜上的表現(xiàn)要到比賽結(jié)束后才會(huì)揭曉。這很重要的原因是,你可能最終會(huì)過擬合public排行榜,直到最后你在private排行榜上表現(xiàn)不佳時(shí),你才會(huì)意識(shí)到這一點(diǎn)。使用良好的驗(yàn)證集可以防止這種情況。你可以通過查看你的模型在Kaggle測(cè)試集上的得分是否與驗(yàn)證集上的得分相似來檢查驗(yàn)證集是否良好。
創(chuàng)建自己的驗(yàn)證集很重要的另一個(gè)原因是,Kaggle限制你每天只能提交兩次,而且你可能希望嘗試更多次。第三,看看你在驗(yàn)證集上到底做錯(cuò)了什么是很有啟發(fā)性的,Kaggle不會(huì)告訴你測(cè)試集的正確答案,甚至不會(huì)告訴你你做錯(cuò)了哪些數(shù)據(jù)點(diǎn),只會(huì)告訴你你的總成績(jī)。
理解這些區(qū)別不僅對(duì)Kaggle有用。在任何預(yù)測(cè)機(jī)器學(xué)習(xí)項(xiàng)目中,你都希望你的模型能夠在新數(shù)據(jù)上表現(xiàn)良好。
—END—
英文原文:https://www.fast.ai/2017/11/13/validation-sets/
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)在線手冊(cè)AI基礎(chǔ)下載(pdf更新到25集)備注:加入本站微信群或者qq群,請(qǐng)回復(fù)“加群”獲取一折本站知識(shí)星球優(yōu)惠券,請(qǐng)回復(fù)“知識(shí)星球”
喜歡文章,點(diǎn)個(gè)在看
總結(jié)
以上是生活随笔為你收集整理的机器学习技巧:如何(以及为什么需要)创建一个好的验证集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Github标星66.6k+:常见数据结
- 下一篇: 【论文浅析】Semi-supervise