化SVM參數(shù)實(shí)現(xiàn)時(shí)間序列預(yù)測(cè)的實(shí)戰(zhàn)指南)
1. 項(xiàng)目解讀POA、SVM與時(shí)序預(yù)測(cè)為什么會(huì)湊到一起看到這個(gè)標(biāo)題我第一反應(yīng)是這又是一個(gè)“新優(yōu)化算法 經(jīng)典機(jī)器學(xué)習(xí)模型”的論文配方。但仔細(xì)把這套組合拆開(kāi)看了一遍我得說(shuō)如果你手頭正好有一個(gè)時(shí)序預(yù)測(cè)任務(wù)、又不想在SVM的參數(shù)上調(diào)到懷疑人生那這個(gè)思路確實(shí)是目前性價(jià)比很高的一種做法。所以這篇內(nèi)容不打算寫(xiě)成論文復(fù)現(xiàn)報(bào)告而是按照我自己做這類項(xiàng)目的習(xí)慣把POA鵜鶘優(yōu)化算法和SVM支持向量機(jī)做時(shí)序預(yù)測(cè)這件事的來(lái)龍去脈、代碼框架、踩坑記錄一次講清楚。先說(shuō)項(xiàng)目本身在解決什么問(wèn)題。SVM做時(shí)序預(yù)測(cè)本質(zhì)上就是把歷史觀測(cè)值構(gòu)造成“特征-目標(biāo)”樣本對(duì)然后訓(xùn)練一個(gè)回歸模型去逼近未來(lái)值。它的問(wèn)題很經(jīng)典懲罰因子C和核函數(shù)參數(shù)gamma對(duì)預(yù)測(cè)精度影響極大而這兩參數(shù)怎么選沒(méi)有統(tǒng)一公式。傳統(tǒng)做法是網(wǎng)格搜索或隨機(jī)搜索但網(wǎng)格搜索在高精度要求下計(jì)算量大隨機(jī)搜索又不穩(wěn)定。更麻煩的是時(shí)序預(yù)測(cè)的樣本之間存在時(shí)間相關(guān)性參數(shù)稍微不合適模型的泛化能力就會(huì)明顯下降。于是就有了這個(gè)項(xiàng)目的核心動(dòng)機(jī)用2022年前后提出的鵜鶘優(yōu)化算法去自動(dòng)搜索SVM的最優(yōu)參數(shù)組合讓模型在少人工干預(yù)的情況下達(dá)到比較好的預(yù)測(cè)效果。再說(shuō)說(shuō)這套方案適合誰(shuí)。如果你是正在做畢業(yè)設(shè)計(jì)或者寫(xiě)小論文的學(xué)生這個(gè)組合天然具備“算法創(chuàng)新 模型改進(jìn) 實(shí)驗(yàn)對(duì)比”的完整故事線可解釋性強(qiáng)、代碼工作量也不算大。如果你是做數(shù)據(jù)分析或設(shè)備預(yù)測(cè)性維護(hù)的工程師這套方法提供了一個(gè)自動(dòng)化調(diào)參的落地方案尤其是當(dāng)數(shù)據(jù)量大、人工調(diào)參成本高時(shí)POA這類群智能算法非常實(shí)用。當(dāng)然如果你完全沒(méi)接觸過(guò)SVM或者優(yōu)化算法也不用擔(dān)心下面我會(huì)從基礎(chǔ)原理開(kāi)始一步步把整個(gè)建模鏈路拆開(kāi)。整個(gè)項(xiàng)目我拆成了六個(gè)模塊算法原理、數(shù)據(jù)工程、Matlab代碼實(shí)現(xiàn)、實(shí)驗(yàn)設(shè)計(jì)、問(wèn)題排查、經(jīng)驗(yàn)心得。按這個(gè)順序讀下來(lái)你基本就能獨(dú)立復(fù)現(xiàn)一個(gè)POA-SVM的時(shí)序預(yù)測(cè)模型。2. 核心原理拆解SVR的敏感參數(shù)與POA的搜索機(jī)制2.1 SVM做回歸預(yù)測(cè)的底層邏輯SVM做分類大家都熟悉但時(shí)序預(yù)測(cè)用的是它的回歸版本也就是SVRSupport Vector Regression。SVR的目標(biāo)不是“找一條線把數(shù)據(jù)分開(kāi)”而是“找一條回歸曲線使得大多數(shù)樣本點(diǎn)的誤差在一個(gè)可容忍的范圍內(nèi)同時(shí)讓曲線盡量平緩”。這個(gè)思想可以類比成畫(huà)一條馬路路中間的實(shí)線是回歸函數(shù)路兩側(cè)的邊線是誤差帶epsilon落在誤差帶內(nèi)的樣本不計(jì)算損失只有超出誤差帶的樣本才進(jìn)入優(yōu)化目標(biāo)。SVR的數(shù)學(xué)形式就不抄教科書(shū)了你需要記住三個(gè)關(guān)鍵參數(shù)它們就是后面POA要搜索的對(duì)象懲罰參數(shù)C控制對(duì)超出誤差帶樣本的懲罰力度。C越大模型越傾向擬合每個(gè)樣本點(diǎn)容易過(guò)擬合C太小模型則過(guò)于平滑欠擬合風(fēng)險(xiǎn)大。核函數(shù)參數(shù)gamma只針對(duì)RBF核。gamma值越小核函數(shù)越平緩模型越平滑gamma值越大模型越復(fù)雜往往過(guò)擬合。這個(gè)參數(shù)對(duì)預(yù)測(cè)結(jié)果的影響甚至超過(guò)C。不敏感損失系數(shù)epsilon決定誤差帶的寬度。epsilon越大被容忍的誤差越多支持向量數(shù)量越少模型越稀疏但精度可能降低。在MATLAB里實(shí)現(xiàn)SVR通常有兩類方式一是用自帶的fitrsvm函數(shù)二是在File Exchange上下載libsvm工具箱。兩套方案的參數(shù)名稱略有差異后面我會(huì)在代碼部分做一個(gè)對(duì)照很多人在這一步就栽了跟頭。2.2 POA的靈感來(lái)源與數(shù)學(xué)模型鵜鶘優(yōu)化算法是Mohammad等人于2022年提出的一種群智能優(yōu)化算法模擬的是鵜鶘捕魚(yú)時(shí)的群體行為。鵜鶘的捕食過(guò)程可以分成兩個(gè)階段第一階段是發(fā)現(xiàn)獵物后從高空俯沖這個(gè)階段強(qiáng)調(diào)大范圍的全局搜索對(duì)應(yīng)優(yōu)化算法中的勘探第二階段是鵜鶘在水面展開(kāi)翅膀、協(xié)同將魚(yú)群驅(qū)趕進(jìn)喉袋這個(gè)階段強(qiáng)調(diào)在獵物周圍精細(xì)搜索對(duì)應(yīng)開(kāi)發(fā)。用數(shù)學(xué)語(yǔ)言描述POA的更新過(guò)程如下。假設(shè)種群規(guī)模為N每個(gè)個(gè)體是一個(gè)候選解維度等于待優(yōu)化參數(shù)的個(gè)數(shù)在這個(gè)項(xiàng)目里就是C和gamma這2個(gè)維度。第一階段的位置更新公式為_(kāi)new _i rand · (Prey ? I · _i)這里面rand是[0,1]均勻分布的隨機(jī)數(shù)I是隨機(jī)取1或2的整數(shù)二者都帶有隨機(jī)性目的是讓個(gè)體在獵物附近有不同幅度的跳躍。第二階段公式為_(kāi)new _i 0.2 · (1 ? t/T) · (2 · rand ? 1) · _i這里t是當(dāng)前迭代次數(shù)T是最大迭代次數(shù)系數(shù)0.2是鵜鶘捕食時(shí)的翅膀展開(kāi)因子(1?t/T)保證前期搜索范圍大、后期逐步縮小實(shí)現(xiàn)從勘探到開(kāi)發(fā)的平滑過(guò)渡。整體上看POA的公式比粒子群算法PSO更簡(jiǎn)潔它沒(méi)有單獨(dú)維護(hù)速度項(xiàng)也沒(méi)有慣性權(quán)重、個(gè)體學(xué)習(xí)因子、社會(huì)學(xué)習(xí)因子那一堆需要人工設(shè)定的超參數(shù)對(duì)新手來(lái)說(shuō)友好很多。我當(dāng)時(shí)選POA而不是PSO或遺傳算法還有一個(gè)實(shí)際原因在這類輕量級(jí)優(yōu)化任務(wù)中兩個(gè)參數(shù)、目標(biāo)函數(shù)計(jì)算成本高POA收斂速度快迭代10到30次通常就能找到不錯(cuò)的區(qū)域。PSO通常需要更多迭代次數(shù)來(lái)穩(wěn)定遺傳算法則要處理編碼、選擇、交叉、變異四個(gè)環(huán)節(jié)代碼量明顯更大。2.3 為什么是POA而不是網(wǎng)格搜索有人可能會(huì)問(wèn)只有兩個(gè)參數(shù)網(wǎng)格搜索也很快為什么要用優(yōu)化算法這個(gè)問(wèn)題我實(shí)際測(cè)試過(guò)。如果C和gamma都搜20個(gè)值網(wǎng)格搜索要做400次SVM訓(xùn)練如果時(shí)序預(yù)測(cè)用5折交叉驗(yàn)證那就是2000次訓(xùn)練。在我的測(cè)試集上單次SVR訓(xùn)練約0.2秒網(wǎng)格搜索需要400秒以上。POA跑15次迭代、種群20個(gè)個(gè)體最多300次SVM訓(xùn)練而且很多個(gè)體在后期會(huì)聚集到相似區(qū)域?qū)嶋H訓(xùn)練次數(shù)還更少。換句話說(shuō)POA不是“炫技”它確實(shí)能把計(jì)算成本壓縮一個(gè)量級(jí)。數(shù)據(jù)規(guī)模越大這個(gè)優(yōu)勢(shì)越明顯。3. 建模思路與數(shù)據(jù)工程時(shí)序預(yù)測(cè)最容易翻車的前置環(huán)節(jié)3.1 滑動(dòng)窗口法把時(shí)間序列變成SVM能吃的樣本SVM本身不具備記憶能力它只能學(xué)習(xí)“輸入到輸出”的映射。因此時(shí)序預(yù)測(cè)的第一步必須做數(shù)據(jù)重構(gòu)也就是滑動(dòng)窗口法Sliding Window。假設(shè)原始序列是x(1), x(2), …, x(n)設(shè)定窗口長(zhǎng)度p和預(yù)測(cè)步長(zhǎng)q就能構(gòu)造出這樣的樣本對(duì)樣本1輸入 [x(1), x(2), …, x(p)]輸出 x(pq) 樣本2輸入 [x(2), x(3), …, x(p1)]輸出 x(pq1)窗口長(zhǎng)度p的選擇是一個(gè)需要經(jīng)驗(yàn)的地方。p太小模型看不到足夠的歷史模式p太大一方面特征維度變高、SVR訓(xùn)練變慢另一方面窗口里可能混入大量與預(yù)測(cè)無(wú)關(guān)的噪聲。我自己的習(xí)慣是先做自相關(guān)分析Autocorrelation Function, ACF確定序列存在顯著自相關(guān)的滯后階數(shù)然后以這個(gè)階數(shù)為中心試p的取值集合比如針對(duì)電力負(fù)荷這類日周期性明顯的數(shù)據(jù)p7、p24或p48都值得嘗試。初學(xué)階段可以直接用p5到10的小窗口模型效果穩(wěn)定后再逐步擴(kuò)窗口看指標(biāo)變化。構(gòu)造樣本之后還要注意一個(gè)細(xì)節(jié)不要把樣本隨機(jī)打亂。時(shí)序數(shù)據(jù)的順序本身就是信息的一部分尤其是訓(xùn)練集和測(cè)試集之間必須保持時(shí)間上的先后關(guān)系。如果把所有樣本混合后隨機(jī)劃分模型會(huì)“偷看”未來(lái)的數(shù)據(jù)驗(yàn)證集和測(cè)試集指標(biāo)都會(huì)虛高這在真實(shí)業(yè)務(wù)場(chǎng)景中是要出大問(wèn)題的。3.2 訓(xùn)練集、驗(yàn)證集與測(cè)試集的正確劃分方式時(shí)序預(yù)測(cè)的集合劃分有兩種主流策略。第一種是簡(jiǎn)單時(shí)間切分前70%的數(shù)據(jù)做訓(xùn)練中間15%做驗(yàn)證集POA搜索參數(shù)時(shí)用最后15%做測(cè)試集評(píng)估最終模型。這種切分方式速度快、實(shí)現(xiàn)簡(jiǎn)單適合樣本量不足的情況。第二種是滾動(dòng)時(shí)間窗劃分在多個(gè)連續(xù)時(shí)間窗上反復(fù)訓(xùn)練和驗(yàn)證比如先用第1到100天訓(xùn)練、第101到110天驗(yàn)證再滑動(dòng)成第11到110天訓(xùn)練、第111到120天驗(yàn)證。這種方式更貼近金融預(yù)測(cè)、氣象預(yù)測(cè)這類需要頻繁更新模型的場(chǎng)景。我早期犯過(guò)一個(gè)錯(cuò)誤直接沿用分類任務(wù)里的“隨機(jī)劃分”習(xí)慣把打亂的樣本按7:3切分。結(jié)果訓(xùn)練出的模型在驗(yàn)證集上表現(xiàn)驚艷一到測(cè)試集馬上崩盤。原因就是訓(xùn)練樣本里混入了測(cè)試時(shí)段的信息模型實(shí)際上是“背答案”。所以把這個(gè)教訓(xùn)放在前面時(shí)序項(xiàng)目的數(shù)據(jù)集劃分永遠(yuǎn)按時(shí)間順序不隨機(jī)、不混洗。3.3 歸一化與數(shù)據(jù)泄漏一對(duì)容易被忽略的組合拳SVM對(duì)特征的尺度非常敏感尤其RBF核依賴樣本間的歐氏距離。如果原始數(shù)據(jù)范圍是0到10000而另一個(gè)特征的范圍是0到1距離計(jì)算基本被大數(shù)值特征主導(dǎo)小數(shù)值特征形同虛設(shè)。所以在建模前必須做歸一化。MATLAB里最常用的是mapminmax函數(shù)把數(shù)據(jù)映射到[0,1]或[-1,1]區(qū)間。關(guān)鍵坑點(diǎn)在于歸一化參數(shù)只能用訓(xùn)練集的統(tǒng)計(jì)量來(lái)算。正確順序是先用訓(xùn)練集計(jì)算歸一化所需的xmin、xmax然后用這些參數(shù)去映射驗(yàn)證集和測(cè)試集。很多人不假思索地對(duì)全量數(shù)據(jù)調(diào)用mapminmax讓測(cè)試集的信息參與了歸一化參數(shù)的計(jì)算這又是一種數(shù)據(jù)泄漏會(huì)讓評(píng)估結(jié)果比真實(shí)情況樂(lè)觀。這個(gè)錯(cuò)誤非常隱蔽模型部署到新數(shù)據(jù)上時(shí)性能會(huì)明顯下滑調(diào)試時(shí)候一定要檢查這一步。4. Matlab代碼實(shí)現(xiàn)POASVM的核心框架與關(guān)鍵細(xì)節(jié)4.1 整體代碼結(jié)構(gòu)與主流程我復(fù)現(xiàn)這個(gè)項(xiàng)目時(shí)把代碼分成三個(gè)文件main.m負(fù)責(zé)加載數(shù)據(jù)、構(gòu)造樣本、劃分集合以及調(diào)用優(yōu)化流程SVM_Fitness.m負(fù)責(zé)計(jì)算適應(yīng)度也就是給定一組(C, gamma)訓(xùn)練一次SVR并返回誤差指標(biāo)POA.m負(fù)責(zé)鵜鶘優(yōu)化算法的主循環(huán)包括種群初始化、兩階段位置更新和全局最優(yōu)記錄。main.m的偽代碼框架大致如下%% 1. 加載數(shù)據(jù)并構(gòu)造滑動(dòng)窗口樣本 data load(timeseries_data.mat); x data.x; % 原始一維時(shí)間序列 [X, Y] createSlidingWindows(x, p, q); % p窗口長(zhǎng)度q預(yù)測(cè)步長(zhǎng) %% 2. 按時(shí)間順序劃分訓(xùn)練/驗(yàn)證/測(cè)試集 trainLen floor(length(Y) * 0.7); valLen floor(length(Y) * 0.15); X_train X(1:trainLen, :); Y_train Y(1:trainLen); X_val X(trainLen1:trainLenvalLen, :); Y_val Y(trainLen1:trainLenvalLen); X_test X(trainLenvalLen1:end, :); Y_test Y(trainLenvalLen1:end); %% 3. 數(shù)據(jù)歸一化注意只用訓(xùn)練集的統(tǒng)計(jì)量 [x_ps, y_ps] deal(struct()); [X_train, x_ps] mapminmax(X_train, 0, 1); X_train X_train; [X_val] mapminmax(apply, X_val, x_ps); X_val X_val; [Y_train, y_ps] mapminmax(Y_train, 0, 1); Y_train Y_train; Y_val mapminmax(apply, Y_val, y_ps); Y_val Y_val; %% 4. 調(diào)用POA優(yōu)化SVM參數(shù) lb [0.01, 0.001]; % C和gamma的下界 ub [100, 10]; % C和gamma的上界 [bestC, bestGamma, bestFitness, convCurve] ... POA((params) SVM_Fitness(params, X_train, Y_train, X_val, Y_val), lb, ub, ...);createSlidingWindows這個(gè)函數(shù)建議自己?jiǎn)为?dú)寫(xiě)它本質(zhì)就是一個(gè)for循環(huán)拼接矩陣。需要注意的是構(gòu)造出的X矩陣每一行是一個(gè)樣本、每一列是一個(gè)特征MATLAB的fitrsvm默認(rèn)按行樣本處理不要弄反維度。4.2 適應(yīng)度函數(shù)用驗(yàn)證集誤差還是交叉驗(yàn)證誤差適應(yīng)度函數(shù)是POA和SVM之間的橋梁。POA每生成一組(C, gamma)都要交給適應(yīng)度函數(shù)去評(píng)價(jià)好不好。最自然的選擇是用驗(yàn)證集的預(yù)測(cè)誤差作為適應(yīng)度比如均方根誤差RMSE或平均絕對(duì)百分比誤差MAPE。我把SVM_Fitness的代碼簡(jiǎn)化成下面這樣function fitness SVM_Fitness(params, X_train, Y_train, X_val, Y_val) C params(1); gamma params(2); model fitrsvm(X_train, Y_train, ... KernelFunction, rbf, ... BoxConstraint, C, ... KernelScale, 1/sqrt(gamma), ... Epsilon, 0.01, ... Standardize, false, ... Kfold, 5); % 或者不用Kfold直接predict驗(yàn)證集 % 注意fitrsvm內(nèi)部對(duì)參數(shù)做了對(duì)數(shù)變換邊界范圍要按文檔理解 Y_pred predict(model, X_val); fitness sqrt(mean((Y_val - Y_pred).^2)); % RMSE end這里有一個(gè)很多人搞混的地方MATLAB的fitrsvm在RBF核時(shí)使用的是KernelScale參數(shù)它的含義是核函數(shù)里的scale因子而不是直接寫(xiě)gamma。兩者的換算關(guān)系是gamma 1 / (2 * KernelScale^2)近似等價(jià)于gamma 1 / (2 * KernelScale^2)。如果你用了libsvm那libsvm直接接受gamma不需要換算。調(diào)參時(shí)如果發(fā)現(xiàn)模型對(duì)C和gamma的變化不敏感先檢查是不是這個(gè)參數(shù)映射關(guān)系弄錯(cuò)了。關(guān)于適應(yīng)度用驗(yàn)證集還是交叉驗(yàn)證樣本量大的時(shí)候直接用驗(yàn)證集就夠速度快樣本量小的時(shí)候建議在訓(xùn)練集內(nèi)部做k折交叉驗(yàn)證避免單次劃分帶來(lái)的偶然性。我自己在樣本量不足300條時(shí)會(huì)用5折交叉驗(yàn)證樣本量超過(guò)1000條后直接驗(yàn)證集。4.3 POA主循環(huán)實(shí)現(xiàn)的兩個(gè)階段POA算法的Matlab實(shí)現(xiàn)并不復(fù)雜核心就是按照前面說(shuō)的兩個(gè)階段更新位置。我把關(guān)鍵部分寫(xiě)出來(lái)供參考function [bestPos, bestFitness, convCurve] POA(fitnessFunc, lb, ub, ...) N 20; T 15; dim length(lb); X repmat(lb, N, 1) rand(N, dim) .* repmat(ub - lb, N, 1); fit arrayfun((i) fitnessFunc(X(i,:)), 1:N); % 簡(jiǎn)寫(xiě)實(shí)際用循環(huán) [bestFitness, idx] min(fit); bestPos X(idx, :); for t 1:T % 階段一勘探向獵物俯沖 prey bestPos; % 當(dāng)前全局最優(yōu)作為獵物位置 I randi([1,2], N, 1); for i 1:N X_new X(i,:) rand(1,dim) .* (prey - I(i) * X(i,:)); X_new max(min(X_new, ub), lb); % 越界處理 % 計(jì)算適應(yīng)度并決定是否更新 end % 階段二開(kāi)發(fā)水面滑行收網(wǎng) for i 1:N ratio 0.2 * (1 - t / T); X_new X(i,:) ratio * (2 * rand(1,dim) - 1) .* X(i,:); X_new max(min(X_new, ub), lb); % 計(jì)算適應(yīng)度并決定是否更新 end convCurve(t) bestFitness; end end需要提醒兩點(diǎn)。第一越界處理不可省。C和gamma的搜索范圍跨度很大個(gè)體很容易飛出邊界直接截?cái)嗍亲顦闼匾沧钣行У淖龇?。第二第一階段里的prey默認(rèn)用當(dāng)前全局最優(yōu)這會(huì)讓所有個(gè)體快速向最優(yōu)靠攏可能導(dǎo)致早熟收斂。要緩解這個(gè)問(wèn)題可以在前30%的迭代里隨機(jī)選一個(gè)個(gè)體作為獵物后期再切換到全局最優(yōu)這樣能兼顧勘探和開(kāi)發(fā)。關(guān)于搜索空間的設(shè)置C和gamma的取值范圍通??缭蕉鄠€(gè)數(shù)量級(jí)比如C在[0.01, 100]、gamma在[0.001, 10]。但我更建議在算法內(nèi)部對(duì)這兩個(gè)參數(shù)做對(duì)數(shù)變換讓POA在log10空間里搜索得到結(jié)果后再反變換回真實(shí)值。這樣做的原因是SVR對(duì)C和gamma的敏感度是對(duì)數(shù)尺度的從0.01變成0.02帶來(lái)的影響和從10變成20是不同量級(jí)的如果在原始空間線性搜索小數(shù)值區(qū)域的探索精度會(huì)很差。4.4 fitrsvm與libsvm的調(diào)用差異MATLAB自帶的fitrsvm和libsvm工具箱在調(diào)用方式上有幾個(gè)顯著差異這里做一個(gè)對(duì)照表方便你做技術(shù)選型。維度f(wàn)itrsvmMATLAB自帶libsvmRBF核參數(shù)KernelScale與gamma換算關(guān)系為 gamma 1/(2*KernelScale^2)直接用gamma訓(xùn)練函數(shù)fitrsvm(X, Y, KernelFunction,rbf,BoxConstraint,C)svmtrain(Y, X, -s 3 -t 2 -c C -g gamma)預(yù)測(cè)函數(shù)predict(model, X)svmpredict(Y_test, X_test, model)輸入格式行樣本、列特征行樣本、列特征但標(biāo)簽是列向量是否需要編譯無(wú)需需要選擇編譯器并運(yùn)行make如果你只需要做基準(zhǔn)實(shí)驗(yàn)推薦直接用fitrsvm如果你發(fā)現(xiàn)fitrsvm訓(xùn)練速度慢大數(shù)據(jù)量場(chǎng)景很常見(jiàn)或者要跟其他論文的設(shè)定保持一致可以上libsvm。libsvm的安裝有一點(diǎn)門檻下載工具箱后要把路徑加入MATLAB運(yùn)行mex命令編譯期間可能遇到編譯器版本不匹配的問(wèn)題。我在MATLAB R2023a上曾遇到過(guò)MinGW編譯器配置問(wèn)題后來(lái)在Add-On Explorer里直接安裝“MATLAB Support for MinGW-w64 C/C Compiler”才解決。5. 實(shí)驗(yàn)設(shè)計(jì)與結(jié)果解讀怎么判斷模型真的有效5.1 評(píng)價(jià)指標(biāo)別只盯著一個(gè)RMSE模型訓(xùn)練完之后要用測(cè)試集做一個(gè)公平評(píng)估。時(shí)序預(yù)測(cè)最常用的指標(biāo)有四個(gè)均方根誤差RMSE、平均絕對(duì)誤差MAE、平均絕對(duì)百分比誤差MAPE和決定系數(shù)R2。RMSE對(duì)大誤差敏感適合衡量風(fēng)險(xiǎn)MAE對(duì)異常值魯棒MAPE有量綱無(wú)關(guān)的優(yōu)勢(shì)適合跨序列比較但當(dāng)真實(shí)值接近0時(shí)會(huì)爆炸R2反映模型對(duì)總方差的解釋程度。我的習(xí)慣是在實(shí)驗(yàn)報(bào)告中同時(shí)列出這四個(gè)指標(biāo)并額外畫(huà)出測(cè)試集的預(yù)測(cè)值與真實(shí)值對(duì)比曲線。只給一個(gè)RMSE的論文和報(bào)告往往掩蓋了預(yù)測(cè)結(jié)果是否存在相位滯后或系統(tǒng)性偏低的問(wèn)題。曲線圖一眼就能看出來(lái)這是很多審稿人和技術(shù)評(píng)審最關(guān)注的細(xì)節(jié)。5.2 對(duì)比基線怎么設(shè)置要讓POA-SVR這套方案有說(shuō)服力不能只用一組最優(yōu)參數(shù)跑出結(jié)果就說(shuō)它好。需要至少設(shè)置三個(gè)對(duì)比對(duì)象網(wǎng)格搜索SVR固定候選值集合找出網(wǎng)格內(nèi)最優(yōu)的C和gamma。這是最傳統(tǒng)的調(diào)參方法也是最重要的參照系。默認(rèn)參數(shù)SVR直接用fitrsvm的默認(rèn)設(shè)置不做任何參數(shù)優(yōu)化。這一組能告訴你“默認(rèn)到底行不行”。其他優(yōu)化算法PSO-SVR或遺傳算法SVR如果做論文可以補(bǔ)充一組用來(lái)證明POA在收斂速度和搜索質(zhì)量上優(yōu)于同類算法。實(shí)測(cè)對(duì)比時(shí)要注意控制變量三種方法使用完全相同的訓(xùn)練集、驗(yàn)證集、測(cè)試集適應(yīng)度函數(shù)也必須相同。我做這類對(duì)比時(shí)會(huì)把每次實(shí)驗(yàn)的隨機(jī)種子固定下來(lái)比如在POA入口調(diào)用rng(2024)否則因?yàn)殡S機(jī)性造成的結(jié)果波動(dòng)會(huì)掩蓋算法本身的真實(shí)差異。5.3 收斂曲線和預(yù)測(cè)曲線的讀法POA每次迭代都會(huì)記錄當(dāng)前全局最優(yōu)適應(yīng)度畫(huà)出一條收斂曲線。收斂曲線的價(jià)值在于判斷搜索過(guò)程是否健康如果曲線在5次迭代內(nèi)就陷入水平線說(shuō)明種群早熟需要調(diào)大種群數(shù)或增大勘探階段的比例如果曲線到第15次迭代還在明顯下降說(shuō)明迭代次數(shù)不夠應(yīng)該增大T或者模型還沒(méi)有進(jìn)入最終的精細(xì)搜索階段。我還見(jiàn)過(guò)一種情況收斂曲線持續(xù)下降但最終適應(yīng)度依然很高這通常意味著搜索空間設(shè)置不合理最優(yōu)參數(shù)可能落在邊界外需要擴(kuò)展邊界或者轉(zhuǎn)換對(duì)數(shù)坐標(biāo)。預(yù)測(cè)曲線則要重點(diǎn)觀察三件事。第一預(yù)測(cè)值是否比真實(shí)值滯后一步或幾步這在時(shí)序預(yù)測(cè)里叫相位滯后常見(jiàn)原因是模型過(guò)度依賴最近的歷史值、沒(méi)有學(xué)到趨勢(shì)信息可以考慮差分預(yù)處理或增加窗口長(zhǎng)度。第二峰值和谷值是否被低估SVR天然有向均值回歸的趨勢(shì)極端值預(yù)測(cè)偏保守是正?,F(xiàn)象但若偏差過(guò)大可能需要引入外部特征或誤差后處理。第三殘差是否存在明顯的周期性如果殘差里還帶著一個(gè)日周期或周周期說(shuō)明模型沒(méi)有充分提取周期性信息需要把時(shí)間特征如星期幾、小時(shí)數(shù)加入輸入。6. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄做這個(gè)項(xiàng)目最容易踩的坑我把它們按出現(xiàn)頻率排了個(gè)序整理成一張速查表?,F(xiàn)象可能原因解決思路收斂曲線下降很慢或震蕩種群多樣性不夠或搜索邊界太寬增大N到30以上或縮小邊界范圍測(cè)試集指標(biāo)遠(yuǎn)差于驗(yàn)證集歸一化時(shí)使用了全量數(shù)據(jù)統(tǒng)計(jì)量或數(shù)據(jù)劃分有泄漏檢查mapminmax調(diào)用順序嚴(yán)格按訓(xùn)練集參數(shù)映射驗(yàn)證/測(cè)試集預(yù)測(cè)結(jié)果呈鋸齒狀窗口長(zhǎng)度p過(guò)小增大p或?qū)υ夹蛄凶銎交A(yù)測(cè)值整體滯后模型沒(méi)學(xué)到趨勢(shì)窗口信息權(quán)重偏向近期對(duì)序列做一階差分后再預(yù)測(cè)或加入趨勢(shì)特征C和gamma收斂到邊界上搜索范圍設(shè)置不合理可能是按照別人的論文照搬了邊界擴(kuò)大邊界到10倍范圍或改用對(duì)數(shù)坐標(biāo)搜索fitrsvm訓(xùn)練時(shí)間過(guò)長(zhǎng)樣本量大或訓(xùn)練參數(shù)Standardize不匹配改用libsvm或在保持精度前提下挑選代表性樣本還有一個(gè)我多次踩過(guò)的坑在適應(yīng)度函數(shù)里做5折交叉驗(yàn)證時(shí)每次fold的訓(xùn)練和驗(yàn)證都調(diào)用mapminmax重新歸一化。這個(gè)操作本身沒(méi)錯(cuò)但如果歸一化代碼寫(xiě)在循環(huán)外面就會(huì)讓所有fold共用同一組訓(xùn)練統(tǒng)計(jì)量結(jié)果看起來(lái)不錯(cuò)但實(shí)際是輕微泄漏。正確的寫(xiě)法是把歸一化塞進(jìn)循環(huán)內(nèi)部每個(gè)fold都用該fold的訓(xùn)練子集重新計(jì)算歸一化參數(shù)。再補(bǔ)充一個(gè)設(shè)備預(yù)測(cè)場(chǎng)景里很實(shí)用的技巧如果目標(biāo)是做在線預(yù)測(cè)建議固定住測(cè)試集用滾動(dòng)時(shí)間窗的方式反復(fù)執(zhí)行“訓(xùn)練→優(yōu)化→預(yù)測(cè)”的流程。也就是說(shuō)模型不是訓(xùn)練一次用一輩子而是每隔一段時(shí)間就用最新數(shù)據(jù)重新執(zhí)行一次POA搜索。實(shí)測(cè)下來(lái)滾動(dòng)更新模型比靜態(tài)模型在長(zhǎng)周期數(shù)據(jù)上的表現(xiàn)穩(wěn)定得多因?yàn)镃和gamma的最優(yōu)值會(huì)隨著數(shù)據(jù)分布漂移而改變。7. 我個(gè)人在做這個(gè)項(xiàng)目時(shí)的一些體會(huì)最后說(shuō)說(shuō)我自己做完這套東西后的感受。POA-SVM這套組合看起來(lái)像“套殼創(chuàng)新”但真正把它跑通之后你會(huì)對(duì)兩件事有更深的理解一是所謂優(yōu)化算法的作用邊界它不能解決模型本身不適配的問(wèn)題只能幫你找到當(dāng)前模型的最佳狀態(tài)二是SVM在時(shí)序預(yù)測(cè)里的軟肋它本質(zhì)上是一個(gè)靜態(tài)回歸器對(duì)趨勢(shì)和周期性的建模能力是有限的數(shù)據(jù)預(yù)處理和特征工程的重要性甚至超過(guò)優(yōu)化算法本身。如果要在后續(xù)繼續(xù)擴(kuò)展這個(gè)項(xiàng)目我會(huì)優(yōu)先考慮兩個(gè)方向。第一是把POA搜索的維度從兩個(gè)擴(kuò)展到三個(gè)加入epsilon參數(shù)或者把多個(gè)滑動(dòng)窗口的p值也納入搜索范圍變成一個(gè)真正的超參數(shù)自動(dòng)搜索框架。第二是把適應(yīng)度函數(shù)改造成多目標(biāo)形式比如同時(shí)優(yōu)化RMSE和預(yù)測(cè)值的最大偏差用MOEA思想去權(quán)衡精度與穩(wěn)定性這類改造在工業(yè)場(chǎng)景中更有吸引力。再分享一個(gè)非常實(shí)用的小技巧POA跑出的最優(yōu)參數(shù)組合不要直接當(dāng)成最終答案把它作為fitrsvm或libsvm調(diào)參的起點(diǎn)在最優(yōu)值附近再做一個(gè)局部網(wǎng)格搜索步長(zhǎng)取最優(yōu)參數(shù)的10%左右往往還能再提升一點(diǎn)精度。算法給出的“最優(yōu)”仍然是啟發(fā)式搜索的近似結(jié)果局部精修一下代價(jià)不高但收益明顯??傊@套方案不一定是最前沿的但它是扎實(shí)、可復(fù)現(xiàn)、容易被理解的。如果你正在做類似的時(shí)序預(yù)測(cè)任務(wù)不妨照著上面的流程搭一版跑一跑遇到問(wèn)題回來(lái)對(duì)照排查表找原因。