sklearn中没有对应的方法,可以自己构造:
训练集(trainset),验证集(validationset),测试集(testset)这三个名词在机器学习领域极其常见,但很多人并不是特别清楚,尤其是后两个经常被混用。
通过本文,您将学会:
1、训练集,验证集,测试集概念、用法2、交叉验证在不同教材及sklearn中的概念区别3、sklearn交差验证方法划分数据集语法、参数解析、用法4、不同数据条件下如何选择交差验证方法4、运用交叉验证进行模型评估(语法、参数解析、用法)
训练集,验证集,测试集
在机器学习预测任务中,我们需要对模型泛化误差进行评估,选择最优模型。如果我们把所有数据都用来训练模型的话,建立的模型自然是最契合这些数据的,测试表现也好。但换了其它数据集测试这个模型效果可能就没那么好了。为了防止过拟合,就需要将数据集分成训练集,验证集,测试集。
很多机器学习的竞赛中,组织方一般会提供一个标注的数据集(作为训练集)以及一个没有标注的作为测试集,那么我们做模型的时候,通常会人工从训练集中划分一个验证集出来。
它们的作用分别是:
训练集:用来训练模型
验证集:评估模型预测的好坏及调整对应的参数
测试集:测试已经训练好的模型的推广能力
有一个比喻十分形象,训练集就像高三学生的练习册,验证集就像高考模拟卷,测试集就是最后真正的考试。
交叉验证
交叉验证(CrossValidation)用来验证学习器性能的一种统计分析方法,基本思想是重复的使用数据,把得到的样本数据进行切分,组合为不同数据集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。
1、李航老师的《统计学习方法》中模型选择方法分为两类,一个是正则化,一个是交差验证,交叉验证又分为简单交叉验证、s折交叉验证、留一交叉验证。
2、周志华老师的《机器学习》中,模型评估有三种方式,留出法、交叉验证(分为k折交叉验证和留一法)、自助法。
3、sklearn官方文档中,train_test_split作为留出法的实现方式,而交叉验证进行数据集划分(迭代器)又分为K折(KFold)、p次k折交(RepeatedKFold)、留一(LeaveOneOut)、留p(LeavePOut)、随机(ShuffleSplit)等等
看定义,简单交差验证和留出法应该是同一件事。
下面我们重点看一下比较常用的几个,不常用的大家可以自行探索。
留出法/简单交叉验证
留出法是最简单的数据集划分方式,随机的将样本数据分为两部分(比如:70%的训练集,30%的测试集),然后用训练集来训练模型,在测试集上选择模型及参数。然后再把样本打乱,重新选择训练集和测试集,继续训练数据和检验模型。最后选择损失函数评估最优的模型和参数。
留出法/简单交叉验证可以通过sklearn.cross_validation中的train_test_split实现
语法:
X_train,X_test,y_train,y_test=cross_validation.train_test_split(train_data,train_target,test_size=0.3,random_state=0)
参数解析:
train_data:所要划分的样本特征集
train_target:所要划分的样本结果
test_size:样本占比,如果是整数就是样本的数量
random_state:随机数的种子
使用方法:
importnumpyasnpfromsklearn.model_selectionimporttrain_test_splitfromsklearnimportdatasetsiris=datasets.load_iris()X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.4,random_state=0)
k折交叉验证
对于需要进行超参评估的模型,留出法还需要划分出验证集,这会使训练集进一步变小;另外,模型也会随着我们选择的训练集和验证集不同而不同。所以我们引入了k折交叉验证:
k折交叉验证把样本数据随机的分成k份,每次随机的选择k-1份作为训练集,剩下的1份做测试集。当这一轮完成后,重新随机选择k-1份来训练数据。若干轮(小于k)之后,选择损失函数评估最优的模型和参数。k一般取10,数据量大的时候,k可以设置的小一些;数据量小的时候,k可以设置的大一些。