當我們訓練好乙個模型時,我們不只希望這個模型只在訓練集上表現的好,更重要的是希望這個模型後續能表現的好,這時候就需要測試集,用於評估這個模型的泛化能力。
通常情況下,我們將資料以8:2的比例分割訓練集和測試集。
在演算法模型中,我們還要使用正則化技術,避免過擬合。其中乙個做法就是使用100個不同超引數訓練100個模型,這時候,我們得到了最佳超引數,生成的泛化誤差也是最小的,假設只有2%,而當你將這個演算法投入的生產環境中卻發現,誤差高達12%,這是為什麼呢?
這是因為你對測試集的發話誤差做了多次度量,並調整模型和引數來擬合測試集得到的最佳模型,也就是說這個演算法模型更多是為了測試集準備的,因此在新資料前面往往得不到良好的表現。
解決這個方法,就是通過分層取樣在訓練集中分出乙個驗證集。這樣,我們同樣適用多個不同的超引數,然後通過驗證集,選擇最好的模型及其超引數,最後使用測試集進行一遍測試,並且得到泛化誤差的估值。
注意:比較不同模型時,只能通過相同測試集進行比較。
訓練集、測試集、驗證集三者最好不要重疊。
k為了避免驗證集浪費太多訓練資料,我們常用的技術就是k折交叉驗證。kk折交叉驗證的目的是:
根本原因:資料有限,單一的把資料都用來訓練模型,容易過擬合。(反之,如果資料夠多,可以不使用交叉驗證)。
理論上,使用交叉驗證,模型方差「應該是降低了」,即,理想情況下,認為k
kk折交叉驗證可以降低模型方差,從而提高模型泛化能力。
步驟: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完成後...