【机器学习】网格搜索、随机搜索和贝叶斯搜索实用教程
在機器學習中,超參數是指無法從數據中學習而需要在訓練前提供的參數。機器學習模型的性能在很大程度上依賴于尋找最佳超參數集。
超參數調整一般是指調整模型的超參數,這基本上是一個非常耗時的過程。在本文中,小編將和你一起研習 3 種最流行的超參數調整技術:網格搜索、隨機搜索和貝葉斯搜索。其實還有第零種調參方法,就是手動調參,因為簡單機械,就不在本文討論范圍內。為方便閱讀,列出本文的結構如下:
1.獲取和準備數據
2.網格搜索
3.隨機搜索
4.貝葉斯搜索
5.寫在最后
獲取和準備數據
為演示方便,本文使用內置乳腺癌數據來訓練支持向量分類(SVC)。可以通過load_breast_cancer函數獲取數據。
import?pandas?as?pd from?sklearn.datasets?import?load_breast_cancer cancer?=?load_breast_cancer() df_X?=?pd.DataFrame(cancer['data'],?columns=cancer['feature_names']) df_X.head()接下來為特征和目標標簽創建df_X和df_y,如下所示:
df_y?=?pd.DataFrame(cancer['target'],?columns=['Cancer']) df_y.head()PS :如果想了解更多關于數據集的信息,可以運行print(cancer['DESCR'])打印出摘要和特征信息。
接下來,使用training_test_split()方法將數據集拆分為訓練集 (70%) 和測試集 (30%) :
#?train?test?split? from?sklearn.model_selection?import?train_test_split? import?numpy?as?np X_train,?X_test,?y_train,?y_test?=?train_test_split(df_X,?np.ravel(df_y),?test_size=0.3)我們將訓練支持向量分類器(SVC) 模型。正則化參數C和核系數gamma是 SVC 中最重要的兩個超參數:
正則化參數C決定了正則化的強度。
核系數gamma控制核的寬度。SVC默認使用徑向基函數 (RBF)核(也稱為高斯核)。
我們將在以下教程中調整這兩個參數。
網格搜索
最優值C和gamma是比較難找得到的。最簡單的解決方案是嘗試一堆組合,看看哪種組合效果最好。這種創建參數“網格”并嘗試所有可能組合的方法稱為網格搜索。
網格搜索——嘗試所有可能的組合這種方法非常常見,所以Scikit-learn在GridSearchCV中內置了這種功能。CV 代表交叉驗證,這是另一種評估和改進機器學習模型的技術。
GridSearchCV需要一個描述準備嘗試的參數和要訓練的模型的字典。網格搜索的參數網格定義為字典,其中鍵是參數,值是要測試的一系列設置值。下面動手試試,首先定義候選參數C和gamma,如下所示:
param_grid?=?{?'C':?[0.1,?1,?10,?100,?1000],?'gamma':?[1,?0.1,?0.01,?0.001,?0.0001]? }接下來創建一個GridSearchCV對象,并使用訓練數據進行訓練模型。
from?sklearn.model_selection?import?GridSearchCV from?sklearn.svm?import?SVCgrid?=?GridSearchCV(SVC(),?param_grid,?refit=True,?verbose=3 )一旦訓練完成后,我們可以通過GridSearchCV的best_params_屬性查看搜索到的最佳參數,并使用best_estimator_屬性查看最佳模型:
#?找到最好的參數 grid.best_params_{'C': 1, 'gamma': 0.0001}#?找到最好的模型 grid.best_estimator_SVC(C=1, gamma=0.0001)訓練完成后,現在選擇并采用該網格搜索到的最佳模型,并使用測試集進行預測并創建分類報告和混淆矩陣。
#?使用最好的估計器進行預測 grid_predictions?=?grid.predict(X_test) #?混淆矩陣 from?sklearn.metrics?import?classification_report,?confusion_matrix print(confusion_matrix(y_test,?grid_predictions))[[ 55 5][ 1 110]]#?分類模型報告 print(classification_report(y_test,?grid_predictions))precision recall f1-score support0 0.98 0.92 0.95 601 0.96 0.99 0.97 111accuracy 0.96 171macro avg 0.97 0.95 0.96 171 weighted avg 0.97 0.96 0.96 171隨機搜索
網格搜索嘗試超參數的所有組合,因此增加了計算的時間復雜度,在數據量較大,或者模型較為復雜等等情況下,可能導致不可行的計算成本,這樣網格搜索調參方法就不適用了。然而,隨機搜索提供更便利的替代方案,該方法只測試你選擇的超參數組成的元組,并且超參數值的選擇是完全隨機的,如下圖所示。
隨機搜索嘗試隨機組合這種方法也很常見,所以Scikit-learn在RandomizedSearchCV中內置了這種功能。函數 API 與GridSearchCV類似。
首先指定參數C和gamma以及參數值的候選樣本的分布,如下所示:
import?scipy.stats?as?stats from?sklearn.utils.fixes?import?loguniform#?指定采樣的參數和分布 param_dist?=?{'C':?stats.uniform(0.1,?1e4),'gamma':?loguniform(1e-6,?1e+1), }接下來創建一個RandomizedSearchCV帶參數n_iter_search的對象,并將使用訓練數據來訓練模型。
n_iter_search?=?20 random_search?=?RandomizedSearchCV(?SVC(),?param_distributions=param_dist,?n_iter=n_iter_search,refit=True,?verbose=3)? random_search.fit(X_train,?y_train)輸出示例同樣,一旦訓練完成后,我們可以通過RandomizedSearchCV的best_params_屬性查看搜索到的最佳參數,并使用best_estimator_屬性查看得到的最佳模型:
>>>?random_search.best_params_ {'C':?559.3412579902997,?'gamma':?0.00022332416796205752} >>>?random_search.best_estimator_ SVC(C=559.3412579902997,?gamma=0.00022332416796205752)預測 RandomizedSearchCV 并創建報告。
最后,我們采用最終確定的最佳隨機搜索模型,并使用測試集進行預測,并創建分類報告和混淆矩陣查看模型效果。
#?使用最好的估計器進行預測 random_predictions?=?random_search.predict(X_test)from?sklearn.metrics?import?classification_report,?confusion_matrix #?Confusion?matrics print(confusion_matrix(y_test,?random_predictions))[[ 57 3][ 3 108]]#?分類評價報告 print(classification_report(y_test,?random_predictions))precision recall f1-score support0 0.95 0.95 0.95 601 0.97 0.97 0.97 111accuracy 0.96 171macro avg 0.96 0.96 0.96 171 weighted avg 0.96 0.96 0.96 171貝葉斯搜索
貝葉斯搜索使用貝葉斯優化技術對搜索空間進行建模,以盡快獲得優化的參數值。它使用搜索空間的結構來優化搜索時間。貝葉斯搜索方法使用過去的評估結果來采樣最有可能提供更好結果的新候選參數(如下圖所示)。
貝葉斯搜索Scikit-Optimize[1]庫帶有 BayesSearchCV 實現。
首先指定參數C和gamma以及參數值的候選樣本的分布,如下所示:
from?skopt?import?BayesSearchCV #?參數范圍由下面的一個指定 from?skopt.space?import?Real,?Categorical,?Integer search_spaces?=?{'C':?Real(0.1,?1e+4),'gamma':?Real(1e-6,?1e+1,?'log-uniform'), }接下來創建一個RandomizedSearchCV帶參數n_iter_search的對象,并將使用訓練數據來訓練模型。
n_iter_search?=?20? bayes_search?=?BayesSearchCV(?SVC(),?search_spaces,?n_iter=n_iter_search,?cv=5,?verbose=3? )? bayes_search.fit(X_train,?y_train)同樣,一旦訓練完成后,我們可以通過檢查發現的最佳參數BayesSearchCV的best_params_屬性,并在最佳估計best_estimator_屬性:
bayes_search.best_params_OrderedDict([('C', 0.25624177419852506),('gamma', 0.00016576008531229226)])bayes_search.best_estimator_SVC(C=0.25624177419852506, gamma=0.00016576008531229226)最后,我們采用貝葉斯搜索模型并使用測試集創建一些預測,并為它們創建分類報告和混淆矩陣。
bayes_predictions?=?bayes_search.predict(X_test) from?sklearn.metrics?import?classification_report,confusion_matrix #?混淆矩陣 print(confusion_matrix(y_test,?bayes_predictions))[[ 51 9][ 1 110]]#?分類評價報告 print(classification_report(y_test,?bayes_predictions))precision recall f1-score support0 0.98 0.85 0.91 601 0.92 0.99 0.96 111accuracy 0.94 171macro avg 0.95 0.92 0.93 171 weighted avg 0.94 0.94 0.94 171寫在最后
在本文中,我們介紹了 3 種最流行的超參數優化技術,這些技術用于獲得最佳超參數集,從而訓練穩健的機器學習模型。
一般來說,如果組合的數量足夠有限,我們可以使用網格搜索技術。但是當組合數量增加時,我們應該嘗試隨機搜索或貝葉斯搜索,因為它們在計算上并不昂貴。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載黃海廣老師《機器學習課程》視頻課黃海廣老師《機器學習課程》711頁完整版課件本站qq群554839127,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【机器学习】网格搜索、随机搜索和贝叶斯搜索实用教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVN分支管理最佳策略
- 下一篇: 华医网自动答题小脚本软件,并收集答案保存