天天看點

【入門篇】如何正确使用機器學習中的訓練集、驗證集和測試集?

【注】

·本文為轉載文章,原文作者是王樹義老師,原文連結為 https://zhuanlan.zhihu.com/p/71961236

訓練集、驗證集和測試集,林林總總的資料集合類型,到底該怎麼選、怎麼用?看過這篇教程後,你就能遊刃有餘地處理它們了。

問題

審稿的時候,不止一次,我遇到作者

錯誤使用

資料集合跑模型準确率,并和他人成果比較的情況。

他們的研究創意有的很新穎,應用價值較高,工作可能也做了着實不少。

但因對比方法錯誤,得出來的結果,不具備說服力。幾乎全部都需要

返工

這裡,我幫你梳理一下,該怎麼使用不同的資料集合:

  • 訓練集(training set)
  • 驗證集(validation set)
  • 測試集(test set)

目的隻有一個——避免你

踩同樣的坑

其實這個問題,咱們之前的教程文章,已有涉及。

《如何用 Python 和深度遷移學習做文本分類?》一文中,我曾經給你布置了一個類似的問題。

在文章的末尾,我們對比了當時近期研究中, Yelp 情感分類的最佳結果。

下表來自于:Shen, D., Wang, G., Wang, W., Min, M. R., Su, Q., Zhang, Y., … & Carin, L. (2018). Baseline needs more love: On simple word-embedding-based models and associated pooling mechanisms. arXiv preprint arXiv:1805.09843.

【入門篇】如何正确使用機器學習中的訓練集、驗證集和測試集?

注意這裡最高的準确率(Accuracy)數值,是 95.81 。

我們當時的模型,在驗證集上,可以獲得的準确率,是這個樣子的:

【入門篇】如何正确使用機器學習中的訓練集、驗證集和測試集?

97.28%,着實不低啊!

于是我問你:

咱們這種對比,是否科學?

當時的

答案是什麼?

這麼久過去了,又看了那麼多新的教程和論文,你的答案發生變化了嗎?

現在咱們公布一下答案吧。

不科學

為什麼?

因為

對比方法

有問題。

方法

原文中有這樣一句:

這裡資料集隻提供了訓練集和“測試集”,是以我們把這個“測試集”當做驗證集來使用。

作為示範,資料集咱們想怎麼用,就可以怎麼用。

甚至你把測試集拿來做訓練,然後在訓練集上跑測試,都沒有人管。

但是寫學術論文,聲稱你的模型優于已有研究,卻絕不能這麼草率。

注意,比較模型效能數值結果時,你隻能拿不同的模型,在

同樣的測試集

上面比。

測試集不同,當然不可以。

但模型A用測試集,模型B用驗證集(與A的測試集資料完全一緻)比,可以嗎?

很多人就會混淆了,覺得沒問題啊。既然資料都一樣,管它叫做什麼名稱呢?

可是請你注意,哪怕A模型用的測試集,就是B模型用的驗證集,你也

不能

把這兩個集合跑出來的結果放在一起比較。

因為這是

作弊

你可能覺得我這樣說,頗有些吹毛求疵的意味。

咱們下面就來重新梳理一下,不同資料集合的作用。

希望你是以能看清楚,這種似乎過于嚴苛的要求,其實是很有道理的。

咱們從測試集開始談,繼而是驗證集,最後是訓練集。

這樣“倒過來說”的好處,是會讓你了解起來,更加透徹。

先說

測試集

吧。

測試

隻有在

同樣的測試集

上,兩個(或以上)模型的對比才有效。

這就如同參加聯考,兩個人考同樣一張卷子,分數才能對比。

甲拿A地區的卷子,考了600分,乙拿B地區的卷子,考了580分。你能不能說,甲比乙成績高?

不行吧。

為了讓大家更易于比較自己的模型效果,許多不同領域的資料集,都已開放了。而且開放的時候,都會給你指明,哪些資料用于訓練,哪些用于測試。

以 Yelp 資料為例。

【入門篇】如何正确使用機器學習中的訓練集、驗證集和測試集?

在 AWS 上存儲的 fast.ai 公開資料集中,訓練集和測試集都已為你準備好。

你不需要自己進行劃分。

大家達成共識,做研究、寫論文,都用這個測試集來比拼,就可以。

是以,如果你的研究,是靠着比别人的模型效果來說事兒,那就一定先要弄明白

對方的測試集

是什麼。

但是,這個聽起來很容易達成的目标,實踐中卻很容易遇到困難。

因為有的人寫論文,喜歡把資料和代碼藏着掖着,生怕别人用了去。

