1.The validation set approach(設置驗證集)
就是說,在訓練時,留出來一部分作爲驗證集(不參與訓練),隨時檢測網絡訓練情況。我的做法是,每個epoch訓練完後,都是用驗證集進行驗證,通過觀察驗證集來驗證網絡訓練情況。
from sklearn.model_selection import train_test_split
2. Leave one out cross validation (LOOCV)(留一交叉驗證)
只留下一個數據作爲驗證集,使用剩餘所有數據進行訓練;循環這個過程,直到每個數據當過一次驗證集。
優缺點:
1)由於訓練數據較多(只保留一個作爲驗證集),所以網絡bias較小。(網絡bias是指網絡預測準確性)。
3)由於只有一個數據進行驗證,驗證模型有效性的variation較大。也就是說,對模型的估計受這個驗證點的影響較大,如果這個點是奇異點。
from sklearn.model_selection import LeaveOneOut
3. LPOCV (Leave P Out Cross Validation)
當然我們可以留下P個點作爲驗證集。
4. k-fold cross validation
主要是K的選取。太大不行,太小也不行。K小,導致模型bias較大,因爲訓練數據較少。K大導致方差較大。其實,如果K等於2,相當於第一種驗證;K等於n,相當於留一交叉驗證。
from sklearn.model_selection import KFold
5. Stratified k-fold cross validation
就是說,保持每個fold的訓練數據裏邊包含每類數據,類別平衡。這種方法可以很好的同時處理bias和variance。因爲隨機選取的每個fold的類別可能是不平衡的。
from sklearn.model_selection import StratifiedKFold
6. k-fold cross validation with repetition
但是如果訓練數據不具有很強的代表性,使用 stratified k-fold 可能不好。在這種情況下我們使用重複的k-fold cross validation。重複進行n次k-fold cross validation。
from sklearn.model_selection import RepeatedKFold
7. Adversarial validation(對抗驗證)
處理的是,訓練集和測試集差異性較大,此時驗證集已經不適合評價該模型了,因爲驗證集來源於訓練集。所以我們需要一個驗證集能夠,代表測試集。
基本思想就是,通過一個具有區分力的分類器,選出被分類器分錯的訓練集,認爲這些數據和測試集很像,作爲驗證集。
具體操作:將訓練集和測試集分別進行2類別標記。比如,訓練集類別設爲0,測試集類別爲1。然後將這兩部分數據進行混合,再分爲新的訓練集和測試集,使用新的訓練集訓練一個2分類網絡,對新的測試數據進行測試,選擇新的測試集裏邊原來的訓練集數據得分進行排序,選出得分最差的所需數量的數據作爲我們需要的驗證集。爲什麼這麼操作,是因爲,我們認爲選出的這些數據和測試集最接近。
但是得謹慎使用這種技術。因爲如果一旦原來的測試數據改變的話,選出來的驗證集就很可能不是一個好的驗證集了,最好重新選擇。
8. Cross Validation for time series
對於時間序列數據,我們就不能隨機打亂了。那麼是時間序列數據的交叉驗證是如何操作的呢?
使用前向鏈進行生成交叉驗證。比如:連續時間的股價爲:x_1,x_2,x_3,x_4,x_5,x_6。
fold1:訓練數據x_1,測試數據x_2;
fold2:訓練數據x_1,x_2,測試數據x_3;
fold1:訓練數據x_1,x_2,x_3,測試數據x_4;
……
每個fold的測試數據可以是訓練數據之後緊挨着的一個,也可以是後邊的某一個。比如上邊fold1的測試數據可以爲x_4。這取決於我們是否使用multi-step forecast來評估我們的模型。
最後,我們使用k折交叉驗證的k個error來計算bias和variance。