一、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()

        (参考:【机器学习】交叉验证筛选参数K值和weight) 

        (参考: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. 验证集和测试集的区别

        验证集:用在训练过程中,用于检验模型的训练情况,用来确定合适的超参数;

        测试集:用在训练结束之后,测试模型的泛化能力。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