1. 訓練集、開發集、測試集(Train/Dev/Test sets)

1.在以往的機器學習中

如上圖所示,以往機器學習中,對訓練集、開發集、測試集的劃分比例爲60/20/20,如此劃分通常可以獲得較好的效果。

訓練集(training set):訓練算法。

開發集(development set):調整參數、選擇特徵,以及對學習算法作出其它決定。

測試集(test set):開發集中選出的最優的模型在測試集上進行評估。不會據此改變學習算法或參數。

2.大數據時代

在如今的大數據時代,我們通常可以獲得龐大的數據集,比如1,000,000條數據,這種情況下,沒有必要選擇20%的數據量作爲開發集,另外20%數據量作爲測試集。通常我們選擇10,000條數據作爲開發集、10,000條數據作爲測試集就足夠了。即劃分比例:98/1/1。因爲開發集的目的是測試不同算法在其上的性能,選擇性能更好的算法,因此開發集數量足夠大足以評估不同算法並選擇較優算法即可。同樣地,測試集的目的是,給出最終的分類器,讓你對它的性能有一個非常自信的估計

3.訓練集和測試集分佈不一致的情況

比如你做了一個APP用於識別一張圖片是否是狗狗。訓練集使用的是來自網頁的圖片,而開發集和測試集可能是你的用戶通過APP上傳的圖片。網頁中的圖片通常分辨率高、清晰;而用戶上傳的可能分辨率低、採光不好。很明顯,訓練集和測試集分佈不一致。

只要確保:開發集和測試集服從同一分佈。那麼你會迭代的更快。

因爲測試集和開發集分佈不同的話,那麼在開發集上表現良好的算法不一定在測試集上表現優異。如果是這種情況,那麼大量針對開發集性能改進的工作將會是徒勞的。

如果你不是搞研究,而是想要在特定的機器學習應用上取得進展,建議儘可能選擇服從相同分佈的開發集和測試集數據。

4.沒有測試集也ok(只有開發集)

測試集的目的是給你一個無偏估計(unbiased estimate)來評價最終選擇的算法的性能。如果你不需要無偏估計,那麼沒有測試集也可以。

這種情況,你要做的就是:在訓練集上訓練算法,嘗試不同的model architectures。然後在開發集上評估模型,迭代直到選擇一個好的模型。

因爲你在開發集上擬合數據,這樣的話不會給你一個性能的無偏估計。如果你不需要的話,這樣做完全沒問題。

5.術語:大多數人習慣叫訓練集和測試集,實際上應該叫訓練集和開發集更準確

大多數人會把訓練集叫做訓練集,而把開發集叫做測試集,但是他們實際上做的事情是,把測試集當成了保留交叉驗證集(hold-out cross validation set)。這種提法對術語的使用並不準確,因爲測試集上會發生過擬合現象。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章