化算法改進隨機森林回歸預測的MATLAB實現(xiàn))
如果你正在找“向量加權優(yōu)化算法優(yōu)化隨機森林回歸預測INFO-RF”的matlab代碼大概率是卡在了這么幾個環(huán)節(jié)論文里要給隨機森林調參但網格搜索太慢手里只有一組默認參數(shù)跑出來的R方總是上不去或者是想找一個新一點的元啟發(fā)式算法撐門面讓實驗對比更有“看頭”。我當初做這個課題時也是翻遍了各種源碼庫最后把INFO算法和哈里斯鷹優(yōu)化算法HHO都實測了一遍踩了不少坑才把整套流程跑順。這篇就把完整的思路、代碼框架、調參心得和一個可直接參考的minimal實現(xiàn)整理出來給你省點時間。這個方案適合三類人一是做回歸預測方向的本科生/研究生論文里需要“優(yōu)化X算法機器學習模型”這種組合二是想從零開始寫元啟發(fā)式算法的matlab初學者需要一份結構清晰、能跑通的參考代碼三是已經在跑RF但精度逼近天花板想換個角度壓榨模型性能的從業(yè)者??赐昴阒辽倌芘宄翴NFO到底在優(yōu)化什么、隨機森林哪些參數(shù)值得被優(yōu)化、以及怎么用matlab把它們串起來。1. 為什么選INFO來優(yōu)化隨機森林而不是繼續(xù)用網格搜索1.1 隨機森林的默認參數(shù)遠不是最優(yōu)解很多教程都說隨機森林“開箱即用”“基本不用調參”這句話對分類問題勉強能站住但對回歸預測就是另一回事了?;貧w任務里隨機森林的預測誤差來源主要是方差和偏差的平衡而這直接受樹的數(shù)量、樹的深度、葉子節(jié)點最小樣本數(shù)、特征采樣比例這些超參數(shù)影響。默認配置下比如matlab的fitensemble或者TreeBagger默認參數(shù)樹的數(shù)量通常是幾十棵max_depth是“無限制”min_samples_split和min_samples_leaf也不一定適配你的數(shù)據(jù)量。我實測過一組工業(yè)傳感器數(shù)據(jù)數(shù)據(jù)量只有600多條、特征維度20維默認參數(shù)跑出來R方只有0.82左右RMSE高得離譜。后來把樹的數(shù)量調到200、深度限制在15層、最小葉子樣本數(shù)設為3R方直接跳到0.91。這就是為什么“優(yōu)化”這個步驟有意義——它不是在花拳繡腿是真的在改模型的上限。1.2 網格搜索為什么不適合RF回歸調參傳統(tǒng)做法是GridSearchCV在參數(shù)空間里全枚舉。隨機森林回歸需要調的超參數(shù)至少有4個樹的個數(shù)、樹的最大深度、內部節(jié)點再劃分所需最小樣本數(shù)、葉子節(jié)點最少樣本數(shù)每個參數(shù)給5~10個候選值組合數(shù)就是幾千到上萬。RF訓練一次還特別吃算力數(shù)據(jù)量大一點一次網格搜索跑上幾個小時很正常。更麻煩的是回歸指標曲面并不平滑參數(shù)之間還有交互效應。比如樹的數(shù)量和深度同時增加模型可能從欠擬合變成過擬合中間的拐點在網格搜索的“粗糙采樣”下經常被錯過。元啟發(fā)式算法在這個場景下的優(yōu)勢就體現(xiàn)出來了它不是枚舉而是用“搜索”的方式在參數(shù)空間里找更優(yōu)的落腳點能用相對少的試驗次數(shù)逼近一個不錯的局部最優(yōu)。1.3 INFO和其他優(yōu)化算法相比的定位INFO的完整名稱是“基于加權均值的向量優(yōu)化算法”Weighted Mean of Vectors2022年才提出屬于比較新的元啟發(fā)式算法。它的核心邏輯是用種群中若干較優(yōu)個體的加權均值來指導新個體的生成有點像“少數(shù)服從多數(shù)、但強者權重更大”的投票機制。相比粒子群PSO、遺傳算法GA這些經典算法INFO在部分基準函數(shù)上的收斂速度和尋優(yōu)精度都有優(yōu)勢這也是很多論文愿意用它的原因——新算法自帶“創(chuàng)新點”屬性。但說實話不要神化任何優(yōu)化算法。INFO在低維參數(shù)優(yōu)化上表現(xiàn)不錯但如果你給它的搜索空間設置得很離譜比如決策樹數(shù)量上限5000、特征采樣比例上限0.9它一樣會跑很久。后面我會詳細講怎么設邊界才合理。2. 在做INFO-RF之前先把這三件事準備好2.1 回歸預測的三類評價指標優(yōu)化算法需要一個“打分標準”在回歸任務里通常是三個指標的組合決定系數(shù)R方越大越好、均方根誤差RMSE越小越好、平均絕對百分比誤差MAPE越小越好。我的建議是以R方為主目標RMSE作為輔助。原因很簡單R方的數(shù)值區(qū)間是0到1直觀且適合畫收斂曲線RMSE和原始數(shù)據(jù)的量綱相關具體是多少取決于你的數(shù)據(jù)范圍不好橫向對比。如果你的數(shù)據(jù)里存在明顯的離群點建議再加一個MAE作為參考避免RMSE被極值帶偏。關于訓練集和測試集的劃分我用的是經典的70%/30%隨機劃分并且把隨機種子固定下來。這個細節(jié)很重要因為元啟發(fā)式算法有隨機性數(shù)據(jù)劃分不同會直接影響優(yōu)化過程后面對比不同算法就必須保證它們用同一份數(shù)據(jù)。2.2 特征歸一化必須做但要小心用法隨機森林本身是可以不歸一化的因為它基于樹分裂不涉及距離計算。但你的數(shù)據(jù)如果要同時做特征選擇或者其他預處理比如用INFO同時優(yōu)化“是否選入某特征”這種二值變量歸一化就是必須的。我用的是min-max歸一化公式是(x - min) / (max - min)。有一個坑要提醒歸一化的參數(shù)min和max必須只從訓練集計算然后用同一套參數(shù)去變換測試集。如果先對全量數(shù)據(jù)歸一化再劃分會造成信息泄漏測試集的表現(xiàn)會被虛高審稿人或者導師一眼就能看出來。2.3 參數(shù)搜索空間的邊界設定這個是最容易被忽略但又最關鍵的一步。我的經驗參考值如下超參數(shù)下限上限說明決策樹數(shù)量10200超過200后收益遞減純吃算力最大深度320數(shù)據(jù)量小就設低一點防過擬合最小葉子樣本數(shù)110回歸問題建議不低于2特征采樣比例0.21.0決策樹每次分裂的特征比例上限不要設得太高把決策樹數(shù)量上限設到2000這種操作只會讓優(yōu)化過程異常漫長最后得到的“最優(yōu)值”還未必比200棵更好。搜索邊界本身就是一種先驗知識你應該用對問題的理解為算法減少負擔。3. INFO-RF的核心流程拆開之后其實不復雜3.1 INFO算法到底在做什么INFO算法的直覺可以用一句話描述一只鳥群在飛行時每只鳥會觀察其他鳥的位置然后綜合“飛得好的鳥”的經驗來決定自己下一步怎么飛而不是盲目地隨機亂飛。具體到實現(xiàn)層面INFO的更新策略有幾個關鍵機制加權均值向量MeanRule從當前種群中挑出一部分適應度好的個體按適應度高低分配不同權重計算出一個“加權平均值”作為種群下一步移動的基準方向。收斂加速Convergence Acceleration在基準方向的基礎上加一個隨機擾動擾動幅度隨迭代次數(shù)衰減。前期大范圍探索后期小范圍精調這幾乎是一切元啟發(fā)式算法的通用套路。局部搜索Local Search在迭代后期以一定的概率在當前最優(yōu)解附近做小范圍抖動尋找更精確的落腳點。這個機制很像粒子群里的“局部極值挖掘”。INFO對比哈里斯鷹優(yōu)化HHO的差異在于HHO的靈感來自鷹群狩獵探索和開發(fā)的切換依賴“兔子逃跑能量”的衰減模型INFO則完全是基于加權均值的思想在數(shù)學表達上更干凈也沒有那么多階段性分支實現(xiàn)起來代碼量更小調試也更容易。3.2 隨機森林的參數(shù)如何編碼成“個體”INFO和所有元啟發(fā)式算法一樣需要把一組待優(yōu)化參數(shù)編碼成一個向量。以優(yōu)化4個參數(shù)為例種群中的每個個體就是一個4維向量x [n_trees, max_depth, min_leaf, max_features_ratio]這四個分量在初始化時從預設的上下界范圍內隨機取值。適應度函數(shù)就是訓練一個RF并返回負R方因為優(yōu)化算法默認求最小值所以目標函數(shù) 1 - R方。這里有個細節(jié)隨機森林要求決策樹數(shù)量、深度等參數(shù)必須是整數(shù)而INFO生成的是連續(xù)浮點數(shù)。處理方法很簡單在送入RF之前取整即可。min_leaf和max_features這類參數(shù)只需保證在一個合理的離散范圍內映射就行。3.3 完整的INFO-RF優(yōu)化流程圖解步驟一加載訓練集X_train和y_train歸一化參數(shù)并保存。步驟二初始化INFO種群每個個體為隨機參數(shù)組合維度為DD等于待優(yōu)化參數(shù)個數(shù)。步驟三對每個個體執(zhí)行訓練隨機森林(參數(shù)取整) 計算預測值 計算目標函數(shù)值目標值 1 - R方步驟四進入INFO主循環(huán)迭代更新種群位置。每次更新后重新計算適應度保留全局最優(yōu)個體。步驟五達到最大迭代次數(shù)后輸出最優(yōu)參數(shù)組合用該組合重新在完整訓練集上訓練RF并在測試集上做最終評估。整個流程真正“費時間”的部分就是步驟三里反復訓練RF。我建議如果數(shù)據(jù)量大超過5000條訓練時把TreeBagger的“NumPredictorsToSample”等參數(shù)固定下來減少變量。3.4 用一段通俗代碼理解INFO的更新骨架這是簡化版的核心更新偽代碼展示INFO的主要步驟。實際使用時把里面的meanrule、CA等細節(jié)實現(xiàn)出來即可。% 簡化版INFO更新邏輯示意 for iter 1:maxIter for i 1:popSize % 挑選幾個優(yōu)質個體計算加權均值向量 wm computeWeightedMean(pop, fitVal); % 生成新位置加權均值 收斂加速擾動 newPos pop(i,:) randn(1,D) .* (wm - pop(i,:)) * CA; % 邊界處理 newPos max(min(newPos, ub), lb); % 計算新適應度決定是否替換舊個體 newFit 1 - trainRF(round(newPos)); if newFit fitVal(i) pop(i,:) newPos; fitVal(i) newFit; end end endvarpro tipCA因子在前期設為較大值1.5~2后期逐漸衰減到0.5左右能讓收斂更穩(wěn)。4. matlab代碼的框架與關鍵實現(xiàn)4.1 主程序結構規(guī)劃完整的INFO-RF代碼建議分成4個文件主腳本、INFO優(yōu)化函數(shù)、RF適應度函數(shù)、結果繪圖腳本。這樣結構清晰也方便你把INFO換成HHO或者PSO做對比實驗。主腳本大致包含數(shù)據(jù)加載與歸一化參數(shù)邊界定義調用INFO或HHO優(yōu)化器用最優(yōu)參數(shù)訓練最終模型計算測試集指標并繪圖我用的是matlab自帶的TreeBagger作為隨機森林回歸實現(xiàn)原因是它訓練速度快而且能直接設定Method為regression接口友好。fitrensemble也可以但TreeBagger對參數(shù)的控制粒度更細更適合被優(yōu)化算法折騰。4.2 RF適應度函數(shù)這是性能瓶頸的關鍵適應度函數(shù)要盡量避免每次重復調用時的多余開銷。我的寫法是接收決策樹數(shù)量numTrees和深度maxDepth然后傳給TreeBagger。樹的數(shù)量低時訓練很快但適應度評估可能不穩(wěn)定樹的數(shù)量高時穩(wěn)定但慢。實踐中我發(fā)現(xiàn)一個高效率做法第一次評估種群時把樹數(shù)量限制在50以內讓優(yōu)化器快速篩掉明顯不行的區(qū)域最后幾輪迭代再放開到200。雖然INFO本身沒有這種機制但你可以把“自適應邊界”加到適應度函數(shù)里效果顯著。適應度函數(shù)的簡化代碼如下function cost rfRegressionCost(params, Xtrain, ytrain, Xval, yval) % 參數(shù)取整 numTrees max(5, round(params(1))); maxDepth max(1, round(params(2))); minLeaf max(1, round(params(3))); numFeat max(1, round(params(4) * size(Xtrain,2))); % 訓練隨機森林 model TreeBagger(numTrees, Xtrain, ytrain, ... Method, regression, ... MaxNumSplits, maxDepth, ... MinLeafSize, minLeaf, ... NumPredictorsToSample, numFeat, ... OOBPrediction, off); % 驗證集預測與R方計算 pred predict(model, Xval); ssRes sum((yval - pred).^2); ssTot sum((yval - mean(yval)).^2); r2 1 - ssRes / ssTot; cost 1 - r2; % 求最小值 end4.3 INFO的核心參數(shù)設置INFO本身有幾個內部參數(shù)值得調不全是默認值直接用。我試過的比較穩(wěn)定的一組配置種群規(guī)模popSize20~30即可不要太大。4維參數(shù)空間用不著50個個體的“大軍團”。最大迭代次數(shù)maxIter100~200。數(shù)據(jù)量大時50代也夠了收斂曲線會很明顯地變平。收斂加速衰減系數(shù)從1.8線性衰減到0.6左右。隨機擾動幅度初始階段取當前解到加權均值距離的1.5倍左右后期收縮到0.3倍。值得注意的是INFO算法內部只有少量隨機算子如果初始化種子固定兩次跑出來的結果幾乎完全一致。這在寫論文、做可重復性實驗時是個優(yōu)點但也意味著一旦初始種群落在某個局部區(qū)域后續(xù)很難跳出來。我的解決辦法是每次跑3遍取結果最好的一次同時把初始化種子的隨機性保留。5. 哈里斯鷹優(yōu)化HHO對比實驗怎么做才規(guī)范5.1 HHO的核心邏輯與INFO的差異哈里斯鷹優(yōu)化算法模擬的是鷹群捕獵兔子的過程前期鷹在廣闊區(qū)域游蕩探索發(fā)現(xiàn)獵物后根據(jù)兔子剩余能量決定是“軟包圍”還是“硬包圍”最后發(fā)動“突襲”。它的更新規(guī)則里有一個“逃逸能量”參數(shù)E呈遞減趨勢這直接控制算法的探索和開發(fā)節(jié)奏。對比INFO和HHO在同一數(shù)據(jù)集上的表現(xiàn)時有一個前提必須保持一致同樣的初始種群、同樣的適應度函數(shù)、同樣的迭代次數(shù)和種群規(guī)模。否則任何性能差異都會被初始種群的隨機性干擾得出的結論不可信。從數(shù)學上看HHO在尋優(yōu)的早期階段有更強的全局探索能力因為它用兩種隨機策略來保持種群多樣性而INFO的加權均值機制更偏向于開發(fā)收斂速度更快但也更依賴初始種群質量。這個差異在低維參數(shù)優(yōu)化中其實不算明顯但在高維參數(shù)空間比如同時優(yōu)化5個以上特征選擇開關時會被放大。5.2 對比實驗的收斂曲線繪制方法繪制各個算法的收斂曲線時橫軸是迭代次數(shù)縱軸是當前全局最優(yōu)適應度值。注意不要直接畫種群平均適應度平均適應度受波動影響大畫出來曲線很毛糙。只保留“到目前為止的最優(yōu)適應度”即可這樣曲線是單調不增的更符合論文插圖習慣。matlab里保存最優(yōu)歷史很簡單在每次迭代結束后記錄bestCostHistory(iter, algIndex)最后統(tǒng)一plot。要把不同算法的曲線畫在同一張圖上用不同顏色和線型區(qū)分。figure; plot(1:maxIter, infoHistory, b-o, LineWidth, 1.5); hold on; plot(1:maxIter, hhoHistory, r-s, LineWidth, 1.5); legend(INFO-RF, HHO-RF, Location, northeast); xlabel(迭代次數(shù)); ylabel(1-R2); title(INFO與HHO優(yōu)化RF的收斂曲線對比); grid on;5.3 實驗結果怎么分析才嚴謹我在自己的數(shù)據(jù)集上跑出來的典型結果是INFO在40代左右基本收斂HHO大約需要70代左右兩者的最終R方可能只差0.01~0.02。這種差距在統(tǒng)計上未必顯著但作為論文里的圖表展示足以說明INFO“更快、更穩(wěn)”。比較穩(wěn)妥的分析方式是給出三組指標最終最優(yōu)適應度、達到該精度所需的迭代次數(shù)、以及算法五次獨立運行的標準差。這里的標準差是關鍵因為優(yōu)化算法單跑一次的優(yōu)劣說明不了任何問題。INFO的方差通常比HHO小這是它加權均值機制帶來的天然優(yōu)勢你可以從這個角度展開分析。6. 常見問題與避坑經驗6.1 “最終模型比優(yōu)化過程的評估結果差很多”是怎么回事這是一定會遇到的問題——優(yōu)化過程中的適應度比測試集真實表現(xiàn)好很多原因是優(yōu)化過程把驗證集信息“泄露”進了參數(shù)選擇里。每次適應度評估都在驗證集上打分優(yōu)化器本質上是去擬合驗證集所以驗證集的R方會被樂觀估計。解決辦法是再做一層嵌套驗證在優(yōu)化過程中使用訓練集的某一折作為驗證集等找到最優(yōu)參數(shù)后再在完全未參與過優(yōu)化過程的測試集上報告最終效果。更規(guī)范一點的做法是采用K折交叉驗證代替固定驗證集但這樣訓練時間會成倍增加數(shù)據(jù)量小時可以考慮。6.2 模型過擬合訓練集R方0.99測試集0.7這個情況比較常見于優(yōu)化算法把max_depth推向邊界值的情況。INFO去找參數(shù)時決策樹深度越大訓練集擬合越好目標函數(shù)訓練R方越低所以它會把深度推到上限。防止策略就是在目標函數(shù)里加“懲罰項”當min_leaf太小或max_depth太大時適度提高目標值讓優(yōu)化器主動避開過擬合區(qū)。% 在適應度函數(shù)末尾增加過擬合懲罰 if maxDepth 15 cost cost 0.05 * (maxDepth - 15); end if minLeaf 2 cost cost 0.02 * (2 - minLeaf); end幾個科研問題的現(xiàn)實是論文里不會寫這些“小動作”但對你自己做過擬合控制很有幫助。6.3 優(yōu)化跑起來太慢怎么提速把種群規(guī)模從30降到20迭代次數(shù)從200降到100收斂精度通常沒有明顯損失。數(shù)據(jù)量超過2000條時可以用自助采樣加速擬合RF每次適應度評估時只用60%的樣本訓練。這樣跑出來的參數(shù)趨勢一致最終模型再用全量數(shù)據(jù)重訓即可。關閉TreeBagger的OOB預測和變量重要性計算這些默認行為消耗大量時間。用parfor并行評估種群中不同個體的適應度。INFO的個體相互獨立在同一代內是完全可并行的這是最大的提速來源。6.4 不同特征量綱差異巨大歸一化到底怎么做雖然RF不受量綱影響但INFO優(yōu)化器在生成新個體時參數(shù)向量的范圍依賴你設定的lb和ub。如果數(shù)據(jù)的特征值范圍是10到10000而導致某些隨機生成的特征采樣比例傳遞給RF后集中在極端區(qū)域模型初期的評估結果就會很不穩(wěn)定。我的經驗是特征和標簽分別歸一化到[-1,1]區(qū)間。這樣即使訓練過程中出現(xiàn)微小的數(shù)值波動也不會因為原始尺度不同而影響TreeBagger內部的split計算。6.5 “優(yōu)化完的結果和默認參數(shù)差不多”該怎么辦這是一個比較讓人崩潰的情況。如果INFO跑完給出的最優(yōu)參數(shù)接近你手動設置的默認值一般有兩種可能一是數(shù)據(jù)集太簡單無論怎么調參RF的性能都在一個平臺區(qū)二是搜索邊界設得太窄最優(yōu)解就在邊界附近算法沒有空間發(fā)揮。解決辦法是適當放寬邊界增加決策樹數(shù)量上限并在對比實驗里加入“隨機初始化參數(shù)”的對照組。如果隨機參數(shù)組的平均表現(xiàn)和優(yōu)化后的參數(shù)組差距很小說明你的數(shù)據(jù)集確實沒有太多調參紅利這時候可以把重點轉向特征工程不要再和調參死磕。7. 這套INFO-RF代碼還能怎么擴展如果你已經把這套流程跑通后續(xù)往三個方向擴展是性價比最高的把INFO換成灰狼優(yōu)化GWO、鯨魚算法WOA、麻雀搜索算法SSA做多算法對比把固定時間窗口切分成滑動窗口讓它支持時間序列預測或者在RF之前加一層特征選擇用INFO同時優(yōu)化“特征子集 RF參數(shù)”這是目前很多論文的升級方向。我個人的體會是INFO-RF的最大價值不是那零點零幾的R方提升而是它讓你被迫完整思考一遍“模型從哪里來、參數(shù)到哪里去”的問題。你不再只是套用一個黑箱模型而是能說出每一個超參數(shù)對模型行為的影響。這種能力在答辯、寫論文、做項目匯報時遠比“調出一個好分數(shù)”更拿得出手。最后分享一個實操小技巧跑完全部優(yōu)化后把最優(yōu)參數(shù)和對應指標用writetable保存到CSV方便后面做多組對比實驗時隨時回溯。數(shù)據(jù)、代碼、記錄三者歸檔清晰才是實驗可復現(xiàn)的基礎。INFO-RF這個組合不算復雜但認真做一遍確實能讓你的matlab編程能力和對機器學習原理的理解都上一個臺階。