森林超參數(shù)優(yōu)化:原理、實(shí)現(xiàn)與調(diào)優(yōu)指南)
1. 項(xiàng)目概述當(dāng)隨機(jī)森林遇上鳥群智慧最近在做一個預(yù)測模型優(yōu)化的項(xiàng)目客戶對精度的要求近乎苛刻傳統(tǒng)的隨機(jī)森林回歸雖然穩(wěn)定但總感覺在參數(shù)空間里還有潛力沒挖出來。調(diào)參調(diào)到頭禿的時候突然想起了之前研究過的群體智能算法尤其是鳥群算法Bird Swarm Algorithm, BSA那種自組織、信息共享的尋優(yōu)機(jī)制。一個念頭冒出來能不能用鳥群算法來“馴化”隨機(jī)森林讓它自己找到最優(yōu)的那片“森林”這個想法就是“基于鳥群算法改進(jìn)的隨機(jī)森林回歸算法”的核心。它不是一個全新的算法而是一種融合策略。簡單說我們把隨機(jī)森林回歸模型看作一個需要優(yōu)化的“黑箱”它的預(yù)測精度比如R2、RMSE受一系列超參數(shù)影響比如決策樹的數(shù)量n_estimators、樹的最大深度max_depth、葉子節(jié)點(diǎn)所需的最小樣本數(shù)min_samples_leaf等。手動網(wǎng)格搜索Grid Search或者隨機(jī)搜索Random Search效率低且容易陷入局部最優(yōu)。而鳥群算法模擬鳥群覓食時個體學(xué)習(xí)與社會學(xué)習(xí)相結(jié)合的行為被證明在連續(xù)空間和非線性問題上具有強(qiáng)大的全局尋優(yōu)能力。用BSA來為隨機(jī)森林自動尋優(yōu)相當(dāng)于給這個穩(wěn)健的“委員會”模型隨機(jī)森林由多棵樹投票配上了一位聰明的“偵察兵隊(duì)長”。這適合誰呢如果你正在處理回歸預(yù)測問題如房價(jià)預(yù)測、銷量預(yù)估、設(shè)備壽命預(yù)測已經(jīng)用上了隨機(jī)森林但覺得精度還有提升空間或者厭倦了手動調(diào)參的繁瑣那么這個思路會給你帶來新的工具和視角。它尤其適合特征與目標(biāo)關(guān)系復(fù)雜、數(shù)據(jù)存在一定噪聲的中大規(guī)模數(shù)據(jù)集。接下來我會拆解整個設(shè)計(jì)思路、實(shí)現(xiàn)細(xì)節(jié)并分享我在實(shí)操中踩過的坑和總結(jié)的技巧。2. 核心思路與算法選型解析2.1 為什么是隨機(jī)森林回歸隨機(jī)森林回歸以其出色的準(zhǔn)確性、對異常值和噪聲的魯棒性、以及不易過擬合的特性成為機(jī)器學(xué)習(xí)回歸任務(wù)中的“常青樹”。它的核心思想是集成學(xué)習(xí)和隨機(jī)性。BaggingBootstrap Aggregating通過有放回抽樣生成多個不同的訓(xùn)練子集并行訓(xùn)練多棵決策樹。這降低了模型方差提高了穩(wěn)定性。特征隨機(jī)性每棵樹在分裂節(jié)點(diǎn)時只考慮特征的一個隨機(jī)子集。這進(jìn)一步增強(qiáng)了樹之間的差異性提升了模型的泛化能力。但是它的性能嚴(yán)重依賴于超參數(shù)組合。一棵“弱”的樹如深度太淺學(xué)習(xí)能力不足一棵“過強(qiáng)”的樹如深度太深、葉子節(jié)點(diǎn)樣本數(shù)太少又容易過擬合。森林中樹的數(shù)量不足會導(dǎo)致預(yù)測不穩(wěn)定過多則會顯著增加計(jì)算成本而收益遞減。傳統(tǒng)調(diào)參方法像是“盲人摸象”而鳥群算法則試圖以一種更智能的方式探索整個參數(shù)空間。2.2 為什么選擇鳥群算法BSA進(jìn)行優(yōu)化群體智能算法很多比如粒子群PSO、遺傳算法GA、蟻群算法ACO。選擇BSA主要基于它在解決連續(xù)優(yōu)化問題上的幾個優(yōu)勢探索與開發(fā)的平衡BSA模擬了鳥群覓食時的兩種狀態(tài)覓食開發(fā)利用已知的好區(qū)域和警戒探索飛向新的可能區(qū)域。算法通過一個概率開關(guān)來控制個體在這兩種狀態(tài)間切換這比PSO中單純依賴個體和群體歷史最優(yōu)的更新方式在避免早熟收斂陷入局部最優(yōu)方面表現(xiàn)更好。社會結(jié)構(gòu)清晰在BSA中每只鳥即一個解會記住自己找到過的最好位置個體歷史最優(yōu)也會感知整個群體中最好的位置全局歷史最優(yōu)。同時它還會受到隨機(jī)選擇的“鄰居”鳥的影響。這種多層次的信息交流機(jī)制使得優(yōu)化過程既有個體經(jīng)驗(yàn)積累又有群體智慧共享還有隨機(jī)擾動帶來的多樣性。參數(shù)相對簡單BSA的核心參數(shù)較少主要包括種群大小、迭代次數(shù)、覓食概率、飛行頻率等比GA的交叉變異概率、PSO的慣性權(quán)重等更易于設(shè)置和調(diào)整降低了我們進(jìn)行“元優(yōu)化”的復(fù)雜度。對非凸、非線性問題有效超參數(shù)優(yōu)化本質(zhì)上是一個黑箱、非線性、可能非凸的優(yōu)化問題。BSA的群體隨機(jī)搜索特性非常適合這類場景。核心思路流程圖非代碼初始化將隨機(jī)森林的超參數(shù)如n_estimators, max_depth等映射為一個多維向量每只“鳥”的位置代表一組超參數(shù)。評估用每只“鳥”代表的超參數(shù)配置訓(xùn)練隨機(jī)森林模型在驗(yàn)證集上計(jì)算評價(jià)指標(biāo)如負(fù)均方誤差因?yàn)锽SA通常求解最小化問題。BSA迭代覓食行為以一定概率鳥向個體最優(yōu)和全局最優(yōu)位置靠近開發(fā)。警戒行為以另一概率鳥飛向一個隨機(jī)位置或受鄰居影響的位置探索。更新位置根據(jù)上述行為更新每只鳥的位置即超參數(shù)組合。越界處理確保更新后的超參數(shù)在預(yù)設(shè)的合理范圍內(nèi)。循環(huán)重復(fù)步驟2-3直到達(dá)到最大迭代次數(shù)或滿足收斂條件。輸出輸出全局最優(yōu)“鳥”的位置即最優(yōu)超參數(shù)組合用其訓(xùn)練最終隨機(jī)森林模型。注意這里我們優(yōu)化的是隨機(jī)森林的超參數(shù)而不是其內(nèi)部結(jié)構(gòu)參數(shù)。BSA扮演了一個“智能超參數(shù)調(diào)優(yōu)器”的角色。3. 關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)與參數(shù)映射3.1 超參數(shù)空間的定義與編碼這是第一步也是決定優(yōu)化范圍的關(guān)鍵。我們需要將離散、連續(xù)、整數(shù)類型的超參數(shù)統(tǒng)一編碼為BSA可以處理的連續(xù)向量。假設(shè)我們選擇優(yōu)化以下四個關(guān)鍵參數(shù)n_estimators(決策樹數(shù)量):整數(shù)范圍 [50, 500]max_depth(樹最大深度):整數(shù)或None范圍 [3, 20] None表示不限制通常我們設(shè)定一個上限。min_samples_split(內(nèi)部節(jié)點(diǎn)再劃分所需最小樣本數(shù)):整數(shù)或浮點(diǎn)數(shù)若為整數(shù)范圍 [2, 20]若為浮點(diǎn)數(shù)表示比例范圍 [0.01, 0.2]。max_features(尋找最佳分割時考慮的特征數(shù)):整數(shù)、浮點(diǎn)數(shù)或字符串。我們簡化處理優(yōu)化為浮點(diǎn)數(shù)比例范圍 [0.1, 1.0]。編碼方案 我們定義一個四維向量X [x1, x2, x3, x4]代表一只鳥的位置。x1對應(yīng)n_estimators 搜索空間是連續(xù)的[50, 500]評估時取整int(round(x1))。x2對應(yīng)max_depth 搜索空間[3, 20]評估時取整??梢栽O(shè)置一個特殊值如-1映射為None但為簡化我們先設(shè)定深度。x3對應(yīng)min_samples_split 我們可以統(tǒng)一用浮點(diǎn)數(shù)比例。設(shè)定搜索空間為[0.01, 0.2]。在訓(xùn)練時如果x3 * 總樣本數(shù)小于2則強(qiáng)制設(shè)為2。x4對應(yīng)max_features 搜索空間為[0.1, 1.0]。這樣BSA就在一個四維連續(xù)空間[50,500] x [3,20] x [0.01,0.2] x [0.1,1.0]中進(jìn)行搜索。3.2 適應(yīng)度函數(shù)的設(shè)計(jì)適應(yīng)度函數(shù)Fitness Function是BSA評估一只“鳥”好壞的唯一標(biāo)準(zhǔn)。我們的目標(biāo)是最大化隨機(jī)森林回歸模型在驗(yàn)證集上的性能。常用的回歸指標(biāo)有R2、均方誤差MSE、均方根誤差RMSE、平均絕對誤差MAE。由于BSA通常用于最小化問題我們通常將適應(yīng)度函數(shù)定義為負(fù)的評估指標(biāo)。例如如果我們選擇R2作為評估標(biāo)準(zhǔn)越大越好則適應(yīng)度函數(shù)為Fitness -R2BSA尋找使-R2最小的解即R2最大的解。如果選擇MSE越小越好則直接Fitness MSE。實(shí)操心得使用交叉驗(yàn)證為了避免過擬合不應(yīng)該用整個訓(xùn)練集來訓(xùn)練和評估。通常采用K折交叉驗(yàn)證如5折的驗(yàn)證集平均性能作為適應(yīng)度值。雖然這會使每次評估的計(jì)算量增加K倍但結(jié)果更可靠。指標(biāo)選擇R2對模型整體擬合度敏感MSE/RMSE對大的誤差懲罰更重。根據(jù)業(yè)務(wù)目標(biāo)選擇。我通常先用RMSE因?yàn)樗皖A(yù)測值的量綱一致更直觀。加入正則化為了防止BSA找到過于復(fù)雜的模型如max_depth極大、min_samples_split極小的組合可以在適應(yīng)度函數(shù)中加入一個與模型復(fù)雜度成正比的懲罰項(xiàng)例如Fitness RMSE λ * complexity其中complexity可以是樹的平均深度或節(jié)點(diǎn)總數(shù)。這需要謹(jǐn)慎調(diào)整λ。3.3 鳥群算法BSA的核心參數(shù)與迭代過程BSA的實(shí)現(xiàn)需要設(shè)置以下幾個關(guān)鍵參數(shù)pop_size(種群大小): 鳥的數(shù)量。通常設(shè)置在20到50之間。太小則搜索能力不足太大則計(jì)算開銷大。對于我們的4維問題30-40是個不錯的起點(diǎn)。max_iter(最大迭代次數(shù)): 優(yōu)化迭代的輪數(shù)。50-200次取決于問題復(fù)雜度和計(jì)算資源。FQ(飛行頻率): 控制鳥進(jìn)行警戒探索行為的頻率。典型值在5到20之間意味著每FQ次迭代鳥群會集體進(jìn)行一次探索飛行。P(覓食概率): 個體鳥在非警戒迭代中進(jìn)行覓食開發(fā)行為的概率。通常設(shè)為0.8左右。C和S:C: 個體認(rèn)知加速常數(shù)控制鳥飛向自己歷史最優(yōu)位置的權(quán)重。S: 社會群體加速常數(shù)控制鳥飛向全局最優(yōu)位置的權(quán)重。通常C和S都設(shè)為1.5左右。一次迭代的偽代碼描述# 假設(shè)當(dāng)前迭代次數(shù)為 t for each bird i in population: if t % FQ 0: # 警戒行為探索 new_position[i] position[i] (mean_position - position[i]) * randn() * rand() (global_best_position - position[i]) * rand() * randn() else: # 覓食行為開發(fā) if rand() P: # 向個體最優(yōu)和全局最優(yōu)學(xué)習(xí) new_position[i] position[i] C * rand() * (pbest[i] - position[i]) S * rand() * (gbest - position[i]) else: # 隨機(jī)學(xué)習(xí)一個同伴 j random_select(population, excludei) new_position[i] position[i] randn() * (position[j] - position[i]) * rand() # 邊界處理確保 new_position[i] 的每個維度都在預(yù)設(shè)的[min, max]范圍內(nèi) new_position[i] clip(new_position[i], min_bounds, max_bounds) # 評估新位置更新個體最優(yōu)(pbest)和全局最優(yōu)(gbest)這里的rand()和randn()分別表示[0,1)均勻分布隨機(jī)數(shù)和標(biāo)準(zhǔn)正態(tài)分布隨機(jī)數(shù)。mean_position是當(dāng)前整個種群的平均位置。4. 完整實(shí)操流程與代碼實(shí)現(xiàn)要點(diǎn)下面我將結(jié)合Python使用scikit-learn的RandomForestRegressor和一個簡化的BSA實(shí)現(xiàn)來演示核心流程。我們假設(shè)使用5折交叉驗(yàn)證的RMSE作為適應(yīng)度函數(shù)。4.1 環(huán)境準(zhǔn)備與數(shù)據(jù)加載首先確保環(huán)境中有必要的庫。pip install numpy scikit-learn matplotlib數(shù)據(jù)準(zhǔn)備部分我們以波士頓房價(jià)數(shù)據(jù)集已棄用此處僅作示例或一個自定義數(shù)據(jù)集為例。import numpy as np from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split, cross_val_score from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error # 生成一個模擬回歸數(shù)據(jù)集 X, y make_regression(n_samples1000, n_features20, noise0.1, random_state42) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 定義超參數(shù)邊界 param_bounds { n_estimators: (50, 500), # 整數(shù)BSA中處理為連續(xù)后取整 max_depth: (3, 20), # 整數(shù) min_samples_split: (0.01, 0.2), # 比例 max_features: (0.1, 1.0) # 比例 } dim len(param_bounds) # 優(yōu)化問題的維度這里是4 keys list(param_bounds.keys()) min_bounds np.array([b[0] for b in param_bounds.values()]) max_bounds np.array([b[1] for b in param_bounds.values()])4.2 BSA優(yōu)化器實(shí)現(xiàn)這里實(shí)現(xiàn)一個簡化版的BSA核心。class SimpleBSA: def __init__(self, pop_size30, max_iter100, FQ10, P0.8, C1.5, S1.5): self.pop_size pop_size self.max_iter max_iter self.FQ FQ # 飛行頻率 self.P P # 覓食概率 self.C C # 個體認(rèn)知常數(shù) self.S S # 社會學(xué)習(xí)常數(shù) self.dim None self.min_bounds None self.max_bounds None def optimize(self, fitness_func, dim, min_bounds, max_bounds): self.dim dim self.min_bounds min_bounds self.max_bounds max_bounds # 1. 初始化種群 population np.random.uniform(min_bounds, max_bounds, (self.pop_size, dim)) velocity np.zeros((self.pop_size, dim)) pbest_pos population.copy() # 個體歷史最優(yōu)位置 pbest_val np.full(self.pop_size, np.inf) # 個體歷史最優(yōu)適應(yīng)度最小化問題 gbest_pos None # 全局歷史最優(yōu)位置 gbest_val np.inf # 全局歷史最優(yōu)適應(yīng)度 # 初始評估 for i in range(self.pop_size): fit fitness_func(population[i]) pbest_val[i] fit if fit gbest_val: gbest_val fit gbest_pos population[i].copy() # 2. 迭代優(yōu)化 for t in range(1, self.max_iter 1): # 計(jì)算種群平均位置 mean_position np.mean(population, axis0) for i in range(self.pop_size): if t % self.FQ 0: # 警戒行為 (探索) r1, r2, r3, r4 np.random.rand(4) new_pos population[i] (mean_position - population[i]) * np.random.randn() * r1 \ (gbest_pos - population[i]) * r2 * np.random.randn() else: # 覓食行為 if np.random.rand() self.P: # 向個體最優(yōu)和全局最優(yōu)學(xué)習(xí) (開發(fā)) r1, r2 np.random.rand(2) new_pos population[i] self.C * r1 * (pbest_pos[i] - population[i]) \ self.S * r2 * (gbest_pos - population[i]) else: # 隨機(jī)向一個同伴學(xué)習(xí) j np.random.randint(0, self.pop_size) while j i: j np.random.randint(0, self.pop_size) r np.random.rand() new_pos population[i] np.random.randn() * (population[j] - population[i]) * r # 邊界處理 new_pos np.clip(new_pos, self.min_bounds, self.max_bounds) # 評估新位置 new_fit fitness_func(new_pos) # 更新個體最優(yōu) if new_fit pbest_val[i]: pbest_val[i] new_fit pbest_pos[i] new_pos.copy() # 更新全局最優(yōu) if new_fit gbest_val: gbest_val new_fit gbest_pos new_pos.copy() # 更新種群位置 population[i] new_pos # 可以在這里打印每代最優(yōu)適應(yīng)度監(jiān)控進(jìn)程 if t % 20 0: print(fIteration {t}, Best RMSE: {gbest_val:.4f}) return gbest_pos, gbest_val4.3 適應(yīng)度函數(shù)與主流程適應(yīng)度函數(shù)需要將BSA的連續(xù)向量解碼為隨機(jī)森林的超參數(shù)并進(jìn)行評估。def decode_params(position, param_bounds, keys): 將連續(xù)向量解碼為具體的超參數(shù)字典 params {} for idx, key in enumerate(keys): val position[idx] lb, ub param_bounds[key] # 特殊處理整數(shù)參數(shù) if key in [n_estimators, max_depth]: val int(np.round(val)) val max(lb, min(ub, val)) # 確保取整后在邊界內(nèi) # 對于比例參數(shù)確保在范圍內(nèi) elif key in [min_samples_split, max_features]: val max(lb, min(ub, val)) params[key] val # 處理 min_samples_split如果是比例轉(zhuǎn)換為具體樣本數(shù) if min_samples_split in params and params[min_samples_split] 1: # 這里需要在fitness_func內(nèi)部根據(jù)訓(xùn)練數(shù)據(jù)大小轉(zhuǎn)換更合理 pass return params def fitness_function(position): BSA的適應(yīng)度函數(shù)返回5折交叉驗(yàn)證的RMSE均值 # 1. 解碼參數(shù) params_dict decode_params(position, param_bounds, keys) # 確保 min_samples_split 至少為2或?qū)?yīng)最小樣本數(shù) if params_dict[min_samples_split] 2 and params_dict[min_samples_split] 0.01: # 如果是比例我們在這里不轉(zhuǎn)換留給RF內(nèi)部處理。sklearn的RF接受浮點(diǎn)數(shù)比例。 # 但需要確保比例乘以樣本數(shù)后不小于2這在實(shí)際數(shù)據(jù)中判斷更復(fù)雜此處簡化。 pass # 2. 創(chuàng)建隨機(jī)森林模型 # 注意sklearn的RandomForestRegressor的max_features如果輸入浮點(diǎn)數(shù)表示比例。 # min_samples_split輸入浮點(diǎn)數(shù)也表示比例。 rf_model RandomForestRegressor( n_estimatorsparams_dict[n_estimators], max_depthparams_dict[max_depth] if params_dict[max_depth] 0 else None, min_samples_splitparams_dict[min_samples_split], max_featuresparams_dict[max_features], random_state42, # 固定隨機(jī)種子確保可比性 n_jobs-1 # 使用所有CPU核心 ) # 3. 5折交叉驗(yàn)證計(jì)算負(fù)的RMSE因?yàn)锽SA求最小我們返回RMSE本身 # cross_val_score 默認(rèn)使用模型的score方法R2我們需要用neg_mean_squared_error from sklearn.model_selection import cross_val_score scores cross_val_score(rf_model, X_train, y_train, cv5, scoringneg_mean_squared_error, n_jobs-1) mse_scores -scores # 轉(zhuǎn)為正MSE rmse_mean np.sqrt(mse_scores.mean()) # 計(jì)算平均RMSE return rmse_mean # 主優(yōu)化流程 bsa_optimizer SimpleBSA(pop_size30, max_iter80, FQ10, P0.8, C1.5, S1.5) best_position, best_fitness bsa_optimizer.optimize(fitness_function, dim, min_bounds, max_bounds) print(\n 優(yōu)化結(jié)果 ) best_params decode_params(best_position, param_bounds, keys) print(f最優(yōu)超參數(shù)組合: {best_params}) print(f對應(yīng)的5折CV平均RMSE: {best_fitness:.4f}) # 使用最優(yōu)參數(shù)在完整訓(xùn)練集上訓(xùn)練最終模型 final_rf RandomForestRegressor(**best_params, random_state42, n_jobs-1) final_rf.fit(X_train, y_train) # 在測試集上評估 y_pred final_rf.predict(X_test) test_rmse np.sqrt(mean_squared_error(y_test, y_pred)) test_r2 final_rf.score(X_test, y_test) print(f測試集 RMSE: {test_rmse:.4f}) print(f測試集 R2: {test_r2:.4f})5. 常見問題、調(diào)優(yōu)心得與避坑指南在實(shí)際操作中你會遇到各種各樣的問題。下面是我總結(jié)的一些典型情況和處理技巧。5.1 BSA優(yōu)化過程震蕩或不收斂現(xiàn)象適應(yīng)度值如RMSE在迭代過程中上下波動沒有明顯下降趨勢或者很早就停滯不前。原因與對策種群多樣性過早喪失所有鳥過快聚集到局部最優(yōu)??梢試L試增加種群大小pop_size比如從30增加到50或80給算法更多探索空間。探索能力不足FQ飛行頻率太低或P覓食概率太高導(dǎo)致算法過于“開發(fā)”而缺乏“探索”??梢越档蚉如從0.8降到0.6或提高FQ如從10提高到15增加隨機(jī)搜索的比例。搜索空間定義不合理某個超參數(shù)的范圍設(shè)得太大或太小。例如n_estimators的上限500可能不夠?qū)τ谀承?fù)雜問題可能需要1000以上?;蛘適ax_depth的下限3可能限制了模型能力。需要根據(jù)數(shù)據(jù)復(fù)雜度和計(jì)算資源調(diào)整參數(shù)邊界。一個技巧是先用手動或網(wǎng)格搜索大致摸一下哪個范圍可能包含好解。適應(yīng)度函數(shù)噪聲大如果使用交叉驗(yàn)證且數(shù)據(jù)量小或折數(shù)少每次評估的RMSE可能有較大方差??梢栽黾咏徊骝?yàn)證的折數(shù)如10折或者使用重復(fù)交叉驗(yàn)證但會顯著增加計(jì)算時間。也可以在適應(yīng)度函數(shù)中對多次評估取平均來平滑噪聲。5.2 計(jì)算時間過長現(xiàn)象優(yōu)化過程運(yùn)行緩慢難以忍受。原因與對策種群規(guī)模或迭代次數(shù)過大這是最直接的原因。在資源有限的情況下需要權(quán)衡??梢韵冗M(jìn)行小規(guī)模快速實(shí)驗(yàn)如pop_size20,max_iter30找到大致方向再逐步增加規(guī)模進(jìn)行精細(xì)優(yōu)化。隨機(jī)森林訓(xùn)練慢n_estimators過大、max_depth過深、數(shù)據(jù)維度高都會導(dǎo)致單次模型訓(xùn)練很慢。在BSA優(yōu)化初期可以使用一個簡化的、訓(xùn)練更快的代理模型來評估適應(yīng)度比如減少n_estimators的搜索上限或者先使用max_depth較小的樹。在找到潛力區(qū)域后再用完整模型進(jìn)行微調(diào)。也可以考慮使用sklearn的HalvingRandomSearchCV等漸進(jìn)式搜索策略的思想與BSA結(jié)合。并行化不足scikit-learn的RandomForestRegressor本身支持多核n_jobs-1但BSA的種群評估是串行的。可以考慮并行評估種群個體。由于每個個體的評估是獨(dú)立的可以用joblib或multiprocessing庫實(shí)現(xiàn)種群級別的并行大幅縮短時間。from joblib import Parallel, delayed def evaluate_population(population): results Parallel(n_jobs-1)(delayed(fitness_function)(ind) for ind in population) return np.array(results) # 在BSA迭代中用此函數(shù)批量評估整個種群5.3 過擬合風(fēng)險(xiǎn)現(xiàn)象BSA找到的超參數(shù)組合在交叉驗(yàn)證集上表現(xiàn)極好但在獨(dú)立的測試集上表現(xiàn)下降明顯。原因與對策適應(yīng)度函數(shù)未考慮模型復(fù)雜度BSA只追求驗(yàn)證集誤差最小可能選出極其復(fù)雜的模型如深度很深、葉子節(jié)點(diǎn)樣本數(shù)極少的樹。在適應(yīng)度函數(shù)中加入正則化項(xiàng)如Fitness RMSE_CV α * (avg_tree_depth)懲罰復(fù)雜模型。交叉驗(yàn)證數(shù)據(jù)泄露確保在整個BSA優(yōu)化流程中測試集X_test,y_test完全不可見。適應(yīng)度評估只使用訓(xùn)練集X_train,y_train進(jìn)行交叉驗(yàn)證。最終模型用全部訓(xùn)練集訓(xùn)練僅在最后用測試集評估一次。超參數(shù)空間包含“危險(xiǎn)區(qū)域”例如min_samples_split或min_samples_leaf的下限設(shè)得太低如1容易產(chǎn)生過擬合樹。可以設(shè)置更保守的下限比如min_samples_split不低于10或0.05比例。5.4 與網(wǎng)格搜索/隨機(jī)搜索的對比網(wǎng)格搜索在參數(shù)空間均勻打點(diǎn)確保覆蓋但維度災(zāi)難下計(jì)算量爆炸。對于4個參數(shù)每個取10個值就要訓(xùn)練評估10^410000次模型。BSA的優(yōu)勢在于它是一種導(dǎo)向性搜索用更少的評估次數(shù)種群大小×迭代次數(shù)如30×802400次找到近似最優(yōu)解效率更高。隨機(jī)搜索隨機(jī)采樣比網(wǎng)格搜索高效尤其當(dāng)某些參數(shù)對性能影響不大時。但它的搜索是盲目的。BSA的優(yōu)勢在于它有記憶和學(xué)習(xí)能力能利用歷史好的解的信息來指導(dǎo)后續(xù)搜索通常比純隨機(jī)搜索收斂更快、找到的解更好。我的經(jīng)驗(yàn)法則對于超參數(shù)數(shù)量不多10的問題可以先做一輪廣泛的隨機(jī)搜索比如500次找到有希望的區(qū)域。然后在這個縮小的區(qū)域附近用BSA進(jìn)行精細(xì)搜索。這種“粗調(diào)微調(diào)”的組合策略往往效果和效率俱佳。最后記住沒有“銀彈”。BSA-RF的組合是一種強(qiáng)大的工具但它本身的參數(shù)如FQ,P,C,S也需要調(diào)整。對于新的數(shù)據(jù)集從一個中等規(guī)模的種群和迭代次數(shù)開始觀察優(yōu)化曲線再根據(jù)上述指南進(jìn)行調(diào)整。這個過程本身就是機(jī)器學(xué)習(xí)和優(yōu)化算法令人著迷的地方——用算法來優(yōu)化算法讓模型盡可能地釋放潛力。