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