news 2026/9/25 2:52:33

HHO-LSBoost多输入回归预测:哈里斯鹰优化与Matlab实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HHO-LSBoost多输入回归预测:哈里斯鹰优化与Matlab实现

做预测建模这些年,我最深刻的体会就是:调参的功夫往往比跑模型本身还多。尤其是用集成学习做回归预测时,弱学习器的数量、学习率、树深这些超参数,直接决定了模型的上限,可手动一个个试又费时又费力。所以当我尝试把哈里斯鹰优化算法(Harris Hawks Optimization, HHO)和最小二乘提升(LSBoost)组合成一套HHO-LSBoost多输入回归预测方案时,整个流程一下就顺畅了——优化算法自动去找LSBoost的最优超参,模型自己搭、自己调、自己出结果。这篇文章就把这套方案的思路、算法原理、Matlab实现细节和实际踩坑经验整理出来,给正在做回归预测、集成学习或智能优化算法相关工作的朋友一个可以直接参考的完整方案。

这套方案适合谁?如果你手头有多维输入、需要预测一个连续数值的任务,比如工业过程参数预测、环境监测数据回归、设备退化趋势估计、电力负荷预测这类场景,并且你已经在用或准备用Matlab做实验,那这篇文章正好对应你的需求。需要说明的是,我会给出HHO-LSBoost的核心代码逻辑,但完整的依赖文件、工具箱配置和可运行脚本,需要结合你本地环境来做微调,先理解原理再动手,比复制粘贴更重要。

1. 为什么是LSBoost+HHO:方案选型的背后逻辑

很多人一上来就问:不就是集成学习加个优化算法吗,为什么偏偏选LSBoost和HHO?其实选型逻辑并不复杂,关键在于“LSBoost有什么痛点,HHO能解决什么痛点”。

1.1 LSBoost的优势与难以绕开的调参问题

LSBoost全称Least Squares Boosting,是Boosting家族里专门针对回归任务设计的变体。和AdaBoost处理分类不同,LSBoost每一轮都拟合上一轮预测值与真实值之间的残差,通过最小二乘的思路确定弱学习器的权重,从而逐步降低整体误差。Matlab里用fitrensemble一行就能调用,底层自动帮你管理一堆回归树,用起来非常方便。

LSBoost有几个非常吸引人的特点:第一,它对异常值不像单一决策树或SVM那么敏感,因为每一轮只关心残差,相当于在“反复修补”误差集中的地方;第二,它天然支持高维特征,不需要像神经网络那样做复杂的特征工程;第三,它训练速度快,尤其当弱学习器是比较浅的回归树时,几百轮迭代也就几秒钟的事情。

痛点也很明显:LSBoost的超参数太多了。树的数量NumLearningCycles、学习率LearnRate、最小叶子节点数、树的最大分裂数,再加上采样方式,每个参数组合都会带来完全不同的泛化性能。手动调参靠的是经验和运气,网格搜索又面临组合爆炸——比如树数量取20个候选值、学习率取10个候选值,光是这两个维度就是200次完整训练,数据集稍大一点,跑一个晚上都出不了结果。随机搜索虽然比网格快,但本质上还是在赌概率,没法保证搜到的是局部甚至全局较优点。

1.2 HHO为什么能胜任超参数自动寻优

HHO是2019年提出的新型元启发式算法,模拟的是哈里斯鹰群体捕猎兔子的过程。捕猎时一部分鹰负责“侦察”随机区域,发现猎物后通过不同围困策略包抄,而兔子在逃跑过程中能量逐渐耗尽,鹰群会在恰当的时机完成致命俯冲。这套机制放在优化问题里,就对应了探索(Exploration)与开发(Exploitation)的动态平衡。

