交叉验证也称为循环估计,是一种统计学上将数据样本切割成较小子集的实用方法,主要应用于数据建模。
交叉验证基本思想:将原始数据进行分组,一部分作为训练集,另一部分作为验证集,首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型,以此作为评价分类器的性能指标,用交叉验证的目的是为了得到可靠稳定的模型。
交叉验证的常见方法如下:
Holdout验证
将原始数据随机分为两组,一组作为训练集,一组作为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率,以此作为分类器的性能指标。
K折交叉验证
初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次。
留一验证
留一验证指只使用原本样本中的一项来当验证数据,而剩余的则留下当训练数据。这个步骤一直持续到每个样本都被当一次验证数据。事实上,这等同于和K折交叉验证,其中K为原样本个数。
十折交叉验证
十折交叉验证用来测试算法准确性,是常用的测试方法。将数据集分成十分,轮流将其中9份作为训练数据,1份作为测试数据。每次试验都会得出相应的正确率。10次结果的正确率的平均值作为算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为算法的最终准确性估计。
下面结合“鸢尾花”数据集详细介绍交叉验证,代码如下:
#导入相关库
import pandas as pd
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
iris = pd.read_csv('iris.csv')
X = iris[['Sepal.Length', 'Sepal.Width', 'Petal.Length','Petal.Width']]
y = iris['Species']
#SVM模型初始化
svm = SVC()
#执行k分割交叉验证
scores = cross_val_score(svm, X, y, cv=8)
print('交叉验证得分: {}'.format(scores))
print('交叉验证得分: {:.3f}+-{:.3f}'.format(scores.mean(), scores.std()))
运行上述代码,输出如下,可以看出交叉验证的得分矩阵、平均分及其标准差。
交叉验证得分: [1. 0.94736842 1. 1. 0.94736842 0.94736842 0.94444444 1.]
交叉验证得分: 0.973+-0.027