各种交叉验证评价模型

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。

猜你喜欢

转载自blog.csdn.net/sunyao_123/article/details/80186601
今日推荐