訓練集 測試集 驗證集與交叉驗證

2021-10-01 12:22:41 字數 1829 閱讀 6129

當我們訓練好乙個模型時,我們不只希望這個模型只在訓練集上表現的好,更重要的是希望這個模型後續能表現的好,這時候就需要測試集,用於評估這個模型的泛化能力。

通常情況下,我們將資料以8:2的比例分割訓練集和測試集。

在演算法模型中,我們還要使用正則化技術,避免過擬合。其中乙個做法就是使用100個不同超引數訓練100個模型,這時候,我們得到了最佳超引數,生成的泛化誤差也是最小的,假設只有2%,而當你將這個演算法投入的生產環境中卻發現,誤差高達12%,這是為什麼呢?

這是因為你對測試集的發話誤差做了多次度量,並調整模型和引數來擬合測試集得到的最佳模型,也就是說這個演算法模型更多是為了測試集準備的,因此在新資料前面往往得不到良好的表現。

解決這個方法,就是通過分層取樣在訓練集中分出乙個驗證集。這樣,我們同樣適用多個不同的超引數,然後通過驗證集,選擇最好的模型及其超引數,最後使用測試集進行一遍測試,並且得到泛化誤差的估值。

注意:

比較不同模型時,只能通過相同測試集進行比較。

訓練集、測試集、驗證集三者最好不要重疊。

k

kk折交叉驗證的目的是:

根本原因:資料有限,單一的把資料都用來訓練模型,容易過擬合。(反之,如果資料夠多,可以不使用交叉驗證)。

理論上,使用交叉驗證,模型方差「應該是降低了」,即,理想情況下,認為k

kk折交叉驗證可以降低模型方差,從而提高模型泛化能力。

為了避免驗證集浪費太多訓練資料,我們常用的技術就是k折交叉驗證。

步驟:step1:先將資料集d劃分成k個大小相似的互斥子集:d=d

1∪d2

∪d3∪

d4∪.

..∪d

kd=d_1∪d_2∪d_3∪d_4∪...∪d_k

d=d1​∪

d2​∪

d3​∪

d4​∪

...∪

dk​,同時di∩

dj=∅

(i≠j

)d_i∩d_j=∅(i≠j)

di​∩dj

​=∅(

i​=

j),每個子集d

id_i

di​都盡可能保持資料分布的一致性,即從d

dd中通過分層取樣得到。

step2:用k−1

k-1k−

1個子集的並集作為訓練集,餘下的子集作為驗證集,這樣就可以獲得k

kk組訓練集/測試集,從而可進行k

kk次訓練和測試,最終返回的是這k

kk個測試結果的均值。

來自:顯然,交叉驗證法評估結果的穩定性和保真性很大程度上取決於k

kk,因此也被稱為「k

kk折交叉驗證」。k

kk最常用的取值是10。

k

kk越大,偏差越小,方差越大,模型學習效果差。

k

kk越小,偏差越大,方差越小,模型容易過擬合。

與留出法類似,k

kk將資料集d

dd劃分為k

kk個子集,同樣存在多種劃分方式,為減小因為樣本劃分不同而引入的差異,k

kk折交叉驗證通常要隨機使用不同的劃分重複p次,最終評估結果是這p

pp次k

kk折交叉驗證結果的均值,常見的有「10次10折交叉驗證」(即進行了10*10=100次 訓練/測試)。

訓練集 測試集 驗證集與交叉驗證

初學者對於訓練集 train set 測試集 test set 驗證集 validation set 這三個概念和應用非常容易搞混,這裡我結合各種博文和書籍上的講解進行總結 參與訓練,模型從訓練集中學習經驗,從而不斷減小訓練誤差。這個最容易理解,一般沒什麼疑惑。不參與訓練,用於在訓練過程中檢驗模型的...

訓練集,驗證集,測試集,K折交叉驗證

有了模型後,訓練集就是用來訓練引數的,說準確點,一般是用來梯度下降的。而驗證集基本是在每個epoch完成後,用來測試一下當前模型的準確率。因為驗證集跟訓練集沒有交集,因此這個準確率是可靠的。那麼為啥還需要乙個測試集呢?這就需要區分一下模型的各種引數了。事實上,對於乙個模型來說,其引數可以分為普通引數...

訓練集 驗證集 測試集

訓練集loss 驗證集loss 測試集loss 乙個好的網路,二者的差距應該是很低的。但一般情況下因為網路不可避免地存在一定程度上的過擬合,所以肯定是train loss低於test lost,但如果低太多,就得考慮是過擬合的問題還是因為樣本的特徵空間不統一的問題。驗證集基本是在每個epoch完成後...