sklearn cross validation:https://scikit-learn.org/stable/modules/cross_validation.html
交叉验证(Cross Validation)用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下降原始数据(dataset)进行分组,一部分用来为训练集(train set),另一部分做为验证集(validation set)。利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此分类器的性能指标。
那么什么时候才需要交叉验证呢?交叉验证用在数据不是很充足的时候。比如在平时的项目中,对于普通适中问题,如果数据样本量小于一万条,则采用交叉验证来训练优化选择模型。如果样本大于一万条,一般随机把样本数据分成三份,一份为训练集,一份为验证集,最后一份为测试集。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型再用于测试集,最终决定使用哪个模型以及对应参数。
1.交叉验证的评价标准
cross_val_score
使用交叉验证最简单的方法是调用croos_val_score函数,下面例子演示怎样通过分割数据,拟合一个线性核支持向量机模型,计算5个连续次的分数,每次有不同的分割。
from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)
分数的平均值和95%的置信区间是
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
cross_validate
- 允许指定多个评估指标;
- 除了测试分数之外,它还返回包含拟合时间、分数时间(以及可选的训练分数以及拟合估计值)的字典
cross_val_predict
交叉验证获得预测
cross_val_predict具有与cross_val_score的接口
适用于:
- 从不同模型获得的预测的可视化;
- 模型混合:当使用一个监督估计器的预测来训练集合方法中的另一个估计器时。
2.交叉验证迭代器
对于某些数据是独立同分布的,并且数据的生成过程相同,并且生成过程对过去的样本没有记忆,这样的样本可以用交叉验证器。虽然独立同分布是机器学习理论中的常见假设,但它在实践中很少应用。如果知道样本是使用时间依赖性过程生成的,那么使用时间序列感知交叉验证方案会更安全。同样,如果我们知道生成过程具有群组结构(来自不同主题的样本、实验)、测试设备使用分组交叉验证更安全。
KFold(K-折交叉验证)
将原始数据分成K组(一般均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此交叉验证集下的分类器的性能值指标。K一般大于等于2,实际操作一般是从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.KFold可以有效的避免过学习以及欠学习状态的发生,最后得到的结果比较具有说服力。
例子:
>>> import numpy as np
>>> from sklearn.model_selection import KFold
>>> X = ["a", "b", "c", "d"]
>>> kf = KFold(n_splits=2)
>>> for train, test in kf.split(X):
... print("%s %s" % (train, test))
[2 3] [0 1]
[0 1] [2 3]
RepeatedKFold
RepleatedKFold重复K-fold n次,当需要运行KFold n次时,可以使用它,在每次重复中产生不同的分裂。
例子(重复2次K-Fold的例子):
>>> import numpy as np
>>> from sklearn.model_selection import RepeatedKFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> random_state = 12883823
>>> rkf = RepeatedKFold(n_splits=2, n_repeats=2, random_state=random_state)
>>> for train, test in rkf.split(X):
... print("%s %s" % (train, test))
...
[2 3] [0 1]
[0 1] [2 3]
[0 2] [1 3]
[1 3] [0 2]
Leave One Out(LOO)
如果设原始数据有N个样本,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO分类器的性能指标。相比于KFold、LOO有两个明显的优点:
- 每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠;
- 实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的;
LOO的缺点是计算成本高,因为需要建立的模型数量与原始数据样本数据相同,当原始数据样本数量相当多时,LOO在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或者可以用并行化计算减少计算所需的时间。
例子:
from sklearn.model_selection import LeaveOneOut
X = [1, 2, 3, 4]
loo = LeaveOneOut()
for train, test in loo.split(X):
print("%s %s" % (train, test))
Leave P Out(LPO)
LeavePOut 与 LeaveOneOut类似,它从完整的数据集里删除p个样本,产生所有可能的训练集和检验集。对于n个样本,能产生个训练-检验对。
例子:
from sklearn.model_selection import LeavePOut
X = np.ones(4)
lpo = LeavePOut(p=2)
for train, test in lpo.split(X):
print("%s %s" % (train, test))
随机置换 Shuffle & Split
shufflesplit迭代器将产生一个用户定义的独立训练/检验集,首先shuffle样本,然后分到训练集和检验集。通过设置伪随机数生成器random_state,控制随机性使结果可重复。
from sklearn.model_selection import ShuffleSplit
X = np.arange(10)
ss = ShuffleSplit(n_splits=5, test_size=0.25,
... random_state=0)
for train_index, test_index in ss.split(X):
... print("%s %s" % (train_index, test_index))