ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

蛇群算法优化LSSVM分类超参数:原理与Matlab实现

蛇群算法优化LSSVM分类超参数:原理与Matlab实现 简介基于Matlab的蛇群算法优化最小二乘支持向量机SO-LSSVM分类程序面向数据挖掘、模式识别和机器学习领域的工程技术人员可用于参数寻优与分类预测任务尤其适合高维、小样本等复杂数据场景。核心采用蛇群算法自动搜索LSSVM的关键参数相比人工调参更高效。资源包共16个文件其中5个.m源文件构成主程序、初始化与优化主流程4个.mexw64动态库为LibSVM编译接口配合示例图片、数据表格及标准测试集整体约171KB。代码在Matlab 2019b下编写放入工作区即可运行能够观察迭代收敛过程并获得分类结果。目前已有121人学习下载压缩包结构紧凑适合算法对比、课程设计或论文复现。代码注释简洁、模块化清晰如需进一步扩展还可参考遗传算法、粒子群、灰狼等多种优化LSSVM的系列程序便于科研合作与二次开发。1. 调参玄学终结者SO-LSSVM把分类模型的超参数选择交给蛇群算法分类任务里最磨人的不是模型选型而是参数调优。LSSVM训练速度快但惩罚系数gamma和核宽sigma的组合一旦设偏准确率能从95%滑到70%手动试一组参数就要重算好几轮交叉验证。蛇群算法SO把这两个超参数当成二维连续优化问题用模拟蛇群觅食、战斗、交配的机制自动迭代出相对更优的组合。这套SO-LSSVM的Matlab源码包已经把数据导入、SO寻优、LSSVM训练和结果出图串成一条完整链路你只要把数据整理成特征加标签的Excel就能直接复现一遍分类建模流程。适合正在做特征分类、被超参数折腾得够呛的工程师和研究生。2. LSSVM的数学结构、两个关键参数与二维搜索空间设定2.1 LSSVM的建模逻辑把二次规划变成线性方程组LSSVM是在标准SVM的基础上做了一个很简洁的改动原SVM用不等式约束来保证间隔LSSVM把它改成等式约束同时把损失函数换成误差平方项。于是目标函数写成 min J(w,b,e)1/2 w^T w 1/2 γ Σ e_i^2约束是 y_i(w^T φ(x_i)b)1-e_i。这里φ(x_i)是把原始特征映射到高维空间的核变换γ是正则化参数e_i是误差变量。用拉格朗日乘子法求极值最后得到的是一个以核矩阵为基础的线性方程组而不是标准SVM里那种需要调用二次规划求解器的凸优化问题。正因为不再做迭代求QPLSSVM在中小规模数据上的训练时间会明显更短这就是“最小二乘”和“支持向量机”合在一起的核心价值。不过很多第一次接触源码包的人会有一个疑问说好的LSSVM怎么压缩包里放的是libsvm-3.24这里要解释清楚。libsvm是一套非常经典的支持向量机工具箱它实现的训练函数是标准SVM的C-SVC模式并不是严格意义上的LSSVM求解器。但这类Matlab源码在实际落地时经常把libsvm的mex接口当成一个训练黑匣子外层由蛇群算法搜索参数内层用libsvmtrain完成分类器训练libsvmpredict完成分类预测。从目标函数角度看它起到的作用和LSSVM一样用正则化参数和核参数控制模型复杂度然后最小化分类错误。说白了这里的“LSSVM”是一个实现层面的合并叫法你抓住“正则化参数核参数最小化错分率”这个本质代码就不难看懂。真正要较真的话严格的LSSVM可以用LSSVMlab工具箱实现也可以用核矩阵加线性方程组自己写一个解算器算法思想是同一件事。这里还要提醒一点LSSVM和标准SVM有个非常重要的差异就是LSSVM解出的拉格朗日乘子没有稀疏性。标准SVM的乘子大部分是零只有少数支持向量参与预测LSSVM几乎每个训练样本都会在最终决策函数里有一定权重。这个特性带来一个实际后果当样本量到几万条以后LSSVM的预测阶段要把所有训练样本都参与核函数计算内存和耗时都会跟着上涨。所以这套SO-LSSVM更适合几百到几千条的中小规模数据如果你的数据是十万条级别建议先用随机抽样或降维把规模压下来再做参数寻优。2.2 惩罚系数gamma和核宽sigma一组参数对应一种分类边界LSSVM选RBF核时核函数是K(x_i,x_j)exp(-||x_i-x_j||²/(2σ²))。这里σ是核宽σ²决定样本在核空间的相似度衰减速度γ是正则化参数决定模型对训练误差的容忍度。在libsvm的命令行参数里-c对应γ-g对应的是1/(2σ²)这种尺度变换后的数值。不同软件里叫法不一样LSSVMlab里叫gam和sig2libsvm里叫c和g本质都是“一个正则化强度加一个核宽度”。这两个参数对分类边界的影响非常直接我习惯先用一张表记住它们的倾向参数语义设偏小设偏大γ惩罚系数对错分样本的容忍程度边界过于平滑训练集准确率上不去对噪声过于敏感测试集泛化变差σ核宽样本间相似度的衰减速度每个样本几乎独立成簇训练集100%但验证集惨烈所有样本被抹成一个平滑曲面分类边界过于简单实际调的时候我一般先确保特征做归一化。如果特征量纲差异大σ的含义会被某些大数值列带偏。还有个小习惯先在Bounds.m里取γ1、σ1跑一次看训练集准确率在什么位置。如果训练集已经接近100%说明γ或者σ偏小边界在硬切如果训练集只有六成说明特征尺度问题比参数问题更严重先回头归一化。另外类别不平衡时γ的影响也会被放大少数类样本容易被大γ直接忽略这时最好在fun.m里把准确率指标换成宏平均F1别光看总准确率。2.3 二维参数寻优为什么是蛇群而不是网格搜索或遗传算法如果走网格搜索γ取20个候选值σ取20个候选值组合就是400组。每组再做一个5折交叉验证意味着要训2000次模型。这种穷举方式虽然可靠但计算开销会随数据量线性放大。遗传算法当然也能做参数搜索它需要设计编码、选择、交叉、变异四个算子代码写起来比重更大对不熟悉进化算法的人来说更像一个黑匣子。粒子群算法也能做但它对惯性权重和个体学习因子的设定更敏感调起来一样费精神。蛇群算法不是把问题复杂化而是把探索和开发的切换交给了两个直观阈值食物量和温度。通俗地说食物少的时候蛇群会分散去找吃的对应全局随机搜索食物充足且温度高蛇会冲向当前最优食物位置对应向局部最优进行开发温度低则进入交配或战斗模式通过雄性和雌性群体的信息交换保持种群多样性。在二维参数寻优这种低维连续问题上SO的结构比遗传算法紧凑需要调节的超参数也少用50代左右就能得到一组可用的γ和σ。这也是我拿到这份源码后愿意先跑SO而不是重新写网格搜索的原因它在速度和可达精度之间取得了一个比较实用的平衡。需要认清的是启发式算法不保证找到全局最优SO迭代出来的参数不一定比网格搜索更细但足够让LSSVM从“看运气调参”变成“有方向地搜索”。3. Matlab 2019b下把SO-LSSVM跑起来文件清单、mex编译与main.m执行顺序3.1 压缩包里这些文件分别干什么下载解压后第一件事是把文件逐个认清楚避免后面报错时不知道去哪个文件里排查。这份资源的核心文件角色如下文件角色说明main.m主程序读数据、设置SO参数、调用SO和fun、绘制结果图SO.m蛇群算法主循环实现温度、食物量、交配、战斗等位置更新逻辑fun.m / fun.asv适应度函数把LSSVM当黑匣子返回分类错误率Bounds.m参数边界定义γ和σ的下界lb与上界ubinitialization.m种群初始化生成雄性和雌性两个蛇群libsvm-3.24软件依赖源码libsvm标准SVM工具箱的完整源码目录libsvmtrain.mexw64等编译好的插件训练、预测、读数据的mex动态链接文件heart_scale校验数据libsvm自带的测试数据集用于验证libsvm环境数据.xlsx本项目数据特征和标签集成在一个Excel文件里这里最需要明确的是libsvm-3.24目录的作用。那三个mexw64文件是libsvm在Windows 64位环境下预编译好的接口分别负责训练、预测和数据读取。如果你的Matlab版本和2019b一致直接调用即可如果版本差异大编译器生成的内部接口会不兼容这时就用libsvm-3.24里的源码重新编译。提示fun.asv是Matlab自动保存的备份文件可以忽略不影响运行。但如果fun.m被意外改坏这个asv文件偶尔能救你一命。3.2 三步运行法放置路径、检查mex、运行main.m我习惯先把整个压缩包解压到一个纯英文无空格的路径下比如D:/work/so_lssvm。然后打开Matlab先切到该目录再检查环境。% 第一步切到项目目录路径里不要带中文和空格 cd(D:/work/so_lssvm); % 第二步检查mex文件是否在当前路径可见 % which命令能查出完整路径说明已加载 which libsvmtrain.mexw64 which libsvmpredict.mexw64逻辑说明这两条which命令是排查环境问题最快的工具。如果输出结果显示not found说明mex文件没有被Matlab加入搜索路径或者被放到别的目录里了。常见做法是先把所有m文件和mexw64文件放在同一个文件夹再把该文件夹设为当前目录。如果which找到了文件但运行时仍报错那就是mex文件与当前Matlab版本不兼容属于编译层面的问题参考第5章第1节去处理。环境确认后再运行main.m程序会自动调用SO.m做迭代寻优并输出分类效果图。运行期间Command Window里会打印每代的适应度变化如果长时间没有输出先不要关窗口去检查fun.m里是否用了断点或者数据量是否大得超出预期。main.m和SO.m之间是通过函数参数传递数据的所以main.m里的X、Y、种群大小、迭代次数都需要在跑之前看清楚改数据路径时尤其注意别改错变量名。3.3 main.m里的数据读取和标签整理main.m的第一步通常是读取Excel数据。常见做法是用xlsread读取第一个sheet把特征和标签拆开。我在这类代码里看到最多的一个坑就是原始Excel里标签没有放在最后一列或者标签列是文本格式。%% 数据读取 data xlsread(数据.xlsx); % 默认读取第一个sheet X data(:, 1:end-1); % 前若干列是特征 Y data(:, end); % 最后一列是类别标签 %% 标签整理成libsvm偏好的二分类形式0/1转1/-1 labels unique(Y); map containers.Map(labels, [1; -1]); Ybin zeros(size(Y)); for i 1:length(Y) Ybin(i) map(Y(i)); end逻辑说明xlsread会把数值型内容读成double矩阵特征和标签放在同一个矩阵里靠列位置区分。unique先找出标签实际有几类然后通过containers.Map把原始标签映射成1和-1这是libsvmtrain最常用的二分类标签写法。参数说明里有一个容易忽略的点如果原始标签是字符串xlsread会直接把整列读成NaN必须先在Excel里把类别改成数值。类别少时比如“正常/故障”两类的场景建议在Excel里直接先转成0和1可以在main.m里少一道映射也更不容易出错。这一步还要顺手检查数据里有没有NaN和Inf。xlsread遇到空单元格返回的是NaNlibsvmtrain一旦读到NaN轻则训练警告重则直接报错。我的习惯是在数据读取后加一行检查用any(isnan(X(:)))判断如果有就回到Excel里把空单元格补上或者用均值填充。3.4 编译libsvm的mexWindows和Linux的典型差异如果运行main.m时提示mex不是有效文件最保险的办法是用libsvm-3.24自带的源码重新编译。先进入libsvm-3.24目录在Matlab里执行编译脚本。cd(D:/work/so_lssvm/libsvm-3.24); make;逻辑说明make脚本会调用mex命令把libsvmtrain.c、libsvmpredict.c等C源码编译成当前Matlab版本和当前操作系统对应的mex文件。编译前提是Matlab能识别编译器Windows下一般安装MinGW-w64在Matlab的Add-On工具里直接搜索MinGW就可以装。Linux下如果报gcc版本不对先执行mex -setup选一个兼容的C编译器再重跑make。编译完成后把生成的mexw64Linux下是mexa64拷贝到上一级目录覆盖原来的同名文件。这是一个带后悔药的做法不要直接删旧文件先留着一旦新编译出来的还是不行还能回退回去。Windows和Linux的区别主要在文件后缀和编译器选择。Windows下Matlab要求用MinGW或MSVCLinux下用gccMac下用clang。还有一点容易翻车如果Matlab装的是32位版本编译出来的mex是mexw32那和你下载包里的mexw64就不是一回事这种情况在R2019b之后的版本已经很少见但值得确认一下自己的Matlab位数。4. 蛇群算法的温度、食物量、战斗与交配算子SO.m里的阈值逻辑解析4.1 食物量和温度的两个阈值探索与开发的开关蛇群算法的核心并不复杂它把整个迭代过程看成蛇群对食物、交配、战斗三种需求的权衡。两个关键变量是食物量Q和温度T。Q随迭代进行指数衰减表示环境里食物越来越少蛇群要被迫越来越依靠局部搜索T也随迭代递减但温度高低决定蛇群是优先交配还是优先捕食。当Q小于食物量阈值Q0时蛇群进入探索模式到处随机找新的区域当食物充足且温度高于温度阈值Th时蛇群向最优食物位置聚集温度低时雄性和雌性蛇群会发生交配或战斗通过两个群体的信息交换避免种群快速同质化。% 蛇群算法主循环的骨架代码完整逻辑以SO.m为准 for it 1:max_iter Q c1 * exp((it - max_iter) / max_iter); % 食物量随迭代指数衰减 T exp(-it / max_iter); % 温度随迭代递减 Q0 0.25; % 食物量阈值 Th 0.6; % 温度阈值 for i 1:N if Q Q0 % 食物不足全局探索 X(i,:) lb rand(1, dim) .* (ub - lb); else % 食物充足按温度决定方向 if T Th % 高温捕食向当前最佳位置靠拢 X(i,:) X(i,:) 2 * rand(1, dim) .* (best_pos - X(i,:)); else % 低温交配或战斗分雌雄群体更新 if rand 0.5 X(i,:) X(i,:) 2 * rand(1, dim) .* (best_male - X(i,:)); else X(i,:) X(i,:) 2 * rand(1, dim) .* (best_female - X(i,:)); end end end end end逻辑说明这段代码不是对SO.m的逐行抄写而是把最关键的阈值分支结构提取出来。c1控制食物量衰减速度c1越大Q从初始值往下掉得越快算法会更早进入局部搜索。dim是整个优化问题的变量维度LSSVM参数寻优时dim2。这段骨架的意义在于帮你建立排查思路如果收敛曲线一直上下乱跳多半是Q小于Q0的分支触发得太频繁全局探索比例过高如果30代以内曲线就平了很可能是T大于Th分支占主导种群过早集中到某个局部区域。4.2 蛇群初始化Bounds.m和initialization.m怎么定搜索空间SO.m里所有个体位置都要落在Bounds.m定义的上下界内。初始化时种群分成雄性群和雌性群目的是让后续交配算子有真正的两个父本群体可以交叉。如果初始化时雄雌边界没分开后面的交配就会退化成单个种群的随机游走。function [lb, ub, dim] Bounds() dim 2; % 两个待优化变量gamma、sigma lb [0.1, 0.01]; % 惩罚系数下界、核宽下界 ub [100, 10]; % 惩罚系数上界、核宽上界 end逻辑说明Bounds.m是一个很不起眼但决定搜索效率的文件。lb和ub直接圈出SO的搜索空间范围太大蛇群在有限迭代里很难摸到好区域范围太小最优解可能在边界外面。常见做法是先做一个粗略实验把lb设成[0.01, 0.001]ub设成[200, 20]看最优参数落在哪个区间内再逐步收缩这个区间。这个习惯能明显减少SO迭代代数的浪费。初始化文件initialization.m会调用Bounds.m拿到lb、ub和dim然后用均匀随机数生成初始种群并给每个个体打上雄性或雌性标记。在高维特征场景下建议保持dim不变但对特征先做主成分或方差过滤这样SO仍然在二维参数空间搜索只是输入数据更干净。4.3 fun.m的交叉验证适应度函数把错误率作为优化目标SO的每个个体是一组候选的γ和σfun.m负责把这组参数翻译成分类错误率。为了让结果不依赖某一次偶然划分我一般会在这个文件里做K折交叉验证。function err fun(param, X, Y, K) cmd sprintf(-s 0 -t 2 -c %.6f -g %.6f -q, param(1), param(2)); indices crossvalind(Kfold, Y, K); acc zeros(K, 1); for k 1:K test_idx (indices k); train_idx ~test_idx; model libsvmtrain(Y(train_idx), X(train_idx, :), cmd); [~, acc_k, ~] libsvmpredict(Y(test_idx), X(test_idx, :), model); acc(k) acc_k(1); end err 100 - mean(acc); end逻辑说明sprintf拼出libsvm的命令行参数串-s 0表示C-SVC分类-t 2表示RBF核-c后面是惩罚系数-g后面是核参数-q表示训练过程静默输出。crossvalind生成K折的下标每折轮流做验证集其余做训练集。libsvmpredict返回的第二个输出是一个结构体数组acc_k(1)是分类准确率单位是百分数所以err算出来是平均错误率。这个err就是SO优化目标越小越好。关于参数的特别提醒-c和-g必须按当前数据尺度去给定否则模型可能一直是同一个边界SO收敛曲线会完全不变。遇到过一种情况是γ和σ的取值范围跨了几个数量级SO初始种群全落在某个无效区域适应度每代都一样这时候把Bounds缩窄或者做对数均匀初始化问题立刻解决。4.4 收敛速度和计算量估算别让交叉验证撑爆整个寻优过程SO-LSSVM的耗时大头从来不是SO本身而是fun.m里反复调用的libsvmtrain。假设样本量300行、特征10列一次train加predict大约几十毫秒SO种群数20迭代50代每代每个个体要做一次5折交叉验证总训练次数就是20乘50乘5等于5000次。在普通笔记本上这个规模的耗时大概几分钟到十几分钟可以接受。但如果数据扩到几万行一次训练就要上百毫秒循环次数不变的话总耗时直接跳到半小时以上。这种时候我会做三个调整一个是把K从5降到3减少交叉验证重复次数另一个是在SO迭代初期允许fun.m只训练训练集的70%随机子集用节点准确率先近似适应度最后一个是先做特征降维把几百列压到三十列以内。这三个调整都会让寻优总时间明显下降而且对最终参数组合的影响在可接受范围。反正SO本身就是启发式搜索不需要每一代都追求精确的交叉验证结果。要注意的是降维或抽样不能改变标签分布否则分类问题就变成另一个问题了。5. SO-LSSVM避坑记录mex不兼容、标签错位、归一化泄漏等五类问题5.1 mexw64文件与Matlab版本不兼容现象运行main.m时窗口直接报错说libsvmpredict.mexw64不是有效的Win64应用程序或者提示找不到指定的模块。 原因mex文件是C源码在某个特定Matlab版本和编译环境下生成的二进制接口。用R2019b编出来的mexw64放到R2021a里就可能因为内部API变化而无法加载。 解决进入libsvm-3.24目录重新编译。执行make之前先用mex -setup确认已有可用的C编译器编译完把新生成的mexw64覆盖到根目录。如果编译报错提示缺头文件检查libsvm-3.24目录下的svm.h是否在同级路径常见做法是把src目录里的头文件和C文件直接复制到libsvm-3.24根目录再编。这个问题是这份源码包里最容易遇到的因为你不知道下载资源的人用的是哪个Matlab版本。5.2 标签不是1/-1二值向量现象模型训练不报错但预测准确率一直在50%附近或者把回归的均方误差也打印出来。 原因libsvm在训练时如果检测到标签是连续数值可能会把它当成回归问题或回归格式处理。很多Excel数据里的类别标签是0和1直接丢给libsvmtrain往往不会报错但结果不按分类语义走。 解决在fun.m以外单独做标签预处理统一转成列向量并且二分类强制用1和-1。可以用unique(Y)先确认类别数如果不是两类多分类要改用-s 0的multi-class模式并检查libsvm的手册说明。这层整理放main.m里不要塞进fun.m的循环内否则每次适应度评估都要重复映射。曾经有一次我把标签整理代码误放在fun.m里结果SO每代都在重复做containers.Map构造耗时直接翻倍。5.3 归一化泄漏在切分前把全量数据一起归一化现象交叉验证准确率特别高简直完美但换一批新数据做验证时分数掉得一塌糊涂。 原因如果在切分训练集和测试集之前用全量数据的均值和标准差做归一化测试集的统计信息已经透过归一化参数泄漏到训练过程里导致结果虚高。 解决严格按先切分再归一化执行。训练集拟合归一化参数测试集只应用同一套参数不要重新估计。% 正确顺序先切分再归一化 [X_train, X_test, Y_train, Y_test] partition(X, Y, 0.8); ps mapminmax(X_train, 0, 1); X_train_norm mapminmax(apply, X_train, ps); X_test_norm mapminmax(apply, X_test, ps);逻辑说明partition是一个示意函数实际可以用cvpartition或randperm实现。mapminmax第一次调用返回一个结构体ps里面保存了训练集每一列的最大最小值和变换参数第二次用apply模式让测试集复用同样的参数。这个动作虽然很小但它是SO-LSSVM能不能泛化的分水岭。尤其在做SO寻优时fun.m内部每一折交叉验证都应该只基于训练折做归一化不要在fun.m外面提前把整个X归一化一遍再传进去。5.4 SO算法卡在局部最优现象最佳适应度曲线在迭代中段就持平连续十几代没有变化而且多次运行结果差异明显。 原因种群数量太小或者Bounds范围太宽蛇群在有限代数里没有充分覆盖最优解所在区域。另一个常见诱因是c1参数调太高食物量过早衰减到阈值以下算法太快进入局部搜索。 解决把种群数调大到20或30迭代次数加到80代以上并适当收窄Bounds。多跑几次独立实验比较每轮的best_curve如果结果很分散说明搜索空间或种群多样性有问题。这里不需要用什么玄学调参技巧把lb和ub按实际特征尺度缩窄往往比盲目加迭代次数有效得多。还有一个小技巧先跑一遍数据量较小的快速版本比如只用100个样本把SO调通再切回全量数据做最终寻优能省不少时间。5.5 样本维度太高SO-LSSVM训练耗时爆表现象程序能跑但每一代交叉验证都要等很久一次完整寻优没完没了。 原因libsvm的训练复杂度随样本数和特征数上升SO循环里累计了大量训练调用时间被几何级数放大。 解决先对特征做方差过滤或PCA降维再进入SO寻优。降维后的数据既保留了主要区分信息又能让LSSVM的核矩阵计算速度快一个量级。如果样本量也很夸张可以在fun.m里临时用抽样子集替代全量交叉验证等SO收敛后再用全量数据重新训练一次并验证。% 特征较多时先做一个粗略的方差过滤 featVar var(X); keep featVar prctile(featVar, 10); % 留方差最大的前90% X X(:, keep);逻辑说明这个过滤逻辑很简单方差接近零的列对分类基本没有贡献先剔除它们可以让后续SO的每一次适应度评估都更快。注意阈值10这个数字不是固定的特征多就调高特征少就调低核心思路是保留有区分度的信息去掉拖慢训练速度的冗余列。如果过滤之后还是觉得慢再上PCA。6. 从能出图到敢交差三个验证抓手6.1 保存收敛曲线和随机搜索基准做对比SO跑完看到准确率图很容易直接收工但我建议先存一条收敛曲线出来。在SO.m主循环里每一代把最优适应度记录到数组best_curve中最后和一组随机采样的参数做对比。figure; plot(best_curve, LineWidth, 1.5); hold on; plot(rand_best_curve, --, LineWidth, 1.5); xlabel(迭代次数); ylabel(交叉验证错误率(%)); legend(SO-LSSVM, Random Search, Location, NE);逻辑说明如果SO跑出来的最终错误率和随机搜索差不多说明问题多半不在算法而在数据本身或者参数范围设置。反过来如果SO明显低于随机搜索说明参数寻优真的在起作用。这个对比能帮你快速区分“模型该换”和“参数没找对”。6.2 最优参数再用独立测试集验证SO找到的γ和σ只是交叉验证意义上的相对更优解不等于真实预测效果好。我会把全部数据按7比3切开70%用来做SO寻优30%留到最后验证。最终参数确定后在预留的30%数据上跑一次libsvmpredict用混淆矩阵看每个类别的正确率而不仅仅看总体准确率。这一步能暴露类别不均衡问题。你可以用confusionmat生成矩阵按行看每一类的召回率按列看精确率。6.3 多分类场景改用宏平均F1如果数据不止两类直接看平均准确率有时会骗人。比如类别A占90%类别B占10%一个把所有样本都判成A的模型也能拿到90%准确率。这时我会改用宏平均F1来给SO做适应度。conf confusionmat(Y_test, Y_pred); F1 zeros(size(conf,1), 1); for i 1:size(conf,1) TP conf(i,i); FN sum(conf(i,:)) - TP; FP sum(conf(:,i)) - TP; F1(i) 2*TP / (2*TP FN FP eps); end macroF1 mean(F1);逻辑说明宏平均F1把每个类别看成同等重要先按混淆矩阵算出每个类别的精确率和召回率再取平均。在fun.m里把返回值改成1-macroF1SO的目标就变成了“让每个类别的表现都更均衡”。这样处理后模型不会为了那一大类的准确率而牺牲小类。从那以后我每次跑SO-LSSVM都会先跑一组随机参数再把SO的收敛曲线和它贴在一起。如果算法折腾五十代还追不上随机搜索我第一反应是去检查坐标映射、标签映射和Bounds范围而不是继续加迭代次数。这个习惯帮我省掉了不少无效调参时间希望帮到你。本文还有配套的精品资源点击获取
返回列表