深度學習基礎——訓練集,驗證集和測試集(轉載)

轉自孫高飛,「發表於 TesterHome 」原始鏈接點我


前言

我們在模型訓練的時候通常會將我們所得到的數據分成三部分。 分別是training set, dev set(也叫validation set)和 test set。 在我們的模型調研過程中,他們分別起着不同的作用。training set用來訓練模型, dev set用來統計單一評估指標,調節參數, 選擇算法。 test set 則用來在最後整體評估模型的性能。

三者之間的關係與作用

如上圖,假設我們有一份數據,會將它按一定的規則進行拆分。其中training set和dev set分別輸入到了邏輯迴歸算法中,而test set則是在模型訓練結束後,被輸入到模型中評估結果。 我們可以根據report來看一下他們各自的作用。 尤其是dev set和test set,在很多文章中對他們的介紹很模棱兩可,讓人搞不明白他們之間到底有什麼區別。 給我的感覺就是寫文章的人也不懂,在那裏隨便寫寫罷了。 我們先看training set和dev set,因爲他們都被輸入到了模型訓練算法中。

 

上圖是模型訓練的report。 我們可以從中看到training set和dev set(圖中叫驗證集) 的auc指標。這裏便引入了dev set的作用, training set 很好理解,訓練模型用的。 而dev set的作用就是在這裏很方便的評估算法的單一評估指標,在這裏也就是auc,通過這個指標在training set和 dev set上的對比我們可以用來調整算法參數。 例如,如果training set的auc是0.9 而 dev set的auc確是0.6. 根據之前學到的我們很可能發生了過擬合的情況。 需要減少迭代次數或者設置L2正則來減少擬合。 又或者說我們發現訓練AUC和驗證AUC的數值都很低,例如只有0.6, 而loss(損失函數)仍然沒有收斂,我們可能要增加迭代次數或者是擴大數據集或者改變特徵。 這就是dev set的作用, 它是與training set一起被輸入到模型算法中但又不參與模型訓練,我們一邊訓練一邊在dev set上看auc。這樣相比於在test set上進行評估可以節省大量的時間。 我們在最開始的圖中可以看到,使用test set會增加額外的步驟。 在我們調參階段完全沒有必要。只有當我們覺得當前的模型在dev set的效果已經差不多的時候,纔會使用test set進一步驗證模型性能。 那麼dev set和training set有什麼區別麼? 看上去好像都是用來評估模型好壞的,特意在test set上進行驗證又有什麼用呢? 因爲test set 能夠提供更多的評估模型的指標。 我們之前說過評估一個分類器有混淆矩陣,有ROC,有召回,精準,F1 Scroe等。 這些都是在dev set上不做統計的,dev set上只統計單一評估指標,也就是AUC。 例如下面是test set的評估報告

 

 

總結一下

我們用training set做訓練, dev set來初步評估結果,這裏的評估結果是單一評估指標,也就是對模型來說最重要的一個指標,在這裏我們使用AUC。 這麼做的優點是dev set跟隨training set一起被輸入到模型算法中但又不參與模型訓練。只是用來快速評估AUC的, 在調參階段我們會不停的改變參數值來調整模型,而dev set就能幫助我們快速的查看結果。 相反的test set的作用並不是快速查看結果的,它提供一個模型的完整評估報告。可以更好的從多個維度評價模型的性能,但缺點是要做很多其他的操作,比較費時。我們一般在dev set上把參數調整的差不多後,纔會使用到test set。

數據拆分的規則

數據量的拆分

現在我們知道要把數據拆分成3份,那麼我們需要有一定的規則拆分數據集。 在老的規則裏,也就是大數據時代之前。可能的規則是數據按照8:1:1來拆分。dev set和test set不能太小,小了不能很好的評估模型效果。 但這個規則是建立在數據集比較小的情況下,例如只有1w條數據或者更小。 在大數據時代小,我們一般面臨的都是百萬級甚至億級的數據量。這時候的拆分規則就會變化一下。比如我們有一百萬行的數據,那麼這時候的拆分就不能按照8:1:1來了。 可能是98%:1%:1%的規則比較合適,因爲百萬級的數據即便只有1%也有一萬行,用來評估模型效果已經有了比較不錯的效果。把更多的數據留給training set來獲得更好的模型是比較好的選擇。

數據分佈的拆分

我們的數據都是有業務含義的。 所以我們拆分的時候出了要考慮數據量以外可能還要考慮一些場景。 首先說dev set和test set,他們都是用來評估模型性能的,所以一定要保證他們的數據處於同一分佈。 舉個例子說,如果我們統計的是8個國家的數據,如果我們選擇4個國家的數據作爲dev set, 另外4個國家作爲test set可以麼? 這是明顯不可以的,他們的數據處於不同的分佈上。 如果我們在這樣的dev set上進行調參並訓練模型。 那到了test set上的時候你會發現模型效果極其的差。 所以我們要牢記於心的規則就是dev set和test set一定要處於同一分佈。 在這裏例子,我們要讓dev set和test set隨機的從所有國家中平均的抽取數據。 例如說每個國家有100份數據。 那麼我們要保證dev set和test set能在每個國家中都隨機抽取50份數據。

training set的抽取

那麼traning set呢? 理論上traning set最好也是要跟dev set和test set處於同一分佈的。但有些時候我們不能這麼做,比如說我們的數據是有時序性的。例如預測點擊率這種場景中,數據的時序性是很重要的。因爲新聞,視頻或者音頻等資源的時效性比較強。 這時候如果讓traning set 與dev set,test set處於同一分佈就會有問題。 例如如果我們從數據中隨機的拆分就會有問題。這樣拆分甚至會出現用未來的數據預測過去的行爲。 而我們希望的是用過去的數據預測未來的數據。 所以這時候我們應該做的是首先按時間把數據分成兩類----過去的數據和未來的數據, 或者說是按一個時間點拆分成兩種數據,處於這個時間點之前的數據作爲traning set。 這個時間點之後的數據作爲dev set和 test set。 這時候我們再按照上面的規則,保證dev set和test set處於同一分佈就好了。 所以關於training set的選擇要根據數據的業務場景來定。

 

 

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