機器學習4個常用超參數調試方法!

2021-02-20 天池大數據科研平臺

介紹

維基百科上說,「Hyperparameter optimizationtuning是為學習算法選擇一組最優的hyperparameters的問題」。

ML工作流中最困難的部分之一是為模型找到最好的超參數。ML模型的性能與超參數直接相關。超參數調優的越好,得到的模型就越好。調優超參數可能是非常乏味和困難的,更像是一門藝術而不是科學。

超參數

超參數是在建立模型時用於控制算法行為的參數。這些參數不能從常規訓練過程中獲得。在對模型進行訓練之前,需要對它們進行賦值。

超參數的簡單列表
內容1. 傳統手工搜索

在傳統的調參過程中,我們通過訓練算法手動檢查隨機超參數集,並選擇符合我們目標的最佳參數集。

我們看看代碼:

#importing required libraries
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold , cross_val_score
from sklearn.datasets import load_wine

wine = load_wine()
X = wine.data
y = wine.target

#splitting the data into train and test set
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state = 14)

#declaring parameters grid
k_value = list(range(2,11))
algorithm = ['auto','ball_tree','kd_tree','brute']
scores = []
best_comb = []
kfold = KFold(n_splits=5)

#hyperparameter tunning
for algo in algorithm:
  for k in k_value:
    knn = KNeighborsClassifier(n_neighbors=k,algorithm=algo)
    results = cross_val_score(knn,X_train,y_train,cv = kfold)

    print(f'Score:{round(results.mean(),4)} with algo = {algo} , K = {k}')
    scores.append(results.mean())
    best_comb.append((k,algo))

best_param = best_comb[scores.index(max(scores))]
print(f'\nThe Best Score : {max(scores)}')
print(f"['algorithm': {best_param[1]} ,'n_neighbors': {best_param[0]}]")

缺點

2. 網格搜索

網格搜索是一種基本的超參數調優技術。它類似於手動調優,為網格中指定的所有給定超參數值的每個排列構建模型,評估並選擇最佳模型。考慮上面的例子,其中兩個超參數k_value =[2,3,4,5,6,7,8,9,10] & algorithm =[' auto ', ' ball_tree ', ' kd_tree ', ' brute '],在這個例子中,它總共構建了9*4 = 36不同的模型。

讓我們來了解一下sklearn的GridSearchCV是如何工作的:

from sklearn.model_selection import GridSearchCV

knn = KNeighborsClassifier()
grid_param = { 'n_neighbors' : list(range(2,11)) , 
              'algorithm' : ['auto','ball_tree','kd_tree','brute'] }
              
grid = GridSearchCV(knn,grid_param,cv = 5)
grid.fit(X_train,y_train)

#best parameter combination
grid.best_params_

#Score achieved with best parameter combination
grid.best_score_

#all combinations of hyperparameters
grid.cv_results_['params']

#average scores of cross-validation
grid.cv_results_['mean_test_score']

缺點

由於它嘗試了超參數的每一個組合,並根據交叉驗證得分選擇了最佳組合,這使得GridsearchCV非常慢。

3. 隨機搜索

使用隨機搜索代替網格搜索的動機是,在許多情況下,所有的超參數可能不是同等重要的。隨機搜索從超參數空間中隨機選擇參數組合,參數由n_iter給定的固定迭代次數的情況下選擇。實驗證明,隨機搜索的結果優於網格搜索。

讓我們來了解sklearn的RandomizedSearchCV是如何工作的,

from sklearn.model_selection import RandomizedSearchCV

knn = KNeighborsClassifier()

grid_param = { 'n_neighbors' : list(range(2,11)) , 
              'algorithm' : ['auto','ball_tree','kd_tree','brute'] }

rand_ser = RandomizedSearchCV(knn,grid_param,n_iter=10)
rand_ser.fit(X_train,y_train)

#best parameter combination
rand_ser.best_params_

#score achieved with best parameter combination
rand_ser.best_score_

#all combinations of hyperparameters
rand_ser.cv_results_['params']

#average scores of cross-validation
rand_ser.cv_results_['mean_test_score']

缺點

隨機搜索的問題是它不能保證給出最好的參數組合。

4. 貝葉斯搜索

貝葉斯優化屬於一類優化算法,稱為基於序列模型的優化(SMBO)算法。這些算法使用先前對損失f的觀察結果,以確定下一個(最優)點來抽樣f。該算法大致可以概括如下。

使用先前評估的點X1*:n*,計算損失f的後驗期望。在新的點X的抽樣損失f,從而最大化f的期望的某些方法。該方法指定f域的哪些區域最適於抽樣。

重複這些步驟,直到滿足某些收斂準則。

讓我們用scikit- optimization的BayesSearchCV來理解這

Installation: pip install scikit-optimize

from skopt import BayesSearchCV

import warnings
warnings.filterwarnings("ignore")

# parameter ranges are specified by one of below
from skopt.space import Real, Categorical, Integer

knn = KNeighborsClassifier()
#defining hyper-parameter grid
grid_param = { 'n_neighbors' : list(range(2,11)) , 
              'algorithm' : ['auto','ball_tree','kd_tree','brute'] }