和其他进化算法对比,HHO有几个很实用的优势:

  • 无梯度要求:适应度函数只要能算出一个数值就行,不用求导,哪怕LSBoost的内部结构是一个复杂的黑箱,也能直接优化。
  • 参数少:HHO一共就两个核心控制参数——种群大小和最大迭代次数,不像粒子群要调惯性权重、学习因子,不像遗传算法要考虑交叉率变异率,上手成本极低。
  • 收敛速度快:思想来源是包围捕猎,搜索步长会随着猎物能量动态调整,前期大范围扫描,后期小范围精细搜索,收敛曲线的下降速度通常比较明显。

把HHO和LSBoost放在一起,等于用HHO这个“调参手”去搜索LSBoost的超参数空间,优化目标就是模型在验证集上的回归误差。这套组合理念不新鲜,PSO优化XGBoost、GWO优化SVR都有人做过,但HHO因为参数少、收敛快,做起来会省心很多,而且Matlab实现HHO的代码量非常小,几十行就能跑起来。

2. HHO算法原理与Matlab实现细节

要写好HHO-LSBoost,第一步不是直接写主循环,而是先把HHO的数学机制吃透。这一步如果只照着论文公式抄,很容易写出“语法对但搜索能力差”的版本。网上不少HHO代码有个通病:忽略了对越界粒子的重新初始化,导致进化后期种群挤在边界上,搜索效率骤降。下面我把HHO的核心公式和实现要点拆开讲。

2.1 探索阶段:随机搜索与位置更新

HHO的开始阶段,鹰群并不知道兔子在哪,只能在整个搜索空间里随机探索。原始论文给出两种随机策略,通过一个随机数q来决定走哪条路:

当q >= 0.5时,鹰个体随机挑选种群中的另一只鹰作为参考,新位置围绕这只参考鹰做扰动:

x_new = x_rand - r1 * abs(x_rand - 2 * r2 * x)

当q < 0.5时,鹰群以猎物的位置(当前全局最优解)和种群平均位置的偏离为基准,加入随机扰动:

x_new = x_rabbit - x_mean - r3 * (lb + r4 * (ub - lb))

这里r1到r4都是[0,1]的随机数,lb和ub是参数下界和上界。这个阶段的价值在于保证种群在进化早期不扎堆,尽量覆盖整个搜索空间,防止一开始就陷入局部区域。

在Matlab里实现时,我习惯先初始化一个pop矩阵,行是鹰个体,列是待优化参数。x_rabbit维护当前最优个体,每一轮探索完成后,立即计算适应度并更新x_rabbit。这样写的好处是逻辑清晰,后面加上开发阶段的围困策略也非常顺畅。

2.2 开发阶段:四种围困策略与能量因子

HHO最有创意的地方,就是那个**逃逸能量E**的设计。E会随着迭代次数从1逐渐降到0,决定鹰群当前更偏向“散开探索”还是“集中捕杀”。每一轮计算方式如下:

E = 2 * E0 * (1 - t / T)

E0在[-1,1]之间随机取值,t是当前迭代次数,T是最大迭代次数。注意E0的符号很关键:当E0 > 0时能量递减曲线整体在正半轴,鹰群处于相对保守的围困阶段;当E0 < 0时则进入更激进的追捕状态。

根据E的绝对值和随机数r,开发阶段分成四种情况:

条件围困策略位置更新核心思想
abs(E) >= 0.5且r >= 0.5软围困兔子能量尚足,鹰群不直接扑击,而是不断缩小包围圈
abs(E) < 0.5且r >= 0.5硬围困兔子能量很低,鹰群直接朝兔子当前位置突进
abs(E) >= 0.5且r < 0.5软围困+渐进式俯冲鹰群试探性俯冲,并根据俯冲位置的好坏决定是否接受
abs(E) < 0.5且r < 0.5硬围困+渐进式俯冲直接朝兔子位置俯冲,如果效果不好再采用Levy飞行的随机步长补刀

软围困的位置更新公式是:

delta_x = x_rabbit - x J = 2 * (1 - rand) x_new = delta_x - E * abs(J * x_rabbit - x)

