測與超參數(shù)自動優(yōu)化實(shí)戰(zhàn))
多輸出回歸預(yù)測一直是個說簡單不簡單、說難又繞不開的活。單輸出模型做得再漂亮一到“一個輸入同時出好幾個結(jié)果”的場景各種坑就冒出來了維度之間互相牽制、誤差層層傳遞、超參數(shù)調(diào)了十幾個版本還是不穩(wěn)定。最近我把北方蒼鷹優(yōu)化算法和最小二乘支持向量機(jī)搭在一起專門用來做多輸出回歸實(shí)測收斂速度和預(yù)測精度都比以前用網(wǎng)格搜索加手工調(diào)參強(qiáng)了一大截。這篇文章把整套思路拆開講透從算法選型到完整實(shí)現(xiàn)再到踩坑記錄希望能給正在折騰回歸預(yù)測的朋友省掉幾周摸索時間。這個組合聽起來有點(diǎn)“縫合怪”但實(shí)際上邏輯很順用最小二乘支持向量機(jī)兜底做回歸把原來的不等式約束換成等式約束模型求解速度快了不少再借助北方蒼鷹優(yōu)化算法去自動搜索LSSVM里的正則化參數(shù)和核參數(shù)省去人工試參的苦力活。適合的人群很明確——做數(shù)據(jù)分析、機(jī)械壽命預(yù)測、能源負(fù)荷預(yù)測、電力系統(tǒng)短期負(fù)荷預(yù)測這類多輸出任務(wù)的工程師以及正好寫論文需要一套完整對比實(shí)驗(yàn)的研究生。文章內(nèi)容以實(shí)操為主不堆理論推導(dǎo)盡量把每一步為什么這么干講明白。1. 多輸出回歸預(yù)測到底難在哪1.1 工程場景里“多輸出”三個字的真實(shí)含義多輸出回歸說白了就是輸入一組特征變量模型要同時給出多個結(jié)果變量。比如某個工業(yè)設(shè)備的監(jiān)測數(shù)據(jù)輸入溫度、壓力、振動信號輸出同一時刻的幾個劣化指標(biāo)又比如電力負(fù)荷預(yù)測輸入天氣、日期、歷史負(fù)荷數(shù)據(jù)輸出未來幾個時間點(diǎn)的負(fù)荷值。常規(guī)做法是建多個“單輸出預(yù)測模型”每個輸出一個模型看起來簡單直接但實(shí)際運(yùn)行中問題也不少。我在一個設(shè)備退化預(yù)測項(xiàng)目里吃過苦頭。設(shè)備有五個關(guān)鍵健康指標(biāo)需要同時預(yù)測單輸出模型堆了五個支持向量機(jī)每個單獨(dú)看誤差都不大但五個指標(biāo)之間的關(guān)聯(lián)關(guān)系被硬生生切斷了?,F(xiàn)場反饋說“某個指標(biāo)的預(yù)測結(jié)果跟另一個指標(biāo)的實(shí)測結(jié)果根本對不上”說白了就是模型之間缺乏協(xié)同最后只能整套重構(gòu)。所以做多輸出預(yù)測不能簡單理解成“多個單輸出任務(wù)的疊加”要考慮輸出之間的耦合性。另外一個容易忽視的問題是多輸出帶來的誤差累積。如果每個單輸出模型都有3%左右的誤差那么多個維度疊加之后后續(xù)應(yīng)用方拿著這組預(yù)測結(jié)果繼續(xù)計算誤差就會被放大好幾倍。特別是做設(shè)備剩余壽命、綜合健康狀態(tài)這類需要多個指標(biāo)參與運(yùn)算的場景輸出維度之間的誤差傳播會讓最終結(jié)論變得不可靠。1.2 傳統(tǒng)回歸模型在多輸出場景下的局限支持向量機(jī)本身是非常成熟的回歸工具核心思想是把輸入映射到高維空間然后找一個超平面讓樣本點(diǎn)盡可能落在超平面附近。傳統(tǒng)支持向量回歸要求解一個帶約束的二次規(guī)劃問題數(shù)據(jù)量一大求解速度就很難看。工程上做多輸出時通常會堆疊十幾個這樣的模型訓(xùn)練時間直接起飛。最小二乘支持向量機(jī)對這個問題做了一個很巧妙的簡化把原來支持向量機(jī)里的不等式約束改成等式約束同時把損失函數(shù)里的誤差項(xiàng)改成平方項(xiàng)。這樣一來求解過程就從二次規(guī)劃問題變成了解一個線性方程組。通俗地講原來需要重復(fù)迭代慢慢逼近最優(yōu)解現(xiàn)在一步到位直接求矩陣逆速度提升非常明顯。這在多輸出場景下尤其重要因?yàn)槟憧赡芤?xùn)練多個模型或者在一個大的目標(biāo)函數(shù)里反復(fù)評估多個輸出維度不能忍受單個模型求解太慢。但是LSSVM也不是白拿這個好處代價是模型精度對超參數(shù)非常敏感。兩個核心超參數(shù)——正則化參數(shù)γ和核函數(shù)參數(shù)σ——一旦設(shè)置不恰當(dāng)預(yù)測結(jié)果就會大幅波動。γ控制模型對經(jīng)驗(yàn)誤差的懲罰力度σ控制核函數(shù)的寬度或者說影響范圍。這兩個參數(shù)之間還有耦合效應(yīng)一個變了另一個的合適范圍也變了??拷?jīng)驗(yàn)、網(wǎng)格搜索、隨機(jī)搜索去試在單輸出問題上勉強(qiáng)能用在多輸出問題里就有點(diǎn)力不從心了——因?yàn)槎鄠€輸出模型可能是共享超參數(shù)也可能是各自獨(dú)立超參數(shù)參數(shù)空間一下子膨脹手工調(diào)參基本不現(xiàn)實(shí)。2. 為什么偏偏選北方蒼鷹優(yōu)化算法加LSSVM2.1 LSSVM的數(shù)學(xué)表達(dá)和參數(shù)含義先讓不太熟悉LSSVM的朋友有個基礎(chǔ)概念。給定訓(xùn)練樣本集 {(x_i, y_i), i1,2,...,n}LSSVM的優(yōu)化目標(biāo)可以寫成min J(w,e) (1/2)w^T w (γ/2)Σ_{i1}^{n} e_i^2約束條件是y_i w^T φ(x_i) b e_i, i1,2,...,n這里的 φ(x_i) 是把原始特征映射到高維空間的非線性映射w是權(quán)重向量b是偏置項(xiàng)e_i 是每個樣本的擬合誤差。γ就是正則化參數(shù)它在“模型復(fù)雜度”和“訓(xùn)練誤差大小”之間取平衡。γ太大模型會過度擬合訓(xùn)練數(shù)據(jù)γ太小模型擬合能力不夠陷入欠擬合。核函數(shù)選擇上工程里最常用的是高斯徑向基核K(x_i, x_j) exp(-||x_i - x_j||2 / (2σ2))這個σ就是核寬參數(shù)。σ太小模型容易過擬合決策邊界附近的變化過于敏感σ太大模型又太“遲鈍”整體預(yù)測偏平滑連必要的拐點(diǎn)都抓不住。實(shí)際操作中γ和σ的量級可能差好幾百倍而且每個數(shù)據(jù)集的最優(yōu)取值都不一樣所以不做自動優(yōu)化根本不行。2.2 北方蒼鷹優(yōu)化算法的核心機(jī)制北方蒼鷹優(yōu)化算法是Dehghani等人2022年提出來的一種元啟發(fā)式優(yōu)化算法模擬的是蒼鷹捕獵過程的兩個階段。第一階段叫“獵物識別與攻擊”對應(yīng)勘探階段第二階段叫“追逐與逃逸”對應(yīng)開發(fā)階段。這個算法的優(yōu)點(diǎn)在于結(jié)構(gòu)簡單、需要用戶指定的參數(shù)少主要就是種群規(guī)模和最大迭代次數(shù)不像某些智能算法那樣還有一堆額外的經(jīng)驗(yàn)常數(shù)要調(diào)。從我個人使用幾類常見優(yōu)化算法的體驗(yàn)來看粒子群算法需要調(diào)慣性權(quán)重和學(xué)習(xí)因子遺傳算法要考慮交叉概率、變異概率和編碼方式操作起來繁瑣不說還容易陷入局部最優(yōu)。北方蒼鷹優(yōu)化算法在這方面的優(yōu)勢恰恰是“參數(shù)少、流程清晰”。第一階段的獵物位置是隨機(jī)選擇的意味著蒼鷹會在整個搜索空間內(nèi)探索第二階段的追逃行為則在已發(fā)現(xiàn)的優(yōu)良區(qū)域附近精細(xì)搜索兩者配合起來勘探和開發(fā)兼顧。不過必須提醒一點(diǎn)單看理論性能沒有哪個智能算法能對所有數(shù)據(jù)集都保持絕對優(yōu)勢。NO FREE LUNCH定理在數(shù)學(xué)上早就說明白了不存在一個算法能在所有優(yōu)化問題上都做到最好。我選北方蒼鷹優(yōu)化算法更多是看在它參數(shù)少、實(shí)現(xiàn)成本低、穩(wěn)定性相對不錯而且和LSSVM超參數(shù)優(yōu)化這個過程很契合。2.3 組合邏輯鏈條為何要“聯(lián)合調(diào)參”如果只有一個輸出那你用北方蒼鷹優(yōu)化算法搜兩個參數(shù)——γ和σ就可以了。但在多輸出情境下事情復(fù)雜得多。多輸出模型的兩種常見做法第一種是“每個輸出獨(dú)立建?!币簿褪怯蠱個輸出就訓(xùn)練M個LSSVM模型每個模型都有自己的一套γ和σ那優(yōu)化空間就是2M維。第二種是“共享超參數(shù)的多輸出LSSVM”所有輸出共用一套γ和σ但每個輸出對應(yīng)的模型權(quán)重、偏差項(xiàng)獨(dú)立求解這種方案參數(shù)少但泛化能力在不同輸出維度上可能不均衡。我做項(xiàng)目時通常采用“共享γ獨(dú)立訓(xùn)練參數(shù)”的策略同時把多輸出回歸預(yù)測的平均誤差作為綜合適應(yīng)度。這樣既控制了參數(shù)數(shù)量又能讓多個輸出在同一個優(yōu)化框架下協(xié)調(diào)。具體地說北方蒼鷹優(yōu)化算法的每個個體都代表一組候選超參數(shù)γ, σ算法迭代時用這組超參數(shù)訓(xùn)練所有輸出維度的LSSVM模型然后計算所有輸出維度的平均均方根誤差作為該個體的適應(yīng)度值最后優(yōu)化目標(biāo)是讓這個平均均方根誤差降到最低。這里有個值得注意的細(xì)節(jié)如果用“獨(dú)立建?!钡乃悸纺浅甩煤挺疫€涉及每個輸出維度各自的懲罰系數(shù)這會導(dǎo)致參數(shù)空間暴漲。北方蒼鷹優(yōu)化算法搜索高維參數(shù)空間雖然可行但需要的迭代次數(shù)明顯增加。如果數(shù)據(jù)集本身不大或者輸出維度在十個以內(nèi)我更建議走共享參數(shù)路線把精力花在特征工程和核函數(shù)選擇上。3. 模型架構(gòu)與核心細(xì)節(jié)拆解3.1 多輸出LSSVM的工程實(shí)現(xiàn)方式在多輸出LSSVM的實(shí)現(xiàn)上市面上現(xiàn)成工具包比較少很多朋友在網(wǎng)上搜“multi-output LSSVM”發(fā)現(xiàn)找不到對應(yīng)的庫就直接放棄了。實(shí)際上工程實(shí)現(xiàn)完全可以基于單輸出LSSVM的代碼改造。我常用的做法是把每個輸出維度當(dāng)作獨(dú)立的LSSVM模型來訓(xùn)練但在優(yōu)化階段用一個統(tǒng)一的目標(biāo)函數(shù)。模型結(jié)構(gòu)大致是輸入層m維特征向量隱式特征映射通過RBF核函數(shù)完成輸出層并列的M個LSSVM回歸器每個都有獨(dú)立的拉格朗日乘子和偏置假設(shè)輸出維度是M訓(xùn)練樣本數(shù)量是n。對第j個輸出維度需要求解一個(n1)維的線性方程組。如果M個輸出全部獨(dú)立求解相當(dāng)于要做M次矩陣求逆運(yùn)算耗時是單輸出的M倍。這在數(shù)據(jù)集不大時沒問題但如果n到了幾千甚至上萬M又比較大速度就會成為新的瓶頸。一個優(yōu)化技巧是如果所有輸出維度共享同一個核矩陣Ω則可以把M個方程組拼接在一起一次性求解多個右端項(xiàng)。核矩陣只算一次矩陣分解清零一次多個輸出維度共享分解結(jié)果這樣效率非常高。具體做法是對核矩陣加對角擾動后進(jìn)行LU分解然后將分解后的矩陣同時回代到M個右側(cè)列向量。這個操作在MATLAB里用左除符號可以直接完成在Python里可以用numpy的linalg.solve配合二維右手矩陣完成。3.2 適應(yīng)度函數(shù)怎么設(shè)計才合理多輸出回歸的適應(yīng)度函數(shù)設(shè)計直接決定了優(yōu)化算法的導(dǎo)向。最簡單的做法是取每個輸出維度均方根誤差的平均值fitness (1/M) * Σ_{j1}^{M} RMSE_j但這樣做有一個潛在問題如果某個輸出維度的數(shù)值范圍天生就比其他維度大很多那它的RMSE也會“霸占”適應(yīng)度函數(shù)的主導(dǎo)地位其他維度就算預(yù)測很差對適應(yīng)度的貢獻(xiàn)也被稀釋了。實(shí)際操作中最好先做歸一化或者用每個維度歸一化后的RMSE來計算適應(yīng)度。更穩(wěn)健的評估指標(biāo)是平均絕對百分比誤差MAPE或決定系數(shù)R2的組合形式。我的習(xí)慣是在優(yōu)化階段使用歸一化RMSE作為適應(yīng)度因?yàn)樗奶荻忍匦员容^平緩元啟發(fā)式優(yōu)化算法在這種目標(biāo)上更容易收斂在最終評估階段則給出RMSE、MAE、R2、MAPE的完整表格方便多角度對比。優(yōu)化目標(biāo)和評估指標(biāo)不完全一致沒關(guān)系關(guān)鍵是要保證優(yōu)化過程中的適應(yīng)度函數(shù)能穩(wěn)定反映模型的整體預(yù)測水平。另外有個小技巧每一輪迭代新種群中的每個個體都需要重新訓(xùn)練LSSVM并預(yù)測。如果訓(xùn)練集很大這會非常耗時。我一般會在優(yōu)化過程中預(yù)留一個驗(yàn)證集用驗(yàn)證集上的誤差來做適應(yīng)度評估而不是把全部訓(xùn)練集都用來訓(xùn)練。這樣能降低一點(diǎn)過擬合風(fēng)險也能省一部分計算量。3.3 數(shù)據(jù)預(yù)處理與驗(yàn)證方式的選擇多輸出回歸模型對數(shù)據(jù)尺度非常敏感。所有特征維度無論原始數(shù)值范圍如何在進(jìn)入LSSVM之前都建議做標(biāo)準(zhǔn)化處理。RBF核里的歐氏距離計算對尺度極敏感如果某個特征范圍是0到10000其他特征是0到1那距離計算基本被前者主導(dǎo)模型相當(dāng)于忽略掉那些小尺度特征。常用的處理方式有兩種Z-score標(biāo)準(zhǔn)化和Min-Max歸一化。Z-score標(biāo)準(zhǔn)化公式是x (x - μ) / σMin-Max歸一化公式是x (x - min) / (max - min)LSSVM的RBF核函數(shù)本質(zhì)上基于距離Z-score更適合大多數(shù)場景。但要注意輸出維度一定要和輸入維度統(tǒng)一預(yù)處理策略或者至少保證輸出預(yù)測出來之后能還原到原始量綱否則最后評估階段拿到的RMSE數(shù)值根本沒法解釋。驗(yàn)證方式方面我用得最多的是K折交叉驗(yàn)證K取5或10。如果樣本量太小只有幾百條那就用留一法雖然慢但評估更可靠。多輸出場景下交叉驗(yàn)證還需要注意一點(diǎn)切分?jǐn)?shù)據(jù)時不能把同一個樣本的不同輸出切到不同的折里也就是說切分要基于樣本ID整體切分不能按特征列切。這個錯誤新手很容易犯切完之后每個折里數(shù)據(jù)分布不均勻驗(yàn)證結(jié)果完全失真。我曾經(jīng)在一個項(xiàng)目里就是用錯了切分方式導(dǎo)致交叉驗(yàn)證誤差看起來很小但一到實(shí)際測試集上誤差翻倍。后來排查半天才發(fā)現(xiàn)問題出在數(shù)據(jù)切分環(huán)節(jié)。所以多輸出任務(wù)的數(shù)據(jù)預(yù)處理一定要仔細(xì)檢查每個折里是否包含了完整的樣本并且輸出維度保持對齊。4. 完整實(shí)現(xiàn)過程從零手寫NGO-LSSVM4.1 環(huán)境準(zhǔn)備與工具箱選擇我平時用的環(huán)境是Python 3.9加scikit-learn、numpy、scipy。LSSVM沒有直接封裝在scikit-learn里面但有LSSVM庫可以裝或者可以自己寫一個簡潔版本。我個人傾向于用MATLAB的LS-SVMlab工具箱做論文對比實(shí)驗(yàn)時挺方便如果是部署到生產(chǎn)環(huán)境就自己在Python里實(shí)現(xiàn)一個類LSSVM回歸器也就幾十行代碼。在Python里自己實(shí)現(xiàn)LSSVM回歸器核心步驟就是構(gòu)建核矩陣、加對角擾動、求解線性方程組。用numpy來實(shí)現(xiàn)非常直接首先計算訓(xùn)練集樣本之間的RBF核矩陣然后組裝成擴(kuò)展矩陣最后求解線性方程組。scipy的linalg.solve會做LU分解求解速度快還能處理多右端項(xiàng)。4.2 NGO-LSSVM偽代碼與參數(shù)表整個NGO-LSSVM多輸出預(yù)測流程我按模塊來拆。第一步數(shù)據(jù)準(zhǔn)備加載數(shù)據(jù)集特征矩陣X為(n_samples, n_features)輸出矩陣Y為(n_samples, n_outputs)。對特征和輸出分別做標(biāo)準(zhǔn)化。按7:3或者6:2:2劃分訓(xùn)練集、驗(yàn)證集、測試集。第二步初始化NGO參數(shù)種群規(guī)模N通常取20到50。最大迭代次數(shù)T通常取100到500。搜索維度Dim采用共享超參數(shù)策略時Dim2代表γ和σ采用獨(dú)立超參數(shù)策略時Dim2M。搜索邊界γ一般設(shè)置在[0.01, 1000]σ設(shè)置在[0.01, 100]具體范圍根據(jù)數(shù)據(jù)噪聲情況調(diào)整。第三步種群初始化 在搜索空間內(nèi)隨機(jī)生成N個個體每個個體的位置向量是[x1, x2]分別對應(yīng)γ和σ的自然對數(shù)值或者原始值。注意直接用原始值會讓搜索空間尺度差異過大所以一般對γ和σ取對數(shù)即將搜索變量定義為lg(γ)和lg(σ)在優(yōu)化結(jié)束后再還原。第四步NGO迭代 每輪迭代中對每個個體執(zhí)行兩個階段的位置更新。第一階段位置更新公式x_new x_old r * (prey - I * x_old)其中r是[0,1]之間的隨機(jī)數(shù)prey是隨機(jī)挑選的當(dāng)前種群中的一個個體位置獵物I隨機(jī)取1或2。如果x_new對應(yīng)的適應(yīng)度更優(yōu)則接受替換。第二階段位置更新公式R 0.02 * (1 - t / T) x_new x_old R * (2*r - 1) * x_old其中t是當(dāng)前迭代次數(shù)T是總迭代次數(shù)。x_new的適應(yīng)度更優(yōu)則接受替換。第五步適應(yīng)度評估 對每個個體位置解碼得到γ和σ使用當(dāng)前訓(xùn)練集訓(xùn)練LSSVM模型在驗(yàn)證集上計算所有輸出維度的平均歸一化RMSE作為適應(yīng)度。第六步輸出結(jié)果 迭代結(jié)束后記錄歷史最優(yōu)個體用該個體的γ和σ在訓(xùn)練集上重新訓(xùn)練LSSVM在測試集上評估輸出各輸出維度的RMSE、MAE、R2、MAPE等指標(biāo)。4.3 關(guān)鍵代碼片段示例下面的代碼展示了構(gòu)建多輸出LSSVM核心求解部分以Python為例。這里為了可讀性省略了索引細(xì)節(jié)和邊界檢查實(shí)際工程需要補(bǔ)齊。import numpy as np from scipy.linalg import solve def rbf_kernel_matrix(X1, X2, sigma): # 計算X1與X2之間的RBF核矩陣 # X1: (n1, d), X2: (n2, d) sq_dists ( np.sum(X1**2, axis1)[:, None] np.sum(X2**2, axis1)[None, :] - 2.0 * np.dot(X1, X2.T) ) sq_dists np.maximum(sq_dists, 0) return np.exp(-sq_dists / (2.0 * sigma**2)) def train_multi_lssvm(X_train, Y_train, gamma, sigma): n X_train.shape[0] m Y_train.shape[1] Omega rbf_kernel_matrix(X_train, X_train, sigma) A np.zeros((n1, n1)) A[0, 0] 0.0 A[0, 1:] 1.0 A[1:, 0] 1.0 A[1:, 1:] Omega np.eye(n) / gamma # Y_train是(n, m)矩陣右側(cè)向量b是(m, n1)轉(zhuǎn)置形式 rhs np.zeros((n1, m)) rhs[0, :] np.mean(Y_train, axis0) rhs[1:, :] Y_train solution solve(A, rhs) b solution[0, :] # 長度為m alpha solution[1:, :] # shape (n, m) return alpha, b def predict_multi_lssvm(X_train, Y_train, alpha, b, X_test, gamma, sigma): K_test rbf_kernel_matrix(X_test, X_train, sigma) # K_test shape: (n_test, n) Y_pred np.dot(K_test, alpha) b.reshape(1, -1) return Y_pred這個實(shí)現(xiàn)里有個細(xì)節(jié)值得展開說明我一次性求解了多個輸出維度的方程組而不是循環(huán)M次。這樣能大幅降低重復(fù)計算的核矩陣開銷而且數(shù)值穩(wěn)定性更好。如果你仔細(xì)看代碼會發(fā)現(xiàn)A矩陣其實(shí)是先把核矩陣加上對角線懲罰項(xiàng)再在兩側(cè)補(bǔ)上一列1和一行1。這是LSSVM求解中比較標(biāo)準(zhǔn)的擴(kuò)展矩陣形式為什么要加這一圈“1”呢因?yàn)樽詈笠瑫r解出偏置項(xiàng)b和拉格朗日乘子α而這個約束關(guān)系會被自然編碼到線性方程組里。4.4 參數(shù)設(shè)置與評估指標(biāo)速查下面給出我實(shí)際使用比較順手的一組參數(shù)范圍不同數(shù)據(jù)集可以在這個基礎(chǔ)上微調(diào)參數(shù)推薦范圍說明種群規(guī)模N20~50太小容易早熟太大迭代開銷高最大迭代T100~500復(fù)雜度高的問題取上限γ搜索范圍[0.01, 1000]建議取對數(shù)編碼σ搜索范圍[0.01, 100]建議取對數(shù)編碼優(yōu)化變量個數(shù)2共享超參數(shù)或2M獨(dú)立超參數(shù)M為輸出維度交叉驗(yàn)證折數(shù)5或10樣本少時用留一法適應(yīng)度函數(shù)歸一化RMSE的平均值防止大數(shù)值輸出維度主導(dǎo)評估指標(biāo)方面我建議至少輸出四個指標(biāo)。RMSE對較大誤差懲罰更重適合用來判斷模型是否存在嚴(yán)重偏離MAE更直觀和原始量綱統(tǒng)一R2反映模型的解釋能力越接近1越好MAPE則對量綱歸一化友好適合跨數(shù)據(jù)集對比。下面是這幾個指標(biāo)的計算公式RMSE sqrt((1/n) * Σ(y_i - ?_i)2)MAE (1/n) * Σ|y_i - ?_i|R2 1 - Σ(y_i - ?_i)2 / Σ(y_i - ?)2MAPE (100/n) * Σ|(y_i - ?_i) / y_i|多輸出場景下每個輸出維度都要單獨(dú)列出上述指標(biāo)同時給出M個維度的平均值。平均R2不是簡單地算算術(shù)平均建議按各維度樣本方差加權(quán)平均這樣更公平。5. 實(shí)操中的問題與排查實(shí)錄5.1 優(yōu)化不收斂或收斂到很差的結(jié)果NGO迭代幾百輪之后如果平均RMSE一直不下降先別急著換算法大概率是參數(shù)搜索范圍設(shè)置出了問題。我之前把σ搜索范圍定成[0.001, 1000]看起來覆蓋很廣但實(shí)際上RBF核在σ很大時幾乎變成線性核在σ很小時又過擬合搜索空間中大部分區(qū)域都是“壞區(qū)”算法很難找到好位置。后來改成對σ取對數(shù)編碼搜索范圍壓縮到[-2, 2]相當(dāng)于σ從0.01到100收斂速度立刻改善。另一個常見原因是種群規(guī)模太小。有些數(shù)據(jù)集的目標(biāo)函數(shù)非常崎嶇種群只有10個個體的時候NGO第一階段隨機(jī)挑選獵物探索能力不夠大概率困在局部極值。把種群規(guī)模提高到30以上并在初始化時使用拉丁超立方采樣而不是完全隨機(jī)均勻優(yōu)化效果會更穩(wěn)定。5.2 預(yù)測結(jié)果整體偏移模型預(yù)測值與真實(shí)值趨勢一致但整體偏高或者偏低這通常是輸出標(biāo)準(zhǔn)化環(huán)節(jié)出了問題。很多人在訓(xùn)練時對輸出Y做了Z-score標(biāo)準(zhǔn)化但預(yù)測完成后忘記還原到原始量綱或者還原時用了錯誤的標(biāo)準(zhǔn)差。另一個更隱蔽的問題是多輸出維度各自標(biāo)準(zhǔn)化時如果某個輸出維度的訓(xùn)練集和測試集分布不一致比如測試集出現(xiàn)了訓(xùn)練集中不存在的更大數(shù)值還原后的預(yù)測結(jié)果就會系統(tǒng)性偏移。解決辦法是在數(shù)據(jù)劃分時就固定好標(biāo)準(zhǔn)化器的參數(shù)。具體做法是先用訓(xùn)練集擬合Z-score的均值和標(biāo)準(zhǔn)差然后把這個均值和標(biāo)準(zhǔn)差直接套到驗(yàn)證集和測試集上全程不能重新計算。這種事聽起來簡單但實(shí)際項(xiàng)目里因?yàn)榇a復(fù)用導(dǎo)致標(biāo)準(zhǔn)化器參數(shù)漂移的例子我一抓一個準(zhǔn)。5.3 多個輸出維度預(yù)測效果嚴(yán)重不均衡有時候輸出維度之間相關(guān)性極強(qiáng)比如輸出1預(yù)測得非常好R2到了0.95輸出2卻很糟糕R2只有0.3。這種情況經(jīng)常是因?yàn)檩敵?本身受一些未采集到的隱含變量影響模型信息量不夠。遇到這種問題先不要急著調(diào)NGO參數(shù)而是檢查特征工程和相關(guān)性分析。我建議在做模型之前先畫一下特征與每個輸出之間的相關(guān)性熱力圖。如果發(fā)現(xiàn)某個輸出和所有特征的相關(guān)系數(shù)都很低說明這個輸出可能不太適合用當(dāng)前特征集去預(yù)測。兩個選擇一是給該輸出增加額外特征二是將該輸出的權(quán)重在適應(yīng)度函數(shù)中調(diào)低避免它拖累其他輸出維度的優(yōu)化。但要注意調(diào)低某個輸出的權(quán)重要慎重如果下游業(yè)務(wù)對這個輸出的預(yù)測精度有硬性要求反而應(yīng)該提高它的權(quán)重讓優(yōu)化算法優(yōu)先保證這個關(guān)鍵輸出。5.4 訓(xùn)練時間太長迭代跑不動做多輸出LSSVM優(yōu)化時最大的計算瓶頸在于每次適應(yīng)度評估都要重新訓(xùn)練M個LSSVM模型。即使每個模型求解只要幾十毫秒乘以種群規(guī)模30、迭代次數(shù)300再乘以交叉驗(yàn)證折數(shù)5總耗時相當(dāng)可觀。我實(shí)際測過一個5000樣本、10個輸出的數(shù)據(jù)集單次完整優(yōu)化跑了將近4小時。這在研究階段還能接受部署階段完全不行。三個緩解思路第一先用較小的數(shù)據(jù)集做參數(shù)范圍探索定好大概位置后再用全量數(shù)據(jù)跑最終優(yōu)化第二在迭代前期用較大容差和較少樣本做快速評估后期再用全量數(shù)據(jù)精細(xì)調(diào)優(yōu)第三把適應(yīng)度評估從驗(yàn)證集改成訓(xùn)練集的一部分比如每次隨機(jī)抽80%的樣本訓(xùn)練這樣每輪迭代快一些也帶一點(diǎn)隨機(jī)性有助于跳出局部極值。最后再加一個技巧NGO迭代后期將種群中適應(yīng)度排名靠后的一半個體淘汰重新在最優(yōu)個體附近用高斯擾動生成新個體這樣相當(dāng)于局部的精細(xì)搜索能提高最終精度。6. 從論文方法到工程落地的幾點(diǎn)經(jīng)驗(yàn)6.1 模型好不好先看點(diǎn)線圖算法對比不能只看論文表格里那幾個最終RMSE數(shù)字。我在實(shí)際項(xiàng)目中養(yǎng)成一個習(xí)慣每次優(yōu)化完成后一定把三個輸出維度的真實(shí)值和預(yù)測值曲線放在同一張圖上單獨(dú)觀察波峰波谷處的擬合效果。很多模型在平均值上看著不錯但一到局部極值區(qū)域就完全跟不上。多輸出回歸尤其要看每個輸出的曲線形態(tài)因?yàn)楣I(yè)現(xiàn)場關(guān)心的是趨勢拐點(diǎn)而不是總體誤差均值。這個習(xí)慣幫我躲過了一次“假成功”的經(jīng)歷。有個項(xiàng)目當(dāng)時按平均RMSE選出了最優(yōu)超參數(shù)看起來全局誤差下降了20%但畫了曲線之后發(fā)現(xiàn)一個關(guān)鍵健康指標(biāo)的峰值預(yù)測全部偏低業(yè)務(wù)方拿去使用后直接誤判了一次故障預(yù)警。后來在適應(yīng)度函數(shù)里加入了對峰值的懲罰項(xiàng)損耗函數(shù)從純RMSE改成了RMSE與峰值誤差的加權(quán)組合才把這個問題解決。6.2 怎么擴(kuò)展其他智能優(yōu)化算法做對比實(shí)驗(yàn)如果是要發(fā)論文或者做技術(shù)匯報通常需要和粒子群優(yōu)化、遺傳算法、灰狼優(yōu)化等做對比實(shí)驗(yàn)。我的建議是不要為了對比而對比而是看你的數(shù)據(jù)集特點(diǎn)。NGO的優(yōu)勢在于參數(shù)少、開發(fā)能力強(qiáng)粒子群優(yōu)化優(yōu)勢在于實(shí)現(xiàn)簡單、收斂快但容易陷入局部最優(yōu)遺傳算法優(yōu)勢在于全局搜索能力強(qiáng)但參數(shù)多、調(diào)參成本高。對比實(shí)驗(yàn)至少跑十次獨(dú)立重復(fù)記錄均值和標(biāo)準(zhǔn)差再做Wilcoxon符號秩檢驗(yàn)或Friedman檢驗(yàn)證明算法間的差異是統(tǒng)計顯著的而不是隨機(jī)波動。對比時最好固定公共條件種群規(guī)模統(tǒng)一最大迭代次數(shù)統(tǒng)一適應(yīng)度函數(shù)統(tǒng)一初始種群隨機(jī)種子統(tǒng)一。NGO如果用了對數(shù)編碼而其他算法用原始值編碼這就不公平了。所有算法都要在相同條件下運(yùn)行最后比較的才有意義。6.3 后續(xù)擴(kuò)展方向在線預(yù)測與動態(tài)更新做完靜態(tài)版本后如果業(yè)務(wù)需要在線預(yù)測可以考慮把模型部署為增量更新模式。LSSVM相比標(biāo)準(zhǔn)SVM的一個好處是解線性方程組模型更新時可以利用上一次求解的分解矩陣做增量計算不需要完全重訓(xùn)。相關(guān)的關(guān)鍵詞是“在線LSSVM”和“遞推最小二乘支持向量機(jī)”網(wǎng)上資料不少。另外北方蒼鷹優(yōu)化算法本身也可以和特征選擇結(jié)合起來。比如把特征掩碼加入優(yōu)化變量讓NGO在搜索超參數(shù)的同時篩選特征子集從而實(shí)現(xiàn)“同時優(yōu)化特征和參數(shù)”。這種聯(lián)合優(yōu)化的思路在多輸出預(yù)測場景下很有價值因?yàn)椴煌敵鼍S度可能依賴不同特征子集靠人工去篩選十個輸出的特征組合幾乎不可能交給優(yōu)化算法去搜往往能發(fā)現(xiàn)一些意外有效的組合。不過要注意特征維度不能太高否則搜索空間膨脹速度驚人優(yōu)化時間會不可控。我在實(shí)際使用中發(fā)現(xiàn)NGOLSSVM這個組合最舒服的地方在于“省心”。不需要做繁瑣的參數(shù)網(wǎng)格搜索也不用理解一堆復(fù)雜的內(nèi)部機(jī)理扔給算法自己跑就行。踩了幾次坑之后現(xiàn)在基本形成了一套固定流程先小樣本探路再全量優(yōu)化最后看圖調(diào)適應(yīng)度函數(shù)。這套流程用在不同數(shù)據(jù)集上都有穩(wěn)定的表現(xiàn)如果你也在做多輸出回歸預(yù)測可以直接拿過去試。