【机器学习算法系列】交叉验证

一、交叉验证

1.1 原理简述

交叉验证是一种常用的模型选择方法。如果给定的样本数据充足,进行模型选择的一种简单的方法是随机地将数据集切分成三部分,分别为训练集(training set)、验证集(validation set)和测试集(test set)。训练集用于训练模型,验证集用于模型的选择,而测试集用于最终对学习方法的评估。在学习到的不同复杂度的模型中,选择对验证集有最小预测误差的模型。由于验证集有足够多的数据,用它对模型进行选择也是有效的。

但实际运用中经常会出现数据不足的情况,为了选择更好的模型,可以采用交叉验证方法。交叉验证的基本想法是重复地使用数据;把给定的数据进行切分,将切分的数据集合为训练集和测试集,在此基础上反复地进行训练、测试以及模型选择。

根据不同的切分方法,交叉验证分为以下三种:

1.1.1 简单交叉验证

首先随机的将样本数据分为两部分,一部分作为训练集,另一部分作为测试集(比如: 70%的训练集,30%的测试集);然后用训练集在各种条件下来训练模型,在测试集上评价各模型的测试误差。选择出测试误差最小的模型。

1.1.2 S折交叉验证

S折交叉验证是运用最多的方法,首先把样本数据随机的分成S份,每次随机的选择S-1份作为训练集,剩下的1份做测试集。当这一轮完成后,重新随机选择S-1份来训练数据。若干轮(小于S)之后,选择损失函数评估最优的模型和参数。

1.1.3 留一交叉验证

它是第二种情况的特例,此时S=样本数N(N为给定数据集的容量),这样对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型预测的好坏。此方法主要用于样本量非常少的情况。

1.2 sklearn代码实现

在sklearn中的数据集,使用交叉验证对KNN模型进行试验。

#导入所需的包
import numpy as np
import sklearn.datasets as dataset
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score #封装在sklearn中的交叉验证包

# 加载数据
data = dataset.load_digits()
X = data.datay = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4,random_state=666)# 通过交叉验证进行调参knn_clf=KNeighborsClassifier()
scores=cross_val_score(knn_clf,X_train,y_train)
print(scores)

运行结果:

[0.98895028 0.97777778 0.96629213]

由上述结果可见,数据被分为三份,通过交叉验证的方式得到的每个组合的准确度为0.98895028、0.97777778和0.96629213。3是默认的分割分数,可以通过cv参数调整数据被分割的份数。

你可能感兴趣的:(【机器学习算法系列】交叉验证)