推荐直接网站在线阅读:https://aicoting.cn
在机器学习中,为了评估模型的泛化能力,需要将数据集合理划分为训练集、验证集和测试集。训练集用于模型的学习,验证集用于模型选择和超参数调优,而测试集则用于最终性能评估。
常用的验证方法包括留出法、k 折交叉验证和自助法(Bootstrap),通过多次划分与评估可以有效减少结果的偏差与方差,提高模型性能评估的可靠性。
训练集/验证集/测试集
在机器学习的建模过程中,数据是模型学习和评估的基础。为了确保模型在未见数据上的泛化能力,通常需要将数据集划分为训练集(Training Set)、验证集(Validation Set)和测试集(Test Set)。这三类数据集在功能与作用上各有侧重,是整个机器学习流程中不可或缺的环节。
训练集(Training Set)
训练集是模型学习的主要数据来源。模型通过在训练集上调整参数,使预测结果尽可能贴近真实标签。训练集的质量和数量直接影响模型的学习能力和最终性能。
训练集用于优化模型参数,例如线性回归中的权重、神经网络中的权重和偏置。训练集应尽可能覆盖数据的多样性和典型模式,以避免模型只学到局部规律。若训练集过小或噪声过多,模型可能记住训练样本而无法泛化,导致过拟合。
验证集(Validation Set)
验证集是模型调优和选择的重要依据,通常与训练集相互独立。它主要用于评估模型在未见数据上的表现,并指导超参数调节和模型选择。
通过在验证集上测试不同参数组合(如正则化系数、学习率、树深度等),选择性能最优的配置。当有多个候选模型时,验证集可以帮助判断哪一个模型更适合任务需求。同时验证集提供了训练之外的独立反馈,使得模型不会仅针对训练数据进行优化。
验证集的常用划分策略包括:
- 固定划分:从训练数据中单独划出一部分作为验证集。
- 交叉验证:将训练数据分成 k 份,轮流使用一份作为验证集,取平均性能,以获得更稳健的评估。
- 自助法(Bootstrap):通过有放回抽样构建多个子集进行验证,适合小样本场景。
测试集(Test Set)
测试集是模型最终评估的标准,用于衡量模型在真实场景中的泛化能力。测试集必须在模型训练和验证阶段完全不参与,以保证评估的客观性。
测试集与训练集、验证集严格分开,不能用于模型调参或选择。通过测试集计算各类指标(如分类准确率、回归误差等),反映模型的实际应用效果。在研究和竞赛中,测试集常用于不同模型的最终比较和排名。
数据划分原则
为了保证训练、验证、测试各环节的可靠性,数据划分需要遵循一定原则:
- 互不重叠:三类数据集应无交集,避免信息泄露。
- 比例合理:常见划分比例为训练集:验证集:测试集 ≈ 6:2:2 或 7:2:1,具体可根据数据量调整。
- 保持分布一致:确保三类数据集的特征分布和类别分布与整体数据相似,避免评估偏差。
- 随机划分与分层抽样:随机划分可以增加数据代表性,分层抽样适合类别不平衡的数据集。
训练集、验证集和测试集各自承担不同的角色:训练集负责学习模型参数,验证集用于调优和选择模型,而测试集用于最终性能评估。
合理划分和使用这三类数据集,是保证机器学习模型泛化能力、避免过拟合以及获得可靠评估结果的基础。通过科学的数据划分和验证方法,模型才能在真实应用场景中表现稳定、可靠。
k 折交叉验证
在机器学习中,模型的泛化能力是评估其性能的重要标准。单次划分训练集和验证集可能导致评估结果受数据分布偶然性影响,特别是在数据量有限的情况下。为了获得更加稳健和可靠的性能评估,k 折交叉验证(k-Fold Cross-Validation, k-CV) 被广泛应用于模型训练与验证中。
基本原理
k 折交叉验证是一种将数据集划分为 k 个大小相近的子集(folds),并进行 k 次训练和验证的方法。其流程如下:
- 将数据集均匀分为 k 个子集,每个子集包含的数据尽量保持整体分布一致(可采用分层抽样,尤其是分类任务中)。
- 依次选取其中的一个子集作为验证集,剩余 k-1 个子集合并作为训练集。
- 在训练集上训练模型,并在验证集上计算评估指标。
- 重复上述过程 k 次,每次选择不同的子集作为验证集。
- 将 k 次评估结果取平均,得到模型的整体性能估计。
下面我们依旧使用经典的 Iris 数据集 通过k折交叉验证进行分类任务。
# 导入必要库# 导入必要库importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimportKFold,cross_val_scorefromsklearn.treeimportDecisionTreeClassifier# 1. 加载数据iris=load_iris()X,y=iris.data,iris.target# 2. 定义模型model=DecisionTreeClassifier(random_state=42)# 3. 定义 k 折交叉验证k=5kf=KFold(n_splits=k,shuffle=True,random_state=42)# 4. 执行交叉验证scores=cross_val_score(model,X,y,cv=kf)# 5. 输出每折的准确率print(f"{k}-折交叉验证每折准确率:",scores)print(f"平均准确率:{scores.mean():.4f}, 标准差:{scores.std():.4f}")# 6. 可视化结果plt.figure(figsize=(8,4))plt.bar(range(1,k+1),scores,color='skyblue')plt.ylim(0,1.1)plt.xlabel("Fold")plt.ylabel("Accuracy")plt.title(f"{k}-Fold Cross-Validation Accuracy")plt.xticks(range(1,k+1))plt.show()结果如下图, 每折交叉验证结果显示模型在不同子集上的表现略有差异,但都较高,说明模型对数据的学习稳定性较好。通过柱状图可以直观看到每折的准确率分布,帮助快速发现是否存在某一折表现异常。
k 折交叉验证的优势可以充分利用数据,相比单次划分训练集/验证集的方法,k 折交叉验证能够使所有样本都参与训练和验证,提高了数据利用效率。通过 k 次平均性能,减少了单次划分可能产生的偏差,提高模型性能估计的可靠性。在数据量有限的情况下,k 折交叉验证可以避免训练集过小导致模型欠拟合的问题。
在使用k 折交叉验证时,要注意:
- 选择 k 的大小:常用的 k 值为 5 或 10。k 值过小可能导致评估方差较大,k 值过大(如留一法,k=N)则计算成本高。
- 分层抽样:对于类别不平衡的分类问题,应采用分层 k 折交叉验证(Stratified k-Fold),保证每个折中类别比例与原始数据一致。
- 重复交叉验证:为进一步降低评估方差,可以多次随机划分 k 折,取多次平均值。
k 折交叉验证的扩展
- 留一交叉验证(Leave-One-Out Cross-Validation, LOOCV):k=N,每次仅留一个样本作为验证集,适合数据量非常小的情况。
- 重复 k 折交叉验证(Repeated k-Fold CV):多次重复 k 折交叉验证,进一步降低评估方差。
- 嵌套交叉验证(Nested Cross-Validation):在外层进行模型选择,内层进行超参数调优,适合高维或复杂模型的评估。
总结一下,k 折交叉验证是一种经典且有效的模型验证方法,通过多次训练和验证充分利用数据,提高了模型性能评估的稳定性与可靠性。合理选择 k 值、采用分层策略以及必要时使用重复或嵌套交叉验证,可以在模型选择与调参中取得更好的效果,使模型在实际应用中表现更加稳健。
最新的文章都在公众号aicoting更新,别忘记关注哦!!!
📚 推荐阅读
机器学习之数据预处理篇!
机器学习特征工程中的特征选择
机器学习中的特征构造
机器学习之特征降维
一文搞懂层次聚类和密度聚类方法!
一文搞懂机器学习中的PCA主成分分析!
机器学习中独立成分分析ICA和主成分分析PCA有什么区别?
一文搞懂t-SNE和UMAP降维方法!
万字长文!搞懂机器学习中的概率图模型
万字长文!搞懂机器学习中半监督学习的经典方法!
一文搞懂强化学习中的马尔可夫决策过程!
一文搞懂强化学习中的动态规划与值迭代!
一文搞懂强化学习中的Q-learning
作者:aicoting
分享是一种信仰,连接让成长更有温度。
我们下次不见不散!