基于遗传算法的SVM特征选择与参数同步优化系统
项目简介
本项目构建了一个集成的机器学习优化框架,利用遗传算法(GA)强大的全局搜索能力,针对支持向量机(SVM)分类器进行双重优化。该系统能够同时完成特征子集的自动筛选和SVM核心超参数(惩罚因子C、核函数参数Gamma)的寻优。
通过将离散的特征掩码与连续的参数数值联合编码到同一个染色体中,算法在进化过程中同步寻找二者的最佳组合,旨在去除冗余特征、避免过拟合,并显著提升模型的分类精度和泛化能力。
主要功能特性
- 混合编码机制:采用混合染色体结构,前段为二进制编码用于特征选择,后段为实数编码用于SVM参数优化,实现了离散与连续变量的同步进化。
- 自动化数据预处理:内置Min-Max归一化流程,将数据映射至[0, 1]区间,消除特征量纲差异。
- 鲁棒的适应度评估:利用K折交叉验证(K-Fold Cross Validation)准确率作为个体适应度的评价标准,有效防止模型在训练集上过拟合。
- 精英保留策略:在遗传迭代过程中强制保留每一代的全局最优个体,保证优化结果的单调不减。
- 结果可视化:提供适应度收敛曲线和最终特征选择结果的直观展示。
系统要求与环境依赖
- MATLAB:推荐 R2016b 或更高版本。
- LIBSVM 工具箱:必须正确安装并编译 LIBSVM 库(提供
svmtrain 和 svmpredict 函数),并将其添加到 MATLAB 路径中。 - 统计与机器学习工具箱:用于数据标准化(
mapminmax)等基础操作。
使用方法
- 确保 LIBSVM 已安装并在 MATLAB 的搜索路径中。
- 直接运行主程序即可启动优化过程。
- 程序将自动生成模拟数据(或加载实际数据),执行遗传优化,并在控制台输出每一代的最佳交叉验证准确率。
- 运行结束后,系统将输出最优特征组合、最优 C 和 Gamma 参数值,并计算在独立测试集上的最终准确率。
算法实现详细说明
本项目的主程序逻辑流如下,完全对应代码实际实现:
1. 数据准备与预处理
程序首先加载数据集。如果未提供外部数据文件,内置的
load_data 函数会生成带有噪声的模拟数据(包含24个特征的二分类数据)以演示功能。随后,利用
mapminmax 函数对特征矩阵进行归一化处理,并将数据集随机划分为训练集(70%)和测试集(30%)。
2. 种群初始化与编码
系统根据设定的参数(最大迭代50次,种群规模30)初始化种群。每个个体(染色体)由三部分组成:
- 特征掩码(Feature Mask):长度等于特征维度的二进制序列(0或1),1表示选择该特征,0表示剔除。
- 参数 C:以对数尺度存储的连续实数值。
- 参数 Gamma:以对数尺度存储的连续实数值。
3. 适应度评估 (Fitness Evaluation)
适应度函数是算法的核心。对于种群中的每个个体:
- 解码:将二进制特征掩码提取出来,通过逻辑索引筛选由于该掩码确定的特征子集;同时将保存的对数参数转换为实际物理值(即 $2^C$ 和 $2^{Gamma}$)。
- 交叉验证:调用 LIBSVM 的
svmtrain 函数,开启 -v 5 选项进行5折交叉验证。 - 评分:直接使用交叉验证返回的分类准确率作为该个体的适应度值。如果特征掩码全为0,则适应度强制设为0。
4. 遗传操作 (Evolutionary Operators)
为了产生下一代种群,算法依次执行以下操作:
- 锦标赛选择:采用随机竞争机制,每次从种群中随机选取3个个体,选择其中适应度最高者进入下一代池,重复此过程直到填满种群。
- 混合交叉:
*
特征部分:执行单点交叉(Single-point Crossover),随机选择断点交换两个父代的特征片段。
*
参数部分:执行算术交叉(Arithmetic Crossover),通过随机权重 $alpha$ 对两个父代的 C 和 Gamma 值进行线性插值生成子代参数。
*
特征部分:执行位翻转变异,随机选择一位特征状态进行反转(0变1,1变0)。
*
参数部分:执行高斯扰动变异,在原有参数值基础上增加正态分布噪声,并进行边界限制(防止参数超出预设搜索范围)。
5. 精英策略与收敛
在每一代进化结束后,程序会找出当前种群中最差的个体,并将其替换为上一代中的全局最优个体。这一策略确保了最优解不会因为随机的交叉变异操作而丢失。
6. 最终验证
当达到最大迭代次数后,程序将:
- 解析全局最优个体,获取最佳特征子集索引和对应的 C、Gamma 值。
- 仅使用被选中的特征,利用整个训练集和最优超参数重新训练最终的 SVM 模型。
- 利用该模型对独立的测试集进行预测,输出最终的分类准确率作为系统性能指标。
关键函数分析
- main: 程序的入口,负责统筹整个流程,包括参数定义、循环迭代控制、结果输出和绘图。
- load_data: 负责数据加载。代码中包含了一个模拟数据生成器,用于在没有真实数据文件时保证程序可运行。生成的数据包含24维特征,标签为 1 和 -1。
- init_population: 生成初始种群矩阵。特征位随机初始化为0或1,参数位在对数搜索范围内均匀随机分布。
- evaluate_population: 批量计算种群适应度。它是计算最密集的部分,通过调用 SVM 的内部交叉验证接口获取模型泛化能力的评估。
- tournament_selection: 实现了标准的锦标赛选择算子,用于从父代中筛选优质个体。
- crossover: 实现了针对混合编码的交叉逻辑,区分处理离散的特征掩码和连续的超参数。
- mutation: 实现了针对混合编码的变异逻辑,包含离散位的翻转和连续值的数值扰动。
结果可视化
程序执行完毕后会生成两个图表:
- 适应度收敛曲线:展示了每一代最佳交叉验证准确率的变化趋势,用于评估算法的收敛速度和优化效果。
- 特征选择结果图:通过柱状图直观显示了最终被选中的特征(值为1)和被剔除的特征(值为0)。