他們一般隻提一下,是在某個公開資料集上切了一部分出來,作為測試集。

測試資料集不釋出,切分方法(包括工具)和随機種子選取辦法也不公開。

這是非常不靠譜的行為,純屬自娛自樂。

作為嚴肅的審稿人,根本就

不應該允許

這樣的研究發表。

因為機器學習研究的資料集不開放,便基本上沒有

可重複性

(Reproducibility)。

如果你沒有辦法精确重複他的模型訓練和測試過程,那麼他想彙報多高的準确率,就純憑個人愛好了。

當然,我們不是活在理想世界的。

你在某一個領域,用機器學習做應用研究的時候,面對這種無法重複已發表論文的情境,該怎麼辦?

直接用他聲稱的結果與你的實際運作結果比較,你可能是在追逐海市蜃樓。累到氣喘籲籲,甚至懷疑自我的程度,也徒勞無功。

忽視它?

也不行。

審稿人那關你過不去。

人家會說,某某研究跟你用的是一樣的資料,準确率已經達到98%,你的才96%,有什麼發表的意義呢?

看,左右為難不是?

其實解決辦法很簡單。

不要考慮對方聲稱達到了多高準确率。把他提供給你的資料全集,自行切分。之後

複現對方的模型

,重新跑。

模型架構,一般都是要求彙報的,是以這幾乎不是問題。

至于這種複現,越是複雜的模型,我越推薦你用 PyTorch 。

之後把你的模型,和複現的對方模型在同樣的測試集上做對比,就可以了。

當然,論文裡要寫上一句:

由于某篇文章未提供代碼與具體資料切分說明,帶來可重複性問題,我們不得不獨立複現了其模型,并在測試集完全一緻的情況下,進行了比對。

這裡多說一句,一定要保證你自己的研究,是

可重複

的。

不要怕公布你的代碼和資料。它們不是你的獨門暗器,而是

支撐你研究的憑據

回看我們前面提到的 Yelp 公開資料的例子。

【入門篇】如何正确使用機器學習中的訓練集、驗證集和測試集?

這時候你會發現一個奇怪的問題——為什麼它隻有訓練集和測試集?

我們一直反複提到的

驗證集

哪裡去了?

驗證

驗證集,就如同聯考的模拟考試。

不同于聯考,模拟考隻是你調整自己狀态的訓示器而已。

狀态不夠滿意,你可以繼續調整。

當然,參加過聯考的同學都有經驗——這種調整的結果(從模拟考到聯考),有可能更好,也有可能更糟糕。

回到機器學習上,那就是測試集上檢驗的,是你

最終模型

的性能。

什麼叫“最終模型”?

就是你參加聯考時候的狀态。包括你當時的知識儲備、情緒心态,以及當天的外部環境(溫度、濕度、東西是否帶齊)等。

最終模型,隻有

一個

就如同每年的聯考,你

隻能參加一回

考成什麼樣兒,就是什麼樣。

而驗證集上跑的,實際上卻是一個模型

集合

,集合的大小,你可能數都數不過來。

因為這裡存在着超參數(hyper-parameter)設定的問題。不同超參數組合,就對應着不同的潛在模型。

驗證集的存在,是為了從這

一堆可能的模型

中,幫你表現最好的那個。

注意這裡的表現,是指在

驗證集

上的表現。

好比說,有個超參數叫做訓練輪數(epochs)。

在同樣的訓練集上,訓練3輪和訓練10輪,結果可能是不一樣的模型。它們的參數并不相同。

那麼到底是訓練3輪好,還是10輪好?

或者二者都不好,應該訓練6輪?

這種決策,就需要在訓練後,在驗證集上“是騾子是馬牽出來溜溜”。

如果發現訓練3輪效果更好,那麼就應該丢棄掉訓練6輪、10輪的潛在模型,隻用訓練3輪的結果。

這對應着一種機器學習正則化(Regularization)方式——提早停止訓練(early stopping)。

其他的超參數選取,你也可以舉一反三。總之就是按照驗證集的效果,來選超參數,進而決定最終模型。

下一步,自然就是把它交給測試集,去檢驗。這個我們前面已經詳細講解過了。

至于這個最終選擇模型,在新資料集(測試集)上表現如何,沒人能打包票。

是以,回到咱們之前的問題。在《如何用 Python 和深度遷移學習做文本分類?》一文中,我故意用

驗證集

上篩選出的最好模型,在

驗證集

上跑出來分數,當成是

測試

成績,這顯然是不妥當的。

