基于MATLAB的十折交叉验证自动化程序
项目简介
本项目是一个基于MATLAB开发的机器学习数据预处理与模型评估工具,专注于实现标准的十折交叉验证(10-Fold Cross Validation)流程。项目内置了模拟数据的生成模块、两种不同的交叉验证实现方式(手动随机划分与分层采样划分)以及一个基础的最近邻(KNN)分类器用于效果验证。该程序能够帮助研究人员和开发者直观地理解交叉验证的原理,并评估模型在不同数据划分下的泛化能力。
功能特性
- 数据模拟生成:自动生成包含300个样本、2个特征维度的三分类数据集(基于高斯分布),用于测试和演示。
- 结果可复现性:通过设置固定的随机数种子,确保每次运行的数据生成和划分结果一致。
- 手动随机十折交叉验证:不依赖高级工具箱,通过基础矩阵操作实现数据的随机打乱与切分。
- 分层采样十折交叉验证:利用MATLAB统计工具箱功能,实现类别比例一致的划分,防止数据不平衡带来的评估偏差。
- 集成模型评估:内置向量化实现的KNN算法,自动计算每一次划分的分类准确率。
- 多维度可视化:
* 数据分布与测试集划分的动态散点图(展示前3折)。
* 各折准确率的条形图。
* 不同划分方法的性能对比图与箱线图。
系统要求
- MATLAB R2016a 或更高版本
- Statistics and Machine Learning Toolbox(用于
cvpartition和gscatter函数)
使用方法
直接运行主脚本即可启动程序。程序将依次执行以下步骤:
- 清理工作区并固定随机种子。
- 生成模拟数据集并打印数据基本信息。
- 执行手动随机划分的十折交叉验证,并显示可视化结果。
- 执行基于分层采样的十折交叉验证。
- 输出两种方法的平均准确率对比,并生成性能对比图表。
核心实现逻辑与算法细节
1. 数据集生成
程序首先定义了三个不同中心点的高斯分布簇,每类生成100个样本。
- 类别1中心:(2, 2)
- 类别2中心:(-2, -2)
- 类别3中心:(2, -2)
所有数据最终合并为一个N×2的特征矩阵和一个N×1的标签向量。
2. 方法一:手动随机十折交叉验证
该模块展示了交叉验证的底层实现逻辑:
- 索引随机化:使用
randperm 函数生成一个包含所有样本索引的随机排列向量,彻底打乱原始数据顺序。 - 折大小计算:计算总样本数除以10的均分大小。
- 数据切分循环:在10次循环中,通过计算起始和结束指针,从随机索引向量中提取当前折作为测试集,其余所有索引作为训练集。
* *边界处理*:代码包含逻辑判断,确保在最后一个折(Fold 10)时包含所有剩余样本,防止因除不尽导致的样本遗漏。
- 评估与记录:对每一折的数据进行KNN分类预测,记录准确率及对应的训练/测试集索引。
3. 方法二:分层采样(Stratified Sampling)
该模块使用了MATLAB内置的高级分区对象:
- 对象构建:利用
cvpartition 建立分区对象,指定通过 KFold 方法进行10折划分。 - 分层特性:该方法自动保证训练集和测试集中各类别样本的比例与原始数据集保持一致(即每折中各类样本数量约为10个),这对于评估分类器性能至关重要。
- 逻辑索引提取:循环中使用
training 和 test 方法获取每一折对应的逻辑索引掩码,进而提取数据子集进行评估。
4. 辅助算法:向量化KNN分类器
程序并没有调用现成的分类函数,而是实现了一个名为
simpleKNN 的轻量级函数:
- 算法原理:1-最近邻(1-NN),即预测样本类别与训练集中距离最近的样本类别一致。
- 距离计算优化:为了避免低效的循环计算,代码采用了完全向量化的欧氏距离计算公式:
* $dist^2 = |x - y|^2 = x^2 + y^2 - 2xy$
* 通过
sum 和
bsxfun(或广播机制)一次性计算测试集所有样本到训练集所有样本的距离矩阵。
- 预测:找到距离矩阵中每一行的最小值索引,直接映射为预测标签。
5. 可视化模块
程序包含丰富的绘图逻辑:
- 划分可视化:使用
gscatter 绘制原始分类数据,并叠加黑色圆圈标记当前的测试集样本,直观展示“移动的测试窗口”。 - 性能对比:通过分组条形图对比两种划分方法在每一折的准确率差异。
- 分布分析:使用箱线图(Boxplot)展示准确率的统计分布(中位数、四分位数),帮助分析模型评估的稳定性。