**1. 為什麼要調參?先想想調參的目的是什麼** - * **For faster speed**: 加速模型訓練 * **For better accuracy**: 增加模型準確度 * **Deal with over-fitting**: 防止過擬合 **2. 調參有哪些方法?時間成本的取捨** - * **手動調參**: 手動靠經驗調參 * **GridSearch CV**: 暴力窮舉搜索,計算評估每個超參數組合對模型的影響,壞處是耗時 * **RandomSearch CV**: 選擇每一個超參數的一個隨機值,再進行隨機組合,比較省時 * **Hyperopt:** 理賠、審查組常用 * **Optuna:** 行銷組常用 **3. LightGBM的重要參數** - **boosting type:** `gbdt`, 傳統gradient boosting decision tree,每棵決策樹都是基於前一棵樹的殘差構建的。這種方法在預測建模中非常有效,但它的主要缺點是可能容易過度擬合。 `dart` , LightGBM 中的一種特殊的 boosting_type,它引入了一個額外的隨機性元素,類似於神經網絡中的 dropout。在每次訓練迭代中,DART 會隨機丟棄一部分決策樹,從而減少過度擬合的風險。這樣可以提高模型的robust,尤其是在訓練數據有限的情況下。 `rf`, random forest `goss`, 使用單邊梯度抽樣算法,速度很快但可能欠擬合 **objective, class_weight, metric:** 基本上在拿到data確定目標就可以設置,例如目標是二元分類、多元分類還是迴歸問題、看看y的數量是不是unbalanced,以及如何根據不同目標來評價模型 **num_leaves:** 葉子的數量,控制模型複雜度,這個數值應該小於2^(`max_depth`) **max_depth:** 樹的深度,防止樹分裂得太深,避免過擬合 **min_data_in_leaf:** 最小數量的資料要落進一個葉子,除了`max_depth`, `num_leaves`之外,也是防止過擬合的好參數 **early_stopping:** 每一個boosting round都會跟上一round比較,在val accuracy沒有比上次好的第n次就會先行停止訓練。舉例來說,如果設`early_stopping`=5,則在第5次val accuracy沒有進步時就會停止訓練 **max_bin:**`max_bin` 是 LightGBM 模型中的一個重要超參數,用於控制數據分桶的數量。在理解 `max_bin` 的意義之前,讓我們簡單解釋一下數據分桶。 數據分桶是一個將連續特徵(如數值特徵)劃分為多個離散區間的過程。這樣做的目的是為了降低特徵的複雜度,使得梯度提升樹等機器學習算法更容易處理這些特徵。每個區間稱為一個 "bin",並在樹的每個節點中用來做分裂。 `max_bin` 參數控制每個特徵的最大分桶數量。較大的 `max_bin` 值意味著更多的分桶,這通常會增加模型的精確性,因為模型可以更細緻地捕獲特徵的細節。然而,較大的 `max_bin` 也會增加模型的複雜度和訓練時間,因為模型需要處理更多的分桶。 在選擇 `max_bin` 的值時,需要平衡模型的性能和訓練時間。通常,您可以從一個較小的值開始,然後通過調整超參數來找到最佳的 `max_bin` 值。如果數據特徵的範圍廣泛,您可能需要使用較大的 `max_bin` 值,以確保模型能夠充分捕獲這些特徵的變化。 **lambda_l1, lambda_l2:** 正則化權重項,可以把他想像成懲罰項,數值越大會讓模型偏保守 **4. 舉個例子🌰** - 如果我的模型訓練速度尚可接受,但我想增加accuracy但同時又不希望造成over-fitting,我要怎麼調參? `objective`, `class_weight`, `metric`基本上看模型目標與資料本身決定 根據官方調參指南,想增加accuracy可以... * Use **large** `max_bin` (may be slower) * Use **small** `learning_rate` with **large** `num_iterations` * Use **large** `num_leaves` (may cause over-fitting) * Use bigger training data * Try `dart` 如果想同時防止過擬合,官方建議... * Use **small** `max_bin` * Use **small** `num_leaves` * Use `min_data_in_leaf` and `min_sum_hessian_in_leaf` * Use bigger training data * Try `lambda_l1`, `lambda_l2` and `min_gain_to_split` for regularization * Try `max_depth` to avoid growing deep tree 從官方調參指南中,可以看到在追求高accuracy跟防止過擬合的路途中是會有些衝突的,所以我們可以選擇用不同選項的 **boosting type, max_bin, learning_rate, num_leaves, max_depth, lambda_l1, lambda_l2** 去做排列組合,讓模型找出屬於他的一條路~ 至於各個參數要選哪些範圍調參,可以參考網路上大家調參的經驗,並注意一些限制,例如`num_leaves` 應該小於2^(`max_depth`) 要加速調參過程的話,可以使用RandomSearch CV,可以節省時間提高效率! **5. Hyperopt、Optuna** - **Hyperopt和Optuna都是用於自動化調整超參數的Python套件** * Hyperopt和Optuna都使用了貝葉斯優化方法,它們在搜索超參數空間時會考慮之前的試驗結果,以便更智能地選擇下一個超參數組合。 * 這種貝葉斯優化方法使得Hyperopt和Optuna能夠更有效地探索超參數空間,通常能夠在相同迭代次數內找到更好的超參數組合。 * Hyperopt和Optuna還提供了更多的自定義選項和高級功能,如兩者都支持的條件超參數、多種搜索策略,以及Optuna可視化工具,都將使調參過程更強大和靈活。 **比RandomSearch CV更強大的搜索工具:條件超參數、多種搜索策略、可視化工具** * 條件超參數(Conditional Hyperparameters) 在超參數搜索空間中存在依賴關係的超參數,例如**某些超參數的取值可能取決於其他超參數的取值**。條件超參數在調優過程中需要特別的處理,以確保超參數的組合是合理的。例如,如果你有一個模型,其中一個超參數是學習率,另一個超參數是優化器的類型,則優化器的選擇可能依賴於學習率的範圍 * 多種搜索策略(Multiple Search Strategies) 在超參數調優過程中使用不同的搜索方法或算法。超參數優化不一定要使用單一的搜索策略,而是可以結合多種策略以更全面地探索超參數空間。例如,**一個調參套件可以同時使用隨機搜索、貝葉斯優化和網格搜索等不同的策略,以找到最佳的超參數組合**。這樣的方法可以提高尋找最佳超參數的成功機會,並更有效地收斂到最佳解 * 可視化工具(Visualization Tools) 用於視覺化和分析超參數調優過程的工具。這些工具通常提供圖形界面,用戶可以輕鬆地查看超參數搜索的進展、各超參數之間的關係、目標函數的值隨時間的變化等資訊。可視化工具有助於用戶更好地理解超參數調優過程以作出更明智的決策,如調整搜索策略、增加迭代次數或更改超參數搜索範圍。 **Hyperopt和Optuna的差異比較** * 可用性 Optuna在易用性方面具有一些優勢,它提供了更簡單的API,使用戶可以輕鬆定義超參數搜索空間和目標函數。它還提供了內建的可視化工具,用於監視和分析優化過程。在某些情況下,Hyperopt用戶需要撰寫更多的自定義程式來定義搜索空間和目標函數。除此之外,Hyperopt也缺乏內建的可視化工具,需要額外的工作來監看優化進展。 * 社區支持和生態系統 Optuna的開發和維護由Preferred Networks支持,這是一家專注於深度學習和機器學習的公司。它有一個活躍的社區和更多的貢獻者,因此在功能擴展和問題解決方面更具優勢。Hyperopt的開發相對較少活躍,社區支持較少,因此可能在一些方面缺少最新的功能和修復。 * 多種搜索策略 Optuna支持多種搜索策略,包括貝葉斯優化、隨機搜索和網格搜索。用戶可以選擇適合其需求的搜索策略,從而更加靈活。Hyperopt也支持不同的搜索策略,但通常需要用戶自己實現或借助擴展庫來實現。 **6. 參考資料** - 官方參數說明: https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html 官方調參指引: https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html 調參方法: https://medium.com/analytics-vidhya/hyper-parameter-tuning-gridsearchcv-vs-randomizedsearchcv-499862e3ca5 超參數其他補充資源: https://blog.csdn.net/VariableX/article/details/107256149 Hyperopt官方網站: http://hyperopt.github.io/hyperopt/ Optuna官方網站: https://optuna.readthedocs.io/en/stable/ 貝葉斯優化補充說明:https://zhuanlan.zhihu.com/p/53826787