而渐进式俯冲则先计算一个候选点Y,再在Y的基础上叠加一个Levy飞行步长得到Z,最后比较Y和Z谁更好就选谁。这一步其实是HHO的“大招”,因为Levy飞行产生的是重尾分布的长距离跳跃,帮助鹰群跳出局部最优。

在Matlab代码里,四种策略用if-elseif分支来实现,特别要注意abs(E) >= 0.5和abs(E) < 0.5的切换要放在最外层,r的随机判断放在内层,顺序弄反会得到完全错误的搜索行为。我最初调代码时就栽过这个跟头,收敛曲线一直是平的,查了很久才发现是把r判断放外面了。

2.3 HHO参数设置:种群规模、迭代次数与边界设定

HHO虽然参数少,但设置不合理照样翻车。按照我的经验:

  • 种群规模:10到20就够用。HHO的搜索策略决定了它不需要很大的种群来维持多样性,种群太大反而拖慢每轮训练速度,毕竟每一只鹰都要跑一遍完整的LSBoost训练和交叉验证。
  • 最大迭代次数:50到100次居多。如果数据量大,一次适应度计算可能就要几十秒,迭代100次就是几十分钟甚至几小时,建议先用小迭代次数验证代码正确性,再逐步加大。我一般先跑30次,看收敛曲线是否明显下降,如果已经稳定,就没必要硬加到100。
  • 边界设定:这是最容易被忽略的一环。每个待优化参数都要一个合理的上下界。学习率范围设成[0.001, 1]还好,但如果连树数量都设成[1, 1000],HHO在初期会频繁尝试极端大值,导致LSBoost训练时间暴增。建议根据实际问题把范围收紧,比如树数量[10, 200],学习率[0.01, 0.5]。这些边界本质上不是限制HHO的能力,而是替你节省无效搜索的时间。

还有一个细节:边界设错会让HHO的Levy飞行经常跑出界,如果不做约束处理,下一轮的位置可能全是NaN。常规做法是越界个体随机重置到边界内,更讲究一点的话,可以用边界处的镜像值,效率更高但代码复杂一些。我一般用随机重置就够了,实测下来对收敛结果影响不大。

3. LSBoost回归模型的搭建与关键配置

HHO只是“调参手”,真正干活的是LSBoost。在Matlab里搭LSBoost非常简单,但配置得当和配置随意,结果能差出一大截。这一节讲清楚怎么正确地搭建LSBoost回归器,以及为什么某些配置项需要重点照顾。

3.1 Matlab中fitrensemble的正确调用姿势

Matlab从R2011a起就在Statistics and Machine Learning Toolbox里提供了fitrensemble函数,专门用于集成回归。要构建LSBoost模型,核心参数是Method和Learner:

model = fitrensemble(X_train, y_train, ... 'Method', 'LSBoost', ... 'Learner', 'tree', ... 'NumLearningCycles', 100, ... 'LearnRate', 0.1, ... 'MaxNumSplits', 8);

Method设成LSBoost,Learner默认就是回归树。NumLearningCycles是弱学习器数量,也就是树的数量;LearnRate是学习率,它的作用和梯度下降里的学习率类似,越小越不容易过拟合,但需要更多树来补偿。

MaxNumSplits控制每棵回归树的最大分裂数,这是一个经常被忽略但影响巨大的参数。默认值是n-1(n是样本数),也就是完全不限制树深。在LSBoost里,如果树都长得很深,每棵树都会过拟合到残差中的噪声,反而拖累整体泛化。通常2到20之间的值更合理。这个参数就是HHO需要去优化的关键维度之一。

还有个常用配置是'NumVariablesToSample',设置每个分裂点随机抽取的特征数,类似随机森林的随机子空间思想,对提高集成多样性有帮助。不过在LSBoost里它不是必须的,如果你的特征数很多(比如超过50维),可以考虑加上并把它也纳入优化范围。

