【20210922】【机器/深度学习】K折交叉验证(k-fold cross validation)
k 折交叉验证
一、K折交叉验证详解
1. 原理
交叉验证的核心思想在于对数据集进行多次划分,对多次评估的结果取平均,从而消除单次划分时数据划分不平衡造成的不良影响。它只是一种划分数据集的策略,它可以避免固定划分数据集的局限性、特殊性,一定程度上能够避免模型过拟合(当用交叉验证进行模型评估时,它并不能解决过拟合问题,只能用来评估模型的性能)。
交叉验证方法在小规模数据集上更能体现出优势。
交叉验证是避免过拟合的方法之一,是通过寻找最佳模型的方式来解决过拟合。(而正则化是通过约束参数的范数来解决过拟合)
2. 两大用途
把k折交叉验证的划分策略用于划分训练集和测试集,就可以进行模型评估;
把k折交叉验证的划分测量用于划分训练集和验证集,就可以进行模型选择。
(1)模型选择
交叉验证最关键的作用是进行模型选择,也称为超参数选择。具体过程是:首先在训练集和验证集上对多种模型(超参数)选择进行验证,选出平均误差最小的模型(超参数);选出合适的模型(超参数)之后,可以把训练集和验证集合并起来,在上面重新把模型训练一遍,得到最终模型;然后用测试集测试其泛化能力。
(2)模型评估
此时,模型是确定的,只是用交叉验证的方法对模型的性能进行评估。这种情况下,数据集被划分成训练集、测试集两部分。这种方式的优势在于:避免由于数据集划分不合理而导致的问题,这种问题可能不是模型导致的,而是因为划分数据集不合理造成的。
(参考:k交叉验证详解)
二、优缺点
优点:获得更合理更准确的评估,在小数据集上优势更为明显;
缺点:增加了计算量。
三、应用实例
1. 使用k折交叉验证选择最优的KNN算法k值
'''
功能:使用 k 折交叉验证选择 knn 算法的 k 值
'''
# 第一步:导入函数库
import numpy as np
from sklearn import neighbors
from sklearn import datasets
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
# 导入数据集
x, y = datasets.load_iris(True)
print(x.shape) # (150, 4),一般 k 不会超过数据长度的开方数
# 使用 k 折交叉验证选择 k 的取值
errors = []
for k in range(1, 14):
knn = neighbors.KNeighborsClassifier(n_neighbors=k)
score = cross_val_score(knn, x, y, scoring='accuracy', cv=6).mean()
errors.append(1-score)
# 绘制误差曲线
plt.figure()
plt.plot(np.arange(1, 14), errors)
plt.xlabel('k')
plt.ylabel('error')
plt.title('errors based on different k')
plt.show()
(参考:KNN交叉验证,找出合适的K值)
2. 交叉验证函数库参数详解
sklearn.model_selection.cross_val_score(estimator, x, y, groups=None, scoring=None, cv='warn', n_jobs=None, error_score='raise-deprecating')
# estimator:训练模型函数
# x:训练集的特征值
# y:训练集的标签值
# cv:交叉验证迭代的次数
# n_jobs:用于设置交叉验证算法并行计算所需的 CPU 数量
(参考:Python 第三方库Knn算法)
三、知识点
1. 验证集和测试集的区别
验证集:用在训练过程中,用于检验模型的训练情况,用来确定合适的超参数;
测试集:用在训练结束之后,测试模型的泛化能力。
更多推荐
所有评论(0)