preface:做实验少不了交叉验证,平时常用from sklearn.cross_validation import train_test_split,用train_test_split()函数将数据集分为训练集和测试集,但这样还不够。当需要调试参数的时候便要用到K-fold。scikit给我们提供了函数,我们只需要调用即可。
sklearn包中cross validation的介绍:在这里。其中卤煮对3.1.2. cross validation iterators这一小节比较注意。先做这一小节的笔记,后续再添加。cross_validation函数下的函数如下图所示。
Figure 1: cross validation下的函数
3.1.2.1. k-fold
将样例划分为K份,若K=len(样例),即为留一交叉验证,K-1份作为训练。从sklearn中自带的KFold函数说明中也可以看到其用法。其中n_folds默认为3折交叉验证,2/3作为训练集,1/3作为测试集。
Figure 3-1-2-1-1:KFold用法
Figure 3-1-2-1-2: KFold使用例子
3.1.2.2. Stratified k-fold
StratifiedKFold()这个函数较常用,比KFold的优势在于将k折数据按照百分比划分数据集,每个类别百分比在训练集和测试集中都是一样,这样能保证不会有某个类别的数据在训练集中而测试集中没有这种情况,同样不会在训练集中没有全在测试集中,这样会导致结果糟糕透顶。
Figure 3-1-2-2-1:StratifiedKFold函数使用
3.1.2.3. Label k-fold
LabelKFold()函数则是根据样例label来交叉验证,某个样例的数据必须是属于训练集或者测试集时,可用这个函数。奇怪的是卤煮在sklearn中使用异常,没有这个函数。。。
Figure 3-1-2-3:LabelKFold()函数使用
交叉验证在sklearn中的实现
转载 2015-09-07 10:54:10前面已经简单介绍了交叉验证,这次主要说明sklearn中关于CV的相关实现。
先说一个sklearn中的很好用的功能:对一个数据集进行随机划分,分别作为训练集和测试集。使用的是cross_validation.train_test_split函数,使用示例如下:
1 实现CV最简单的方法是cross_validation.cross_val_score函数,该函数接受某个estimator,数据集,对应的类标号,k-fold的数目,返回k-fold个score,对应每次的评价分数。
上图的例子中,最终得到五个准确率。
cross_val_score中的参数cv,既可以给定它一个整数,表示数据集被划分的份数(此时采取的是KFold或者StratifiedKFold策略,后面会说明);也可以给定它一个CV迭代策略生成器,指定不同的CV方法。例如:
上图中的例子,首先通过cross_validation.ShuffleSplit生成一个CV迭代策略生成器cv,然后将cv以参数的形式传递到cross_val_score中。
除了cross_val_score,sklearn中还提供一个cross_val_predict,它的功能就是返回每条样本作为CV中的测试集时,对应的模型对于该样本的预测结果。这就要求使用的CV策略能保证每一条样本都有机会作为测试数据,否则会报异常。使用示例如下:
2 几种不同的CV策略生成器
前面提到,cross_val_score中的参数cv可以接受不同的CV策略生成器作为参数,以此使用不同的CV算法。这里介绍几种sklearn中的CV策略生成器函数
2.1 K-fold
最基础的CV算法,也是默认采用的CV策略。主要的参数包括两个,一个是样本数目,一个是k-fold要划分的份数。
2.2 Stratified k-fold
与k-fold类似,将数据集划分成k份,不同点在于,划分的k份中,每一份内各个类别数据的比例和原始数据集中各个类别的比例相同。
2.3 Leave-one-out
参数只有一个,即样本数目。
2.4 Leave-P-out
每次从整体样本中去除p条样本作为测试集,如果共有n条样本数据,那么会生成
个训练集/测试集对。和LOO,KFold不同,这种策略中p个样本中会有重叠。
2.5 Leave-one-label-out
这种策略划分样本时,会根据第三方提供的整数型样本类标号进行划分。每次划分数据集时,取出某个属于某个类标号的样本作为测试集,剩余的作为训练集。
2.6 Leave-P-Label-Out
与Leave-One-Label-Out类似,但这种策略每次取p种类标号的数据作为测试集,其余作为训练集。