訓練集、驗證集、測試集的劃分
前言
在使用資料集訓練模型之前,我們需要先將整個資料集分為訓練集、驗證集、測試集
。訓練集是用來訓練模型的,通過嘗試不同的方法和思路使用訓練集來訓練不同的模型,再通過驗證集使用交叉驗證來挑選最優的模型,通過不斷的迭代來改善模型在驗證集上的效能,最後再通過測試集來評估模型的效能。如果資料集劃分的好,可以提高模型的應用速度。如果劃分的不好則會大大影響模型的應用的部署,甚至可能會使得我們之後所做的工作功虧一簣。本文討論如何通過資料集分佈和資料集大小
兩個方面來劃分資料集,文章中主要的內容來自於deeplearnl ai教程。
資料集分佈
我們現在有8個不同區域的資料,需要通過這些資料來訓練一個分類模型,那麼我們應該如何來利用這些資料集來劃分訓練集、驗證集和測試集?
我們可以從8個不同區域中隨機選4個區域來組成訓練集,然後再選擇剩下的4個區域來組成測試集。其實這種劃分的方式存在一個問題,那就是訓練集和測試集的資料分佈可能不相同,那麼必定會導致一個問題,模型在訓練集上的表現會非常的好,而在測試集上表現可能不會那麼理想。通過訓練資料來訓練模型,就是希望模型能夠從訓練集中學習到資料的分佈,如果訓練集和測試集資料不在同一個分佈中,那麼模型在測試集上的表現肯定是不會理想的。所以最佳的劃分方式應該是:先將這8個不同區域的資料都打亂混合在一起,然後再將資料集分為訓練集、驗證集和測試集,這樣就能保證它們都處於同一分佈中。
為什麼需要保證訓練集和測試集在同一分佈中?
我們將訓練出來的模型理解成為一個尋找靶心的過程,通過訓練集不同的訓練,然後調整超參和使用不同的演算法來提高模型效能的過程理解為想靶心逼近的過程。如果想要在測試集也要像有訓練集上的表現,那麼測試集的靶心也需要和訓練集的靶心位於同一位置。如果測試集的靶心相對訓練集的靶心有所移動,那麼模型在訓練集上的表現是10環的話,在測試集上的表現可能就只有8環、9環甚至更低。這個例子中的靶心分佈就是資料集的資料分佈。
資料集的大小
除了資料的分佈對於資料集的劃分有影響之外,資料集的大小也對於資料集劃分也有影響。不同規模的資料集可能訓練集、驗證集、測試集的劃分會有所不同。
- 小規模資料集資料的劃分
在傳統的機器學習中,我們聽過
70%/30%
的劃分原則,就是指將整個資料集中的70%用於模型的訓練也就是訓練集
,整個資料集中的30%用於模型的測試也就是測試集
,其實這裡的測試集被稱為驗證集或者開發集會更適合。如果想要加入驗證集,可能劃分標準就改成了60%/20%/20%
,也就是指將整個資料集的60%劃分為訓練集,20%劃分為驗證集,20%劃分為驗證集。以上的兩種劃分標準只適用於小規模的資料集,如果對於上百萬、甚至上千萬規模的資料集可能需要修改資料集的劃分原則。
- 大規模資料集資料的劃分
我們現在所處的是大資料時代,所以很多資料集的資料規模都是上百萬甚至上億,而且如果想要獲取一個好的模型是離不開大資料的。面對這種大規模的資料集時,傳統的資料劃分原則已經不適用了,
驗證集和測試集的劃分可以低於30%和20%
。對於百萬級別的資料集,我們可以採用98%/1%/1%
的規則來劃分資料集。
- 建議
在有些資料集的劃分中,沒有
真正的測試集
,也就是隻有訓練集和測試集。利用訓練集來訓練模型,然後通過測試模型在測試集上的表現來調整超參和採用不同的策略來提高模型在測試集上的表現,而沒有真正的測試集來評估模型的效能,缺少真正的測試集可能會導致模型過擬合,使用這種方式在測試集上所獲取的模型評估是不可靠的。建議不要省略驗證集,利用驗證集來調整模型,利用測試集來評估模型的指標。如果模型上線的指標要求比較高時,可以適當的加大測試集的數量以此來獲取更高精度的評估指標,建議不要超過30%。