你不能把同樣的題做他個三五遍,然後從中找最高分去跟别人比。

即便你的模拟考,用的是别人的聯考真題。兩張卷子完全一樣,也

沒有

說服力。

是以你看,驗證集的目的,不是比拼最終模型效果的。

是以,怎麼設定驗證集,劃分多少資料做驗證,其實是每個研究者需要獨立作出的決策,不應該強行設定為一緻。

這就如同我們不會在聯考前去檢查每個考生,是否做過一樣多的模拟試卷,且試卷内容也要一緻。

極端點兒說,即便一個考生沒參加過模拟考,可聯考成績突出,你也不能不算他的成績,對吧?

不過,講到這裡,我們就得要把訓練集拿進來,一起說說了。

訓練

如果測試集是聯考試卷,驗證集是模拟考試卷,那麼訓練集呢?

大概包括很多東西,例如作業題、練習題。

另外,我們上高三那時候(噫籲嚱,已經上個世紀的事兒了),每周有“統練”,每月有“月考”。也都可以劃定在訓練集的範疇。

減負這麼多年以後,現在的高中生應該沒有那麼辛苦了吧?真羨慕他們。

這樣一對比,你大概能了解這幾個集合之間本應有的關系。

學生平時練題,最希望的,就是考試能碰到

原題

,這樣就可以保證不必動腦,卻做出正确答案。

是以,出模拟考卷時,老師盡量要保證不要出現學生平時練過的題目,否則無法正确估量學生目前的複習備考狀态,噪聲過高容易誤事兒。

驗證集和訓練集,應該是

不交疊

的。這樣選擇模型的時候,才可以避免被資料交疊的因素幹擾。

每個學校的模拟考,卻都恨不得能押中聯考的題。這樣可以保證本校學生在聯考中,可以“見多識廣”,取得更高分數。

聯考出卷子的老師,就必須盡力保證題目是全新的,以篩選出有能力的學生,而不是為高校選拔一批“見過題目,并且記住了标準答案”的學生。

是以,測試集應該既不同于訓練集,又不同于驗證集。

換句話說,三個資料集合,最好都沒有重疊。

學生應該學會舉一反三,學會的是知識和規律。

用知識和規律,去處理新的問題。

我們對機器模型的期許,其實也一樣。

在學術論文中,你見到的大部分用于機器學習模型對比的公開資料集(例如 fast.ai 公開資料集中的 Yelp, IMDB, ImageNet 等),都符合這一要求。

然而,例外肯定是有的。

例如我在 INFO 5731 課程裡面給學生布置的某期末項目備選項,來源于某學術類資料科學競賽,目标是社交媒體醫學名詞歸一化。

其中就有資料,既出現在了訓練集,又出現在了驗證集,甚至測試集裡也會有。

面對這種問題,你該怎麼辦?

你怎麼判斷自己的模型,究竟是強行記住了答案,還是掌握了文本中的規律?

這個問題,作為思考題留給你。

我希望在知識星球中和熱愛學習的你,做進一步讨論。

另外的一個問題,是訓練集要不要和别人的

完全一緻

一般來說,如果你要強調自己的模型優于其他人,那麼就要保證是在

同樣的

訓練集上訓練出來。

回顧深度學習的三大要素:

  • 資料(Data)
  • 架構(Architecture)
  • 損失(Loss)

如果你的訓練資料,比别人多得多,那麼模型自然見多識廣。

對于深度學習而言,如果訓練資料豐富,就可以顯著避免過拟合(Overfitting)的發生。

GPT-2 模型,就是因為具備了海量 Reddit 資料做訓練,才能傲視其他語言模型(Language Model),甚至以安全為理由,拒絕開放模型。

但是這時候,你跟别人橫向比較,似乎就不大公平了。

你的架構設計,未必更好。假使對方用同樣多的資料訓練,結果可能不必你差,甚至會更優。

這就如同一個複讀了5年的學生甲,充分利用每一分每一秒,做了比應屆生乙多5倍的卷子。結果在聯考的時候,甲比乙多考了1分(同一張卷子)。

你能說甲比乙更有學習能力,學習效果更好嗎?

小結

這篇教程裡,我為你梳理了機器學習中常見的三種不同資料集類别,即:

  • 訓練集
  • 驗證集
  • 測試集

咱們一一分析了其作用,并且用“考試”這個大多數人都參加過,且容易了解的例子做了诠釋。

希望讀過本文之後,你的概念架構更為清晰,不再會誤用它們,避免給自己的研究挖坑。

祝深度學習愉快,論文發表順利哦!

繼續閱讀