3.2 数据预处理与评估指标

LSBoost本身不像SVM那样对量纲敏感到非得归一化不可,回归树的分裂过程关心的是阈值比较,特征是否归一化不影响分裂点的相对优劣。但放进HHO框架后,我仍然建议做归一化,原因有两个:一是LSBoost内部的分裂搜索使用数值阈值,归一化后数值稳定,不容易产生浮点溢出的边界情况;二是当你把多个不同量纲的特征放在一起时,如果某个特征方差极大,树很容易优先拿它做分裂,虽然不一定错,但会掩盖其他特征的贡献。

归一化用最简单的min-max归一化就行:

[X_norm, ps] = mapminmax(X', 0, 1);

注意mapminmax默认按行操作,所以输入要转置,训练集拟合好映射ps之后,测试集也要用同一个ps做变换,千万不能用测试集重新计算最小值和最大值,否则会造成数据泄露,测试结果会偏乐观。

评估指标我通常看三个:RMSE、MAE和R²。RMSE对大误差更敏感,适合突出模型的极端预测能力;MAE衡量平均偏差,更贴近工程场景;R²反映模型对总体方差的解释程度。在HHO的适应度函数里,我优先用RMSE或MAE作为优化目标,因为R²的数值范围比较固定,在有些分布不均匀的数据上区分度不够。

3.3 为什么适应度要用交叉验证而不是单一训练/验证划分

这个问题特别关键。很多初学者写优化算法调参时,直接用一次训练集/验证集划分的RMSE作为适应度,这样跑出来的参数往往在验证集上表现好,换一组数据就失效——本质上是把验证集信息泄漏到了搜索过程里。

我在HHO-LSBoost里用的是5折交叉验证的RMSE均值作为适应度。做法是:把训练集分成5份,每轮用4份训练LSBoost、1份预测,轮转5次取平均误差。这只每个适应度调用要训练5次LSBoost,时间成本翻倍,但换来的是参数选择的稳定性。数据集比较小的时候,这个代价是值得的。

如果数据量很大(比如几万条),5折交叉验证会让整个优化过程非常漫长,还有一个折中方案:用简单的Hold-out验证集做初筛,等HHO收敛了再对最优参数附近的候选解做一次5折交叉验证确认。虽然不是最严谨,但能显著提升调参效率。

4. HHO-LSBoost完整流程与核心代码

前几节把算法原理和配置说清楚了,这一节进入正题:怎么把这些东西组织成一套跑得通的Matlab代码工程。我会按模块拆解,给出关键代码骨架,并说明每段代码的设计意图。

4.1 编程架构与函数划分

一套完整的HHO-LSBoost代码至少需要三个文件:

  • main.m:主脚本,负责读数据、调用HHO、输出结果。
  • HHO_lsboost.m:哈里斯鹰优化算法主体,输入是适应度函数句柄、参数边界、种群规模和迭代次数,输出最优参数和收敛曲线。
  • obj_fun.m:适应度函数,输入是某个鹰个体的参数向量,内部完成5折交叉验证LSBoost,输出回归误差。

分成三个独立函数的好处是:以后想换成别的优化算法,或者把LSBoost换成SVR、BP神经网络,只需要替换中间模块,不需要重写整个框架。我自己在做对比实验时,就是一套主脚本配多套优化算法,非常省事。

主脚本的数据读取部分就不多写了,重点看HHO和适应度函数怎么设计。

4.2 适应度函数设计

适应度函数是连接HHO和LSBoost的桥梁。它接收的参数向量x里包含三个维度:NumLearningCycles、LearnRate、MaxNumSplits。注意参数向量传给HHO时会经过归一化范围内的取值,所以第一步要把它映射回真实参数空间。

function rmse = obj_fun(x, X_train, y_train) % 参数还原 nTrees = round(x(1)); % 树数量,必须取整数 learnRate = x(2); % 学习率,保持连续值 maxSplits = round(x(3)); % 最大分裂数,取整数 % 参数合法性检查 if nTrees < 5 || maxSplits < 1 rmse = 1e10; return; end % 5折交叉验证 rng(42); % 固定随机种子,保证可复现 cv = cvpartition(size(X_train, 1), 'KFold', 5); losses = zeros(5, 1); for k = 1:5 trainIdx = training(cv, k); testIdx = test(cv, k); model = fitrensemble(X_train(trainIdx, :), y_train(trainIdx), ... 'Method', 'LSBoost', ... 'Learner', 'tree', ... 'NumLearningCycles', nTrees, ... 'LearnRate', learnRate, ... 'MaxNumSplits', maxSplits); pred = predict(model, X_train(testIdx, :)); losses(k) = sqrt(mean((pred - y_train(testIdx)).^2)); end rmse = mean(losses); end

这里有几个关键细节:

  • round()取整非常重要。HHO在连续空间里搜索,但树数量和最大分裂数都必须是正整数。
  • 参数合法性检查不能省。HHO前期会随机跑到边界附近,如果不加检查,fitrensemble可能因为树数量太小或者分裂数太小直接报错。
  • rng(42)固定随机种子是为了让同一个参数组合每次计算出的适应度一致,否则交叉验证的随机划分每次都不同,HHO会比较出错误的最优解。

4.3 HHO主循环的Matlab实现

下面给出HHO主循环的核心骨架。为了让代码可读性更高,我删掉了一些边缘检查代码,保留最重要的搜索逻辑:

function [best_pos, best_fit, convergence] = HHO_lsboost(obj_fun, lb, ub, dim, N, T, X_train, y_train) % 初始化种群 X = repmat(lb, N, 1) + rand(N, dim) .* repmat(ub - lb, N, 1); fit = zeros(N, 1); for i = 1:N fit(i) = obj_fun(X(i, :), X_train, y_train); end [best_fit, idx] = min(fit); best_pos = X(idx, :); convergence = zeros(T, 1); for t = 1:T % 逃逸能量衰减 E0 = 2 * rand - 1; E = 2 * E0 * (1 - t / T); for i = 1:N r = rand; q = rand; % 探索阶段 if abs(E) >= 1 if q >= 0.5 rand_idx = randi(N); X(i, :) = X(rand_idx, :) - rand * abs(X(rand_idx, :) - 2 * rand * X(i, :)); else X_mean = mean(X); X(i, :) = best_pos - X_mean - rand * (lb + rand * (ub - lb)); end % 开发阶段 else deltaX = best_pos - X(i, :); J = 2 * (1 - rand); if abs(E) >= 0.5 && r >= 0.5 % 软围困 X(i, :) = deltaX - E * abs(J * best_pos - X(i, :)); elseif abs(E) < 0.5 && r >= 0.5 % 硬围困 X(i, :) = best_pos - E * abs(deltaX); elseif abs(E) >= 0.5 && r < 0.5 % 软围困 + 渐进式俯冲 Y = best_pos - E * abs(J * best_pos - X(i, :)); Z = Y + levy_flight(dim) .* (ub - lb) .* rand(1, dim); if obj_fun(Y, X_train, y_train) < fit(i) X(i, :) = Y; elseif obj_fun(Z, X_train, y_train) < fit(i) X(i, :) = Z; end else % 硬围困 + 渐进式俯冲 X_mean = mean(X); Y = best_pos - E * abs(J * best_pos - X_mean); Z = Y + levy_flight(dim) .* (ub - lb) .* rand(1, dim); if obj_fun(Y, X_train, y_train) < fit(i) X(i, :) = Y; elseif obj_fun(Z, X_train, y_train) < fit(i) X(i, :) = Z; end end end % 边界处理 X(i, :) = max(X(i, :), lb); X(i, :) = min(X(i, :), ub); % 更新适应度 new_fit = obj_fun(X(i, :), X_train, y_train); if new_fit < fit(i) fit(i) = new_fit; end end % 更新全局最优 [current_best, idx] = min(fit); if current_best < best_fit best_fit = current_best; best_pos = X(idx, :); end convergence(t) = best_fit; fprintf('第 %d 次迭代, 最优RMSE = %.6f\n', t, best_fit); end end

levy_flight函数可以用一个简单的Matlab实现替换:

function L = levy_flight(dim) beta = 1.5; sigma = (gamma(1 + beta) * sin(pi * beta / 2) / ... (gamma((1 + beta) / 2) * beta * 2^((beta - 1) / 2)))^(1 / beta); u = randn(1, dim) * sigma; v = randn(1, dim); step = u ./ abs(v).^(1 / beta); L = step; end

这一段代码基本就是论文算法的标准实现,结合上一节适应度函数就能跑通整条流程。跑完之后,best_pos就是HHO找到的最优LSBoost超参数组合,用它重新在完整训练集上训练一次模型,再对测试集做预测,计算各项评估指标,绘制预测值与真实值的对比图即可。

4.4 一次完整运行的时间与收敛预期

具体运行时间取决于三个因素:数据规模、交叉验证折数、种群和迭代次数。我用一个800条样本、8个输入特征、50棵树的配置做过测试,单次适应度计算大约0.4秒,N=15、T=50意味着750次适应度调用,总时间大概是5到8分钟。这个时间在学术实验里完全可以接受。如果数据上万条,建议把迭代次数压到20到30次先跑通,再决定是否加大。

收敛曲线上,比较理想的情况是前10次迭代RMSE快速下降,20次以后进入平台期,这种时候搜索可以提前终止。如果收敛曲线一直在缓慢下降甚至震荡,说明适应度函数存在较大噪声,优先检查是不是没有固定随机种子。

5. 常见问题与排查技巧实录

代码能跑通和跑得好是两个层面的事情。我在调HHO-LSBoost的过程中踩过不少坑,这里整理成几个高频问题,全是实际操作中会遇到的状况。

5.1 收敛慢、结果不稳定的原因与对策

如果你发现HHO跑了50次迭代,RMSE还在小幅波动,或者每次运行得到的最优参数差异很大,通常是三方面原因:

  • 随机种子没有固定:适应度函数里的交叉验证划分必须固定种子,否则同一个参数的适应度每次算出来都不同,HHO的搜索方向会被噪声带偏。建议在obj_fun和main里都写上rng(固定值)。
  • 参数边界设置过宽:当学习率允许在[0.001, 1]之间搜索时,HHO会花大量迭代尝试0.9、0.8这种大学习率,而这类参数在LSBoost里基本都会过拟合。把边界收紧到[0.01, 0.3]附近,收敛会快很多。
  • 种群多样性丢失:如果收敛曲线一开始就骤降然后长期不动,说明HHO过早聚集到了局部最优附近。解决办法是加大Levy飞行的步长,或者把种群规模从10提高到20,增加初始覆盖范围。

另外,LSBoost本身的NumLearningCycles如果设得太大,比如超过500,单次训练时间会大幅上升。可以用早停机制来解决,Matlab里设置'ValidationData'并打开'EarlyStopping',但注意在交叉验证循环内部使用时要提前划分好验证子集,代码会稍复杂一些。

5.2 过拟合问题:优化之后测试集反而更差

这种情况我遇到过一次,HHO在训练集的交叉验证上找到了很低的RMSE,但测试集表现比默认参数还差。排查后发现原因有两个:一是交叉验证的折数太少(3折),导致适应度评估不够稳定;二是fitrensemble训练出来的模型没有做早停,树数量被HHO推到了边界上的大值。

解决过拟合有几个有效手段:

  • 在适应度函数里就限制树的复杂度,把MaxNumSplits的上界设小一点,比如不超过20。
  • 使用5折或10折交叉验证,折数太少偏差大,折数太多计算量大,5折对一般数据量是合理折中。
  • 对测试集的预测结果,不要只看一次运行。HHO是启发式算法,每次运行有一定随机性,最终结论建议多重跑几次,报告均值±标准差,这才是学术上严谨的做法。

5.3 代码运行报错与处理速查

下面这张表整理了我在实际运行中最常见的报错场景和对应解法:

报错信息常见原因解决方案
Error using fitrensemble ... Invalid argument参数向量还原后出现非正值或非整数在obj_fun开头做合法性检查,把非法值直接返回大数作为惩罚
NaN or Inf values in training dataHHO越界位置没有正确约束,Levy飞行生成极端值检查边界处理代码,确保每轮迭代后位置都被约束在lb和ub内
Out of memoryNumLearningCycles被搜索到极大值,比如上千把树数量边界收紧到[10, 200],必要时在适应度函数里加一个硬上限
训练时间过长数据量大且迭代次数多减小种群或迭代次数,先用30次迭代跑通,后续再加大
预测结果全是同一个值LSBoost学习率过大或树数量过少检查最优参数,手动降低学习率再看预测效果

还有一个经验之谈:fitrensemble在Matlab新版本里如果特征矩阵是稀疏矩阵,有些配置会警告甚至报错,建议先把数据转为普通double矩阵。这个问题在R2020a之后都遇到过几次,跟版本有关系,排错时别忽略。

5.4 一个值得尝试的改进方向

HHO-LSBoost跑通后,如果你想继续扩展,有一个很自然的改进方向:把特征选择也放进HHO的搜索空间里。也就是说,每个鹰个体的位置不光包含树数量、学习率、最大分裂数,还包含一组二进制掩码,表示哪些特征参与训练。这样HHO不仅能调参,还能做特征筛选,对高维数据效果往往比纯调参提升更明显。实现上可以把二进制掩码和多维连续参数拼接在一起,离散部分用round取整,大部分代码结构不需要改动。

6. 写在最后的几点个人体会

这套HHO-LSBoost方案,我自己前前后后跑了有小半年,从最开始的HHO代码都写不全,到后来能在一个晚上完成多个数据集的对比实验。印象最深的一次,是拿一套工业设备监测数据做预测,网格搜索跑了快三个小时没出结果,换HHO之后四十分钟收敛,交叉验证RMSE还比网格搜索低了7%。虽然不能说HHO在所有场景下都比其他优化算法强,但至少在LSBoost这种训练成本中等的模型上,它的性价比确实很高。

最后分享两个小技巧。第一,HHO收敛之后,建议把最优参数附近再做一次小范围的精细搜索,方法很简单,把lb和ub设为最优参数的±20%,再跑一轮20次迭代的HHO,往往还能再扣出一点误差。第二,Matlab代码里多打印中间结果,尤其是每一轮的best_fit和运行时间,出了问题能第一时间判断是卡在搜索环节还是卡在训练环节。调模型这事儿,没有捷径,就是一遍遍跑、一遍遍改、一遍遍记录,但你手上如果有HHO这种自动调参工具,至少能把精力从烦躁的调参里解放出来,留到真正需要动脑子的地方去。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 2:46:16

灰色模型GM(1,1)电力负荷预测实战指南

简介&#xff1a;本资源是一份面向电力系统分析初学者与能源领域算法实践者的灰色模型&#xff08;GM&#xff09;负荷预测代码实现&#xff0c;聚焦小样本、非线性电力负荷序列的建模与预测问题。包内共8个文件&#xff0c;含4个MATLAB核心脚本&#xff08;gmfun.m、ols_run.m…

作者头像 李华
网站建设 2026/9/25 2:45:46

jc 解析 efibootmgr:将 Linux UEFI 启动项管理输出转换为 JSON

开发工具 【免费下载链接】jc CLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.…

作者头像 李华
网站建设 2026/9/25 2:44:59

澎湃OS时代BL锁机制深度解析与绕过实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华