#initializing Bayesian Search
Bayes = BayesSearchCV(knn , grid_param , n_iter=30 , random_state=14)
Bayes.fit(X_train,y_train)

#best parameter combination
Bayes.best_params_

#score achieved with best parameter combination
Bayes.best_score_

#all combinations of hyperparameters
Bayes.cv_results_['params']

#average scores of cross-validation
Bayes.cv_results_['mean_test_score']

另一個實現貝葉斯搜索的類似庫是bayesian-optimization。

Installation: pip install bayesian-optimization

缺點

要在2維或3維的搜索空間中得到一個好的代理曲面需要十幾個樣本,增加搜索空間的維數需要更多的樣本。

總結

在確定參數的最佳組合的保證和計算時間之間總是存在權衡。如果超參數空間(超參數個數)非常大,則使用隨機搜索找到超參數的潛在組合,然後在該局部使用網格搜索(超參數的潛在組合)選擇最優特徵。

相關焦點

  • 機器學習 4 個常用超參數調試方法!
    ML工作流中最困難的部分之一是為模型找到最好的超參數。ML模型的性能與超參數直接相關。超參數調優的越好,得到的模型就越好。調優超參數可能是非常乏味和困難的,更像是一門藝術而不是科學。超參數超參數是在建立模型時用於控制算法行為的參數。這些參數不能從常規訓練過程中獲得。在對模型進行訓練之前,需要對它們進行賦值。內容1.
  • Python 環境下的自動化機器學習超參數調優
    機器學習算法的性能高度依賴於超參數的選擇,對機器學習超參數進行調優是一項繁瑣但卻至關重要的任務。本文介紹了一個使用「Hyperopt」庫對梯度提升機(GBM)進行貝葉斯超參數調優的完整示例,並著重介紹了其實現過程。由於機器學習算法的性能高度依賴於超參數的選擇,對機器學習超參數進行調優是一項繁瑣但至關重要的任務。
  • 在python中使用SageMaker Debugger進行機器學習模型的開發調試
    如:數據集、模型結構、微調過後的模型權重、優化算法及其參數、訓練後的梯度等。在某種意義上,機器學習代碼在訓練階段是「動態的」。因為模型本身是隨著模型訓練而改變或發展的。在訓練過程中,模型中的數百萬個參數或權重每一步都在變化。一旦訓練完成,它就會停止改變,此時,在訓練過程中沒有發現的錯誤現在已經成為模型的一部分。
  • 每個算法人員都應該知道的4個超參數調試方法
    ML工作流中最困難的部分之一是為模型找到最好的超參數。ML模型的性能與超參數直接相關。超參數調優的越好,得到的模型就越好。調優超參數可能是非常乏味和困難的,更像是一門藝術而不是科學。超參數超參數是在建立模型時用於控制算法行為的參數。這些參數不能從常規訓練過程中獲得。在對模型進行訓練之前,需要對它們進行賦值。
  • 交叉驗證和超參數調整:如何優化你的機器學習模型
    隨機森林中超參數的例子有:森林中擁有的決策樹的數量、每次分割時需要考慮的最大特徵數量,或者樹的最大深度。正如我前面提到的,沒有一種萬能的方法可以找到最優超參數。一組超參數可能在一個機器學習問題上表現良好,但在另一個機器學習問題上可能表現不佳。那麼我們怎麼得到最優超參數呢?
  • 初學者必讀:從迭代的五個層面理解機器學習
    你會發現更容易實現的模型改進方法4. 幫助你更容易堅持下去,即使初步結果較差5. 幫助你進一步解決機器學習中更複雜的問題根據經驗,以迭代的角度看機器學習的工作流,能夠幫助初學者了解機器學習背後的概念。所以不用多說,讓我們開始介紹機器學習迭代的 5 個層面吧。
  • 算法模型自動超參數優化方法
    超參數:定義關於模型的更高層次的概念,如複雜性或學習能力不能直接從標準模型培訓過程中的數據中學習,需要預先定義可以通過設置不同的值,訓練不同的模型和選擇更好的測試值來決定參數空間的搜索一般由以下幾個部分構成:Scikit-Learn中的超參數優化方法在機器學習模型中,比如隨機森林中決策樹的個數
  • 基礎| 初學者必讀:從迭代的五個層面理解機器學習
    你會發現更容易實現的模型改進方法4. 幫助你更容易堅持下去,即使初步結果較差5. 幫助你進一步解決機器學習中更複雜的問題根據經驗,以迭代的角度看機器學習的工作流,能夠幫助初學者了解機器學習背後的概念。所以不用多說,讓我們開始介紹機器學習迭代的 5 個層面吧。
  • 基礎 初學者必讀:從迭代的五個層面理解機器學習
    你會發現更容易實現的模型改進方法4. 幫助你更容易堅持下去,即使初步結果較差5. 幫助你進一步解決機器學習中更複雜的問題根據經驗,以迭代的角度看機器學習的工作流,能夠幫助初學者了解機器學習背後的概念。所以不用多說,讓我們開始介紹機器學習迭代的 5 個層面吧。
  • Python 機器學習:超參數調優
    1.什麼是超參數超參數(hyper parameters)就是機器學習或深度學習算法中需要預先設置的參數,這些參數不是通過訓練數據學習到的參數;原始算法一般只給出超參數的取值範圍和含義,根據不同的應用場景,同一個算法的同一超參數設置也不同。那超參數應該如何設置呢?似乎沒有捷徑,去嘗試不同的取值,比較不同的結果取最好的結果。貝葉斯優化(Bayesian optimization)2.
  • 手動搜索超參數的一個簡單方法
    我們並沒有讓模型盲目地嘗試,而是設定了一些超參數。為了解釋超參數,我們可以舉一個孩子在IPad上玩的例子。你不能控制他/她在上面玩什麼或看什麼,但你可以控制孩子在上面花了多少時間。類似地,我們可以調整這些超參數,使模型對特徵進行評級,在此基礎上生成預測結果。
  • 調整超參數:決定模型是「金子」還是「垃圾」!
    通過參數調整,嘗試訓練可能的模型,從中選擇最佳的模型並調試參數。除了特徵工程以外,超參數的選擇也十分重要,它決定你的模型是「金子」還是「垃圾」,以及模型是否處於最優的表現並得到好的結果。,首先要明確參數與超參數的區別:參數:是模型內部的配置變量,在機器學習中生成的。
  • 你可能需要試試這六種調試方法
    如何尋找最優模型超參數。如何安排學習速率以減少過擬合。如何用權重和偏差監測訓練進度。值得注意的是,作為一名數據科學/機器學習實踐者,你需要認識到機器學習項目失敗的原因有很多。大多數與工程師和數據科學家的技能無關(僅僅因為它不起作用並不意味著你有缺陷)。
  • 17個機器學習的常用算法!
    應用場景包括分類和回歸,算法包括一些對常用監督式學習算法的延伸,這些算法首先試圖對未標識數據進行建模,在此基礎上再對標識的數據進行預測。如圖論推理算法(Graph Inference)或者拉普拉斯支持向量機(Laplacian SVM.)等。 4.
  • 深度學習中的超參數優化技術
    設置超參數的過程需要專業知識和廣泛的試驗和錯誤。沒有簡單易行的方法來設置超參數 - 特別是學習率、批量大小、動量和權重衰減。深度學習模型充滿了超參數,在如此高維空間中找到這些參數的最佳配置並不是一項微不足道的挑戰。
  • PID原理和參數調試
    可以通過調整這三個單元的增益Kp,Ki和Kd來調定其特性,PID控制器主要適用於基本上線性,且動態特性不隨時間變化的系統。若定義 {displaystyle u(t)} u(t)為控制輸出,PID算法可以用下式表示:其中Kp:比例增益,是調適參數Ki:積分增益,也是調適參數Kd:微分增益,也是調適參數
  • 機器學習實戰 | 支持向量機·sklearn 參數詳解
    sklearn 提供了很多模型供我們使用,包括以下幾種:可以看到 SVM 在 sklearn 上有三個接口(這裡我只介紹分類方法),分別是 LinearSVC、SVC 和最常用的一般是 SVC 接口。除了特別表明是線性的兩個類 LinearSVC 和 LinearSVR 之外,其他的所有類都是同時支持線性和非線性的。NuSVC 和 NuSVC 可以手動調節支持向量的數目,其他參數都與最常用的 SVC 和 SVR 一致。而 OneClassSVM 則是無監督的類。
  • 機器學習課程教與學(教學大綱和教案)
    具體來講,要使學生理解聚類、回歸、分類、標註相關算法並掌握它們的應用方法;理解概率類模型並掌握它們的應用方法;理解神經網絡類模型並掌握它們的應用方法;理解深度學習模型並掌握它們的應用方法;理解距離度量、模型評價、過擬合、最優化等機器學習基礎知識;掌握特徵工程、降維與超參數調優等機器學習工程應用方法。
  • 機器學習模型評估與超參數調優詳解
    用管道簡化工作流使用k折交叉驗證評估模型性能使用學習和驗證曲線調試算法通過網格搜索進行超參數調優比較不同的性能評估指標一、用管道簡化工作流在很多機器學習算法中,我們可能需要做一系列的基本操作後才能進行建模,如:在建立邏輯回歸之前,我們可能需要先對數據進行標準化
  • 為什麼我們要重視機器學習模型的調試?
    預防和解決此類問題的最佳方法是模型調試。我們將在下面介紹調試方法。如今的調試如何進行?數據科學家至少有四種主要方法來查找ML模型中的錯誤:敏感性分析,殘差分析,基準模型和ML安全審核。儘管我們對每種方法的分析似乎都是技術性的,但我們認為,了解可用的工具以及如何使用它們對於所有風險管理團隊都是至關重要的。任何技術能力的人都應該至少能夠考慮使用模型調試技術。敏感性分析靈敏度分析,有時稱為假設分析?分析,是模型調試的主體。