交叉验证与训练集、验证集、测试集

本文介绍了机器学习中数据集的常见划分方法,包括训练集、验证集和测试集的作用及比例分配。此外,还详细解释了交叉验证的概念及其应用场景,帮助读者理解如何有效地评估模型性能。

参考:李航–《统计学习方法》
https://www.jianshu.com/p/7e032a8aaad5
https://zhuanlan.zhihu.com/p/20900216?refer=intelligentunit

训练集、验证集、测试集

如果给定的样本数据充足,我们通常使用均匀随机抽样的方式将数据集划分成3个部分——训练集、验证集和测试集,这三个集合不能有交集,常见的比例是8:1:1。需要注意的是,通常都会给定训练集和测试集,而不会给验证集。这时候验证集该从哪里得到呢?一般的做法是,从训练集中均匀随机抽样一部分样本作为验证集。

训练集

训练集用来训练模型,即确定模型的权重和偏置这些参数,通常我们称这些参数为学习参数。

验证集

而验证集用于模型的选择,更具体地来说,验证集并不参与学习参数的确定,也就是验证集并没有参与梯度下降的过程。验证集只是为了选择超参数,比如网络层数、网络节点数、迭代次数、学习率这些都叫超参数。比如在k-NN算法中,k值就是一个超参数。所以可以使用验证集来求出误差率最小的k。

测试集

测试集只使用一次,即在训练完成后评价最终的模型时使用。它既不参与学习参数过程,也不参数超参数选择过程,而仅仅使用于模型的评价。
值得注意的是,千万不能在训练过程中使用测试集,而后再用相同的测试集去测试模型。这样做其实是一个cheat,使得模型测试时准确率很高。

交叉验证

之所以出现交叉验证,主要是因为训练集较小。无法直接像前面那样只分出训练集,验证集,测试就可以了(简单交叉验证)。
需要说明的是,在实际情况下,人们不是很喜欢用交叉验证,主要是因为它会耗费较多的计算资源。一般直接把训练集按照50%-90%的比例分成训练集和验证集。但这也是根据具体情况来定的:如果超参数数量多,你可能就想用更大的验证集,而验证集的数量不够,那么最好还是用交叉验证吧。至于分成几份比较好,一般都是分成3、5和10份。

交叉验证的实现

首先我们给出下面的图
这里写图片描述
图上面的部分表示我们拥有的数据,而后我们对数据进行了再次分割,主要是对训练集,假设将训练集分成5份(该数目被称为折数,5-fold交叉验证),每次都用其中4份来训练模型,粉红色的那份用来验证4份训练出来的模型的准确率,记下准确率。然后在这5份中取另外4份做训练集,1份做验证集,再次得到一个模型的准确率。直到所有5份都做过1次验证集,也即验证集名额循环了一圈,交叉验证的过程就结束。算得这5次准确率的均值。留下准确率最高的模型,即该模型的超参数是什么样的最终模型的超参数就是这个样的。

### 交叉验证训练集验证集测试集的作用划分方式 #### 训练集的作用 训练集用于构建机器学习模型的核心部分。它包含了已知输入及其对应的目标输出,通过对这些数据的学习,模型能够提取特征并建立映射关系[^1]。 #### 验证集的作用 验证集主要用于调整模型的超参数以及评估不同算法的表现。通过在验证集上的表现,研究者可以选择最优的模型配置,从而避免过拟合或欠拟合的情况发生[^2]。 #### 测试集的作用 测试集用来最终评估模型的真实性能。这一阶段不再允许任何对模型的修改,因为测试集的结果代表了模型在未来未知数据上的预测能力[^3]。 #### 划分方式 当数据量充足时,通常会按照固定比例将整个数据集划分为训练集验证集测试集。例如,在较小规模的数据集中(数万条记录),常见的分配策略是60%作为训练集,20%作为验证集,剩余20%作为测试集[^3]。然而,对于非常大的数据集(百万级别及以上),只需确保验证集测试集拥有足够的样本数量即可,比如各取1万条数据[^3]。 #### 交叉验证中的应用 在数据量有限的情况下,为了充分利用现有资源并获得更可靠的估计,可采用交叉验证技术替代简单的单一划分方法。具体而言,原始数据被分成若干个子集(称为折)。每次选取其中一部分作为当前轮次的测试集,其余则合并形成新的训练集;随后在此基础上重复执行建模过程直至每份子集都充当过一次独立的测试集合为止。值得注意的是,在这种框架下,“验证”的功能往往由多次迭代间的平均效果体现出来,因此有时无需单独设立额外的验证分区[^2]。 ```python from sklearn.model_selection import KFold, cross_val_score from sklearn.tree import DecisionTreeClassifier # 假设X为特征矩阵,y为目标向量,k表示k折数目 kf = KFold(n_splits=k) model = DecisionTreeClassifier() scores = cross_val_score(model, X, y, cv=kf) print(f'Cross-validation scores: {scores}') print(f'Mean score: {"{:.4f}".format(scores.mean())}') ```
评论 23
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值