基于MATLAB的AdaBoost集成学习多弱分类器融合系统
项目简介
本项目是一个完全基于MATLAB原生代码实现的AdaBoost(Adaptive Boosting)集成学习算法演示系统。该系统旨在通过组合多个“弱分类器”(Weak Classifiers)来构建一个高精度的“强分类器”。项目中内置了非线性数据集生成器,通过可视化的方式完整展示了Boosting算法如何通过迭代逐步修正分类边界,从而解决单一简单模型无法处理的非线性二分类问题。
整个系统集成在一个完整的脚本中,实现了从数据生成、模型构建、迭代训练、权重更新到最终模型评估步和全方位可视化的完整流程。
功能特性
- 非线性数据模拟:内置数据生成功能,能够生成类似“甜甜圈”分布的二维非线性可分数据(中心圆为一类,外环为另一类),用于验证算法处理复杂边界的能力。
- 决策树桩(Decision Stump)算法:底层弱分类器采用单层决策树,通过遍历所有特征维度的阈值寻找最佳分割点。
- AdaBoost核心逻辑实现:完整实现了标准的AdaBoost.M1算法流程,包括样本权重初始化、误差计算、分类器权重(Alpha)计算及样本权重的指数级更新。
- 集成预测机制:采用加权投票(Weighted Voting)机制,将数十个弱分类器的预测结果线性组合,形成最终的强分类预测。
- 多维性能评估:提供测试集准确率计算、自定义混淆矩阵计算以及AUC(曲线下面积)指标计算。
- 全方位可视化:在单幅图中展示四个关键图表:分类决策边界与原始数据分布、训练/测试误差收敛曲线、ROC曲线、混淆矩阵热图。
系统要求
- MATLAB: R2016b 或更高版本(代码主要使用基础绘图和矩阵运算,不依赖特定的深度学习工具箱)。
- 工具箱: 仅需基础MATLAB环境,无需额外安装第三方库。
使用方法
- 将项目代码保存为MATLAB脚本文件(例如
main.m)。 - 在MATLAB命令窗口中直接运行该脚本。
- 程序将自动执行以下操作:
* 生成包含400个样本的合成数据集。
* 划分70%训练集和30%测试集。
* 训练包含50个弱分类器的AdaBoost模型。
* 在命令窗口输出训练进度、最终准确率。
* 弹出包含四个子图的综合结果窗口。
代码实现逻辑与细节
本项目的主程序严格遵循AdaBoost算法原理,具体实现逻辑如下:
1. 参数设置与数据准备
程序首先设定随机种子以确保结果可复现。接着定义了关键超参数:样本数量(400)、特征维度(2)、弱分类器迭代数量(50)以及训练集比例(0.7)。
通过极坐标转换生成同心圆分布的数据:
- 类别1:分布在半径0-2的圆形区域。
- 类别-1:分布在半径3-5的环形区域。
- 数据最后被添加了微量高斯噪声并随机打乱,划分为训练集和测试集。
2. AdaBoost模型训练循环
训练过程通过固定次数的迭代(本例为50次)进行,核心步骤包括:
- 权重初始化:初始阶段,所有训练样本赋予相同的权重(1/N)。
- 弱分类器构建:每一轮迭代中,调用构建函数基于当前样本权重寻找最优的单层决策树(Stump)。该树桩会遍历所有特征和切分点,找到加权错误率最小的划分方式。
- 计算分类器权重(Alpha):根据当前弱分类器的加权误差率计算其话语权。误差越小的分类器,其Alpha值越大。代码中包含防止除零的数值稳定性处理(
1e-10)。 - 样本权重更新:最关键的步骤,算法会增加被当前弱分类器误分类样本的权重,同时降低分类正确样本的权重。这迫使下一轮的弱分类器专注于当前难以区分的“硬骨头”样本。
- 误差记录:在每一轮结束时,利用当前已训练的所有弱分类器组合成临时强分类器,分别计算训练集和测试集的误差,用于绘制收敛曲线。这也展示了模型是否存在过拟合现象。
3. 模型预测与评估
训练完成后,利用所有弱分类器的集合对测试集进行预测。
- 加权投票:将所有弱分类器的预测结果乘以其对应的Alpha值并求和,取符号函数(sign)作为最终类别判定。
- 指标计算:计算最终准确率,并构建混淆矩阵(TP, FN, FP, TN)用于后续绘图。
4. 关键算法与函数解析
generate_synthetic_data
负责生成非线性数据集。利用极坐标系(半径和角度)生成同心圆结构,再转换为笛卡尔坐标系的X, Y特征,天然构造了线性分类器难以处理的场景。
build_decision_stump
这是弱分类器的训练核心。它执行网格搜索:
- 遍历输入数据的每一个特征维度。
- 在每个维度的最大值和最小值之间划分若干步长,确定候选阈值。
- 对每个阈值尝试“正向”和“反向”两种极性(即大于阈值为正类还是负类)。
- 计算加权误差,返回误差最小的特征索引、阈值和极性。
predict_stump
基于单个训练好的决策树桩(包含特征索引、阈值、极性)对输入数据进行二分类预测,输出+1或-1。
predict_adaboost_ensemble
这是强分类器的实现。它遍历模型列表,累加所有有效(Alpha > 0)弱分类器的加权预测值。该函数既可以输出最终的类别标签(用于计算准确率),也可以输出连续的得分(Score),用于绘制ROC曲线和决策边界等高线。
calculate_roc
通过对预测得分进行排序,逐步改变判决阈值,计算一系列的真正率(TPR)和假正率(FPR)。最后利用梯形法则(trapz)计算AUC值,以此衡量模型在不同阈值下的泛化能力。
可视化绘图函数
- plot_decision_boundary:在特征空间生成网格点,利用集成模型预测网格点的类别,绘制等高线背景,直观展示模型学习到的非线性边界(通常表现为围绕中心类别的多边形或近似圆形)。
- plot_confusion_matrix:以热图形式展示混淆矩阵,清晰反映模型在正负样本上的具体分类情况。