在上一部影片 你看到了開發集和測試集必須來自相同的分布 但,該取多少資料呢? 關於開發/測試集 設置的準則在深度學習的年代已有所變 讓我們看看實務上最好的作法 你可能聽過機器學習的某個法則: 把你所有的資料 分成 70%, 30% 變成訓練和測試集 或者把訓練/開發/測試集設成 你可能會用 60% 做訓練、20% 開發、20% 測試 在機器學習的早期 這是相當合理的 特別是當時資料數量還很少 如果你總共有一百筆資料 這種 70/30 或 60/20/20 準則很合理 如果你有一千筆 或者有一萬筆資料 這種慣例也不會太奇怪 但在現今的年代 我們已經習慣用更多的資料 假設你有一百萬筆的資料 這樣分資料會更合理: 你把 98% 當成訓練集 1% 來開發,1% 來測試 我用 D 和 T 代表開發集 (dev) 和測試集 (test) 因為如果有一百萬筆資料 那百分之一 就是一萬筆資料,這用來開發/測試已經足夠了 因此,在現今深度學習的年代,資料時常超大 用其中遠小於 20 或 30% 的資料 來當作開發或測試,這也很合理 因為深度學習演算法需要很大量的資料,我發現 那些需要大量資料的問題 其資料有很大一部份都用在訓練上。 那麼,測試集呢? 還記得測試集的目的在於 當你的系統開發完畢 測試集可以評量最終的系統有多好 所以準則是,讓你的測試集夠大到足以 評估出讓人信服的成效 因此,除非你必須知道 非常準確的系統成效 否則你大概不需要百萬等級的測試集 或許對於你的應用程式,一萬筆資料 就能讓你有信心知道成效 抑或是十萬筆之類的,只要夠用就好 這可能會比 你整個資料的 30% 還少 看你有多少資料。 在某些應用 你可能不需要對最終系統的成效有很高的信心 也許你只需要訓練和開發集 我覺得沒有測試集應該也ok 實際上,有時碰到的情況是 當有人在講 "train-test splits" (分成訓練/測試),可是他們真正在做的 是對測試集反覆測試 這樣並不叫測試集 其實這樣是 "train-dev split" (分成訓練/開發),沒有測試集 如果你拿這個來調整系統 開發集也好、測試集也好 — 其實最好稱之為「開發集」。 雖然我想,以前做機器學習的人 不是所有人對名稱都很講究 會把這樣的情況稱之為開發集。 不過如果你只想要訓練些資料 拿些資料來調整系統 然後就想要推出你的產品 而並不在乎最終效果如何 那麼,這樣我覺得稱之「訓練/開發」 並提醒說沒有「測試」資料,這樣比較恰當。 這會很奇怪嗎? 我絕對不是建議不要用測試集。當我在做系統, 有單獨的測試集我會比較安心 在推出產品前,可以拿它得到比較公正的估計 不過,如果你的開發集很大 你覺得你不會太 overfit (過適) 你的開發集 或許只有訓練/開發集也不會不合理 雖然我通常不會建議這樣。 總結一下,在大數據的時代 我認為 70/30 這種舊的經驗 已經不適用了 趨勢是使用更多的資料來訓練;較少的資料當開發/測試 特別是你的資料集非常大的時候 準則現在是,讓開發資料多到足以達成目的即可: 能幫助你評估各種想法,挑選最好的。 而測試資料的目的是:對最終產出的分類器做評量 測試集的大小只要能達到這目的即可 而這可能會比 30% 還要來的少。 那麼,我希望這能給你一些指引、建議 在深度學習的年代來準備你的開發和測試集。 接下來:其實有時候 在解機器學習的過程中 你可能會想要改變你的衡量指標 或是更改開發和測試集 且讓我們談談什麼時候會想這樣做