,,详解python实现交叉验证法与留出法

,,详解python实现交叉验证法与留出法

本文主要介绍python实现交叉验证方法和预留方法的详细说明。文章通过示例代码非常详细,对大家的学习或者工作都有一定的参考价值。有需要的朋友下面跟边肖学习。

在机器学习中,我们经常在训练集上训练模型,在测试集上测试模型。最终目的是希望我们的模型能够在测试集上表现最好。

但是,我们往往只有一个包含M个观测值的数据集D,我们应该用它来进行训练和测试。此时,我们需要划分数据集d。

对于数据集D的划分,我们尽量满足三个要求:

足够的训练样本量

训练模型的计算量是可以容忍的。

不同的划分方式会导致不同的训练集和测试集,从而导致不同的结果。我们需要消除这种影响。

我们将介绍预留方法、交叉验证方法以及它们各自的python实现。自举将在下一篇文章中介绍。

1.留出法

预留法是最常用、最直接、最简单的方法。它直接将数据集D分成两个互斥的集合,其中一个用作训练集R,另一个用作测试集t。即

使用预留法时,需要注意:

要有足够的样本量来保证训练模型的效果。

划分时注意数据分布的一致性(比如500个样本中的正反例比例为2:3,那么训练集和测试集中的正反例比例也应该是2:3),只需要随机分层抽样即可。

为了减少随机划分的影响,训练集和测试集被重复划分,多次得到的结果被平均作为最终结果。

一般训练集与测试集的比例为8:2或7:3。

当然,预留法的缺点也很明显,就是它会损失一定的样本信息;同时需要大样本

Python实现了预留方法,只需要使用sklearn包。

从sklearn.model_selection导入训练_测试_拆分

#使用train_test_split划分训练集和测试集。

训练_X,测试_X,训练_Y,测试_Y=训练_测试_分离(

x,Y,测试大小=0.2,随机状态=0)

'''

x是原始数据的自变量,y是原始数据的因变量;

Train_X,test_X是将X按照8:2划分得到的;

Train_Y,test_Y是将x按照8:2划分得到的;

Test_size是分频比;

Random_state设置是否使用随机数。

'''

2.交叉验证法

交叉验证可以很好地解决预留法的问题,并且不需要太多数据,样本信息损失小。

交叉验证方法首先将数据集D分成K个大小相似的互斥子集,即

为了保证数据分布的一致性,从D随机分层抽样就够了。

之后每一次k-1个子集的并集作为训练集,剩下的子集作为测试集,这样我们就可以获得K组训练/测试,然后进行K次训练和测试,最后返回这K组测试的平均值。

具体来说,我们以k=10为例:

我们首次选择第10个数据集作为测试集,前9个数据集作为训练集。

第二次,我们选择第9个数据作为测试集,第1-8和第10个数据作为训练集。

第十次,我们选择第一个数据作为测试集,第二到第九个数据作为训练集。

由此得到10组训练集和测试集,进行10次训练和测试,最后返回10次测试结果的平均值。

显然,交叉验证法结果的稳定性和保真度很大程度上取决于K的选择,为了强调这一点,交叉验证法也被称为“K倍交叉验证法”。K值最常见的是10,有的是5或20。

同时还需要避免数据划分的随机性带来的误差,可以重复实验p次。

P-k折交叉验证法等同于pk留样法(比例为k-1:1)。

Python实现了交叉验证,只需要使用sklearn包。请注意,该函数返回样本序列号。

进口熊猫作为pd

从sklearn.model_selection导入KFold

data=PD . read _ excel(')#导入数据

kf=KFold(n_splits=4,shuffle=False,random_state=None)

n_splits是指把数据分成几部分;Shuffle和random_state表示是否随机生成。

如果shuffle=false,random _ state=none,重复操作会产生相同的结果;

如果shuffle=True,random_state=None none,重复运算会产生不同的结果;

如果shuffle=True,random_state==(一个数值),重复运算会产生同样的结果;

'''

对于列车,在kf.split(数据)中测试:

打印(' %s %s' %(训练,测试))

'''

结果

[ 5 6 7 8 9 10 11 12 13 14 15 16 17 18] [0 1 2 3 4]

[ 0 1 2 3 4 10 11 12 13 14 15 16 17 18] [5 6 7 8 9]

[ 0 1 2 3 4 5 6 7 8 9 15 16 17 18] [10 11 12 13 14]

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] [15 16 17 18]

'''

如果想通过多次交叉验证来划分数据集,只需使用RepeatedKFold函数即可,其中有一个额外的参数n_repeats。

与搁置法相比,交叉验证法的数据损失更少,更适用于小样本,但其计算复杂度和存储空间变大。极端的话,如果把数据集D(m个样本)分成M份,每次取m-1个样本作为训练集,剩下的一个就是测试集。训练和测试进行了m次。这种方法叫做留一法。

一次保留法的优势是显而易见的。它的数据损失只是一个样本,不会受到样本随机划分的影响。但是它的计算复杂度太高,空间存储占用太多。

Python实现了交叉验证,只需要使用sklearn包。

从sklearn.model_selection导入LeaveOneOut

X=[1,2,3,4]

loo=LeaveOneOut()

对于列车,在loo.split中测试(数据):

打印(' %s %s' %(训练,测试))

''结果

[1 2 3] [0]

[0 2 3] [1]

[0 1 3] [2]

[0 1 2] [3]

'''

总而言之:

当我们有了足够的数据,我们选择了简单省时的预留法,以牺牲很少的精度,换取了计算的简单;

当我们的数据量很小时,应该选择交叉验证法,因为此时划分样本集会造成训练数据过少;

当我们的数据量极小时,可以考虑留下一个方法。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: