本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。