<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          全面總結(jié)機(jī)器學(xué)習(xí)超參數(shù)調(diào)優(yōu)(附代碼)

          共 61568字,需瀏覽 124分鐘

           ·

          2023-10-05 09:16

          公眾號:尤而小屋
          作者:Peter
          編輯:Peter

          大家好,我是Peter~

          本文的主題:機(jī)器學(xué)習(xí)建模的超參數(shù)調(diào)優(yōu)。開局一張圖:

          a9c7c3a799db579591dc8b9f22df0b8d.webp

          文章很長,建議直接收藏~

          一、什么是機(jī)器學(xué)習(xí)超參數(shù)?

          機(jī)器學(xué)習(xí)超參數(shù)是在開始學(xué)習(xí)過程之前設(shè)置值的參數(shù),而不是通過訓(xùn)練得到的參數(shù)數(shù)據(jù)。

          超參數(shù)是在模型訓(xùn)練之外設(shè)置的選項(xiàng),不會在訓(xùn)練過程中被優(yōu)化或更改。相反,需要在訓(xùn)練之前手動(dòng)設(shè)置它們,并且對模型的性能有很大的影響。

          二、為什么要進(jìn)行機(jī)器學(xué)習(xí)超參數(shù)的調(diào)優(yōu)?

          在機(jī)器學(xué)習(xí)中,通常需要針對特定任務(wù)選擇和調(diào)整超參數(shù)。例如,在支持向量機(jī)(SVM)中,有一個(gè)重要的超參數(shù)是正則化參數(shù)C,它可以控制模型復(fù)雜度并影響模型的泛化能力。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),學(xué)習(xí)率和批次大小也是常見的超參數(shù),它們可以影響模型的收斂速度和最終的預(yù)測效果。

          機(jī)器學(xué)習(xí)超參數(shù)的調(diào)優(yōu)是為了找到一組最佳的超參數(shù)組合,使模型在特定任務(wù)上表現(xiàn)最佳。超參數(shù)的調(diào)優(yōu)對于提高模型性能、防止過擬合、加速收斂等方面都非常重要。

          不同的超參數(shù)組合可以顯著影響模型的性能,因此通過調(diào)優(yōu)來找到最佳的超參數(shù)組合是非常必要的。

          2a5ef511164ace6107557cea1588960e.webp

          下文從網(wǎng)格搜索等直接調(diào)優(yōu)方法、基于Optuna等調(diào)優(yōu)工具、基于AutoML的調(diào)優(yōu)、基于算法的調(diào)優(yōu)等4個(gè)方面進(jìn)行闡述。

          三、超參數(shù)調(diào)優(yōu)方法

          常用的超參數(shù)調(diào)優(yōu)方法有以下幾種:

          • 網(wǎng)格搜索(Grid Search):網(wǎng)格搜索是一種簡單的超參數(shù)調(diào)優(yōu)方法,它通過窮舉指定的參數(shù)組合,計(jì)算每一組參數(shù)在驗(yàn)證集上的表現(xiàn),最終選擇表現(xiàn)最好的參數(shù)組合。
          • 貝葉斯優(yōu)化:貝葉斯優(yōu)化是一種利用貝葉斯定理和最優(yōu)化方法尋找全局最優(yōu)解的優(yōu)化算法,它適用于高維、高成本、有限樣本的優(yōu)化問題。
          • 隨機(jī)搜索(Random Search):隨機(jī)搜索是一種基于隨機(jī)采樣的超參數(shù)調(diào)優(yōu)方法,它通過在參數(shù)空間中隨機(jī)選擇參數(shù)組合,尋找最優(yōu)解。

          3.1 網(wǎng)格搜索Grid Search

          1、什么是網(wǎng)格搜索

          網(wǎng)格搜索(Grid Search)是一種超參數(shù)調(diào)優(yōu)方法,它通過窮舉指定的參數(shù)組合,計(jì)算每一組參數(shù)在驗(yàn)證集上的表現(xiàn),最終選擇表現(xiàn)最好的參數(shù)組合。

          843e179c001245d63419cd833a0148e7.webphttps://pyimagesearch.com/2021/05/24/grid-search-hyperparameter-tuning-with-scikit-learn-gridsearchcv/

          網(wǎng)格搜索是一種簡單而有效的調(diào)優(yōu)方法,常用于確定最佳的超參數(shù)組合。

          2、網(wǎng)格搜索的python實(shí)戰(zhàn)

                
                  from sklearn.model_selection import GridSearchCV  
          from sklearn.svm import SVC  
          from sklearn.datasets import load_iris  
            
          # 加載數(shù)據(jù)集  
          iris = load_iris()  
          X = iris.data  
          y = iris.target  
            
          # 定義模型  
          svm = SVC(kernel='linear', C=100, gamma='auto')  
            
          # 定義網(wǎng)格搜索參數(shù)范圍  
          param_grid = {  
              'C': [0.1110100],  
              'gamma': [1e-31e-21e-11],  
          }  
            
          # 創(chuàng)建網(wǎng)格搜索對象  
          grid_search = GridSearchCV(svm, param_grid, cv=5)  
            
          # 對數(shù)據(jù)進(jìn)行網(wǎng)格搜索  
          grid_search.fit(X, y)  
            
          # 輸出最佳參數(shù)組合和對應(yīng)的得分  
          print('Best parameters:', grid_search.best_params_)  
          print('Best score:', grid_search.best_score_)
          • 使用了Scikit-learn庫中的GridSearchCV類來實(shí)現(xiàn)網(wǎng)格搜索
          • 定義了一個(gè)參數(shù)網(wǎng)格(param_grid),其中包含了C和gamma兩個(gè)超參數(shù)的不同取值組合
          • 創(chuàng)建了一個(gè)GridSearchCV對象,并將參數(shù)網(wǎng)格、SVM模型和交叉驗(yàn)證(cv)參數(shù)傳入
          • 使用best_params_和best_score_屬性輸出最佳參數(shù)組合和對應(yīng)的得分

          3.2隨機(jī)搜索Random Search

          1、什么是隨機(jī)搜索

          隨機(jī)搜索是一種優(yōu)化方法,它通過在允許的范圍內(nèi)隨機(jī)生成點(diǎn)來搜索可能的解決方案,并計(jì)算每個(gè)點(diǎn)的目標(biāo)函數(shù)值。然后,它根據(jù)目標(biāo)函數(shù)值選擇下一個(gè)點(diǎn)進(jìn)行搜索,以逐步接近最優(yōu)解。

          a59dc3a90478bd8241fea86830136ca6.webp

          這種方法適用于處理高維、非線性、非凸或非連續(xù)的優(yōu)化問題,特別是當(dāng)精確解的計(jì)算成本非常高時(shí)。

          2、基于隨機(jī)搜索的python實(shí)戰(zhàn)

                
                  import numpy as np  
          from sklearn.datasets import load_iris  
          from sklearn.ensemble import RandomForestClassifier  
            
          # 加載數(shù)據(jù)集  
          iris = load_iris()  
          X = iris.data  
          y = iris.target  
            
          # 定義隨機(jī)搜索函數(shù)  
          def random_search(X, y, model, param_space, iteration_num):  
              best_score = -1  
              best_params = None  
              for i in range(iteration_num):  
                  # 從參數(shù)空間中隨機(jī)采樣一組超參數(shù)  
                  params = {k: v[np.random.randint(len(v))] for k, v in param_space.items()}  
                  # 訓(xùn)練模型并計(jì)算驗(yàn)證集上的準(zhǔn)確率  
                  model.set_params(**params)  
                  score = model.score(X[:100], y[:100])  
                  # 更新最優(yōu)解  
                  if score > best_score:  
                      best_score = score  
                      best_params = params  
              return best_score, best_params  
            
          # 定義隨機(jī)森林分類器模型  
          model = RandomForestClassifier()  
            
          # 定義超參數(shù)空間  
          param_space = {  
              'n_estimators': [100200300400500],  
              'max_depth': [23456],  
              'max_features': ['auto''sqrt''log2'],  
              'bootstrap': [TrueFalse]  
          }  
            
          # 執(zhí)行隨機(jī)搜索  
          best_score, best_params = random_search(X, y, model, param_space, 100)  
          print('最佳準(zhǔn)確率:', best_score)  
          print('最佳超參數(shù):', best_params)
          • 使用隨機(jī)森林分類器模型,并定義了四個(gè)需要優(yōu)化的超參數(shù):n_estimators、max_depth、max_features和bootstrap
          • 從參數(shù)空間中隨機(jī)采樣100組超參數(shù),然后使用驗(yàn)證集上的準(zhǔn)確率來評估這些超參數(shù)的優(yōu)劣,最終輸出最佳準(zhǔn)確率和對應(yīng)的最佳超參數(shù)

          網(wǎng)格搜索優(yōu)化和隨機(jī)搜索優(yōu)化的對比:

          d94d46687e4e46bdd194cbf28cca937e.webp

          3.3貝葉斯優(yōu)化

          1、什么是貝葉斯優(yōu)化

          貝葉斯優(yōu)化是一種黑盒優(yōu)化算法,用于求解表達(dá)式未知的函數(shù)的極值問題。它基于貝葉斯定理,通過構(gòu)建概率模型來描述目標(biāo)函數(shù)的后驗(yàn)分布,并利用這個(gè)模型來選擇下一個(gè)采樣點(diǎn),以最大化采樣價(jià)值。

          其核心思想是利用高斯過程回歸(Gaussian Process Regression, GPR)來建模目標(biāo)函數(shù)的分布。GPR認(rèn)為目標(biāo)函數(shù)是由一系列訓(xùn)練數(shù)據(jù)點(diǎn)(輸入和輸出)所構(gòu)成的隨機(jī)過程,通過高斯概率模型來描述這個(gè)隨機(jī)過程的概率分布。貝葉斯優(yōu)化通過不斷地添加樣本點(diǎn)來更新目標(biāo)函數(shù)的后驗(yàn)分布,直到后驗(yàn)分布基本貼合真實(shí)分布。

          843048ac14680d3fc692d6caad0210d1.webp

          貝葉斯優(yōu)化有兩個(gè)核心過程:

          • 先驗(yàn)函數(shù)(Prior Function, PF):PF主要利用高斯過程回歸來建模目標(biāo)函數(shù)的先驗(yàn)分布
          • 采集函數(shù)(Acquisition Function, AC):AC主要包括 Expected Improvement(EI)、Probability of Improvement(PI)和 Upper Confidence Bound(UCB)等方法,用于衡量每一個(gè)點(diǎn)對目標(biāo)函數(shù)優(yōu)化的貢獻(xiàn),并選擇下一個(gè)采樣點(diǎn)。

          貝葉斯優(yōu)化在機(jī)器學(xué)習(xí)種被用于AutoML算法,自動(dòng)確定機(jī)器學(xué)習(xí)算法的超參數(shù)。它也是一種全局極值搜索方法,特別適用于高維非線性非凸函數(shù),具有較好的效果和效率。

          貝葉斯優(yōu)化以函數(shù)被視為一個(gè)滿足某種分布的隨機(jī)過程,通過在定義域內(nèi)求函數(shù)值,使用貝葉斯公式更新對分布的估計(jì),然后根據(jù)新的分布找到最可能的極值點(diǎn)位置,從而提高對函數(shù)及其極值的估計(jì)的精確性。

          2、貝葉斯優(yōu)化的python實(shí)戰(zhàn)

                
                  import numpy as np  
          from scipy.optimize import minimize  
          from sklearn.gaussian_process import GaussianProcessRegressor  
          from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C  
            
          # 定義目標(biāo)函數(shù)  
          def f(x):  
              return np.sin(5 * x) + np.cos(x)  
            
          # 定義高斯過程回歸模型  
          kernel = C(1.0, (1e-31e3)) * RBF(10, (1e-21e2))  
          gpr = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)  
            
          # 定義貝葉斯優(yōu)化函數(shù)  
          def bayesian_optimization(X_train, y_train, X_test):  
              # 訓(xùn)練高斯過程回歸模型  
              gpr.fit(X_train, y_train)  
              # 計(jì)算測試集的預(yù)測值和方差  
              y_pred, sigma = gpr.predict(X_test, return_std=True)  
              # 計(jì)算期望改進(jìn)(Expected Improvement)  
              gap = y_pred - f(X_test)  
              improvement = (gap + np.sqrt(sigma ** 2 + 1e-6) * np.abs(gap).mean()) * 0.5  
              # 計(jì)算高斯過程回歸模型的超參數(shù)  
              result = minimize(gpr.kernel_, np.zeros(gpr.kernel_.shape[0]), method='L-BFGS-B')  
              hyperparameters = result.x  
              # 輸出最優(yōu)超參數(shù)和對應(yīng)的期望改進(jìn)值  
              return hyperparameters, improvement.max()  
            
          # 定義貝葉斯優(yōu)化的迭代次數(shù)和采樣點(diǎn)數(shù)量  
          n_iter = 20  
          n_samples = 5  
            
          # 進(jìn)行貝葉斯優(yōu)化  
          results = []  
          for i in range(n_iter):  
              # 在定義域內(nèi)隨機(jī)采樣n_samples個(gè)點(diǎn)  
              X_train = np.random.uniform(-2 * np.pi, 2 * np.pi, (n_samples, 1))  
              y_train = f(X_train)  
              # 進(jìn)行貝葉斯優(yōu)化并記錄最優(yōu)超參數(shù)和對應(yīng)的期望改進(jìn)值  
              result = bayesian_optimization(X_train, y_train, X_test=np.random.uniform(-2 * np.pi, 2 * np.pi, (1001)))  
              results.append(result)  
              print('Iter: {}, Hyperparameters: {:.2f}, Expected Improvement: {:.4f}'.format(i, result[0][0], result[1]))
          • 定義目標(biāo)函數(shù)f
          • 使用高斯過程回歸模型(GPR)來建模目標(biāo)函數(shù)的分布
          • 定義貝葉斯優(yōu)化函數(shù)bayesian_optimization;其中訓(xùn)練集、測試集和采樣點(diǎn)數(shù)作為輸入,輸出最優(yōu)的超參數(shù)和對應(yīng)的期望改進(jìn)值
          • Expected Improvement作為采集函數(shù),通過不斷地添加樣本點(diǎn)來更新目標(biāo)函數(shù)的后驗(yàn)分布,并使用L-BFGS-B方法來最小化高斯過程回歸模型的超參數(shù)

          四、基于超參數(shù)調(diào)優(yōu)工具

          4.1 什么是超參數(shù)優(yōu)化庫?

          超參數(shù)優(yōu)化庫(Hyperparameter Optimization Library)是一種用于自動(dòng)化超參數(shù)優(yōu)化的軟件庫或工具。這些庫使用不同的算法和技術(shù),以實(shí)現(xiàn)自動(dòng)化超參數(shù)搜索和優(yōu)化過程。

          超參數(shù)優(yōu)化庫通常提供易于使用的接口,允許用戶定義要優(yōu)化的超參數(shù)和目標(biāo)函數(shù)。它們使用不同的算法和技術(shù),如網(wǎng)格搜索、隨機(jī)搜索、遺傳算法、貝葉斯優(yōu)化等,以搜索和優(yōu)化超參數(shù)空間。這些庫的目標(biāo)是減少人工調(diào)整超參數(shù)的工作量,提高模型性能,并加速機(jī)器學(xué)習(xí)模型的訓(xùn)練過程。

          4.2 常見的超參數(shù)優(yōu)化工具

          以下是幾個(gè)常用的超參數(shù)優(yōu)化庫:

          • scikit-Opitimize
          • Hyperopt
          • Optuna
          • Spearmint
          • Gaussian Process-based Hyperparameter Optimization (GPGO)
          • Ray Tune
          • GPyOpt
          • SigOpt
          • Keras Tuner

          這些庫都提供了不同的算法和工具,以實(shí)現(xiàn)超參數(shù)優(yōu)化,并具有不同的特點(diǎn)和優(yōu)點(diǎn)。您可以根據(jù)您的需求選擇最適合您的庫。

          4.3Scikit-Optimize庫

          1、Scikit-Optimize庫簡介

          Scikit-optimize 是一個(gè) Python 庫,用于執(zhí)行基于scipy的優(yōu)化算法。它旨在提供一種簡單而有效的工具,用于機(jī)器學(xué)習(xí)和科學(xué)計(jì)算的優(yōu)化問題。Scikit-optimize 提供了許多不同的優(yōu)化算法,包括梯度下降、隨機(jī)搜索、貝葉斯優(yōu)化等。

          cba605e2b6e53f9cdfa423022cd5af21.webp

          Scikit-optimize 提供了許多預(yù)定義的搜索空間和目標(biāo)函數(shù),以便輕松地設(shè)置超參數(shù)優(yōu)化任務(wù)。用戶可以定義自己的搜索空間和目標(biāo)函數(shù),以適應(yīng)特定的機(jī)器學(xué)習(xí)模型和任務(wù)。Scikit-optimize 還提供了可視化工具,可以幫助用戶更好地理解優(yōu)化過程和結(jié)果。

          2、基于python的Scikit-Optimize庫優(yōu)化實(shí)戰(zhàn)

                
                  import numpy as np  
          from sklearn.datasets import load_iris  
          from sklearn.ensemble import RandomForestClassifier  
          from sklearn.model_selection import train_test_split  
          from sklearn.metrics import accuracy_score  
          from skopt import gp_minimize  
            
          # 加載數(shù)據(jù)集  
          iris = load_iris()  
          X = iris.data  
          y = iris.target  
            
          # 劃分訓(xùn)練集和測試集  
          X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
            
          # 定義機(jī)器學(xué)習(xí)模型  
          clf = RandomForestClassifier()  
            
          # 定義搜索空間和目標(biāo)函數(shù)  
          search_space = {  
              'n_estimators': [100200500],  
              'max_depth': [35None],  
              'max_features': ['auto''sqrt''log2']  
          }  
            
          def objective(x):  
              clf.set_params(**{search_space[name]: x[name] for name in x})  
              clf.fit(X_train, y_train)  
              y_pred = clf.predict(X_test)  
              return -accuracy_score(y_test, y_pred)  
            
          # 執(zhí)行優(yōu)化算法  
          res = gp_minimize(objective, search_space, n_calls=20, random_state=42)  
            
          # 輸出最優(yōu)超參數(shù)組合和對應(yīng)的驗(yàn)證準(zhǔn)確率  
          print("Best hyperparameters:", res.x)  
          print("Max validation accuracy:", res.fun)

          4.4  Hyperopt庫

          1、Hyperopt庫簡介

          Hyperopt是一個(gè)Python庫,用于對機(jī)器學(xué)習(xí)模型的算法進(jìn)行智能搜索。它主要使用三種算法:隨機(jī)搜索算法、模擬退火算法和TPE(Tree-structured Parzen Estimator)算法。

          3841558b16e829fbfd63ef05b7599cf9.webp

          安裝Hyperopt庫:可以使用pip命令來安裝Hyperopt庫:

                
                  pip install hyperopt

          使用步驟:

          • 準(zhǔn)備目標(biāo)函數(shù):目標(biāo)函數(shù)應(yīng)該是一個(gè)可優(yōu)化的函數(shù),它接受一個(gè)超參數(shù)列表作為輸入,并返回一個(gè)標(biāo)量值。在Hyperopt中,使用fn來指定目標(biāo)函數(shù)。
          • 定義超參數(shù)搜索空間:使用Hyperopt的hp模塊定義超參數(shù)的搜索空間??梢允褂胔p.choice、hp.uniform等函數(shù)來定義不同類型的超參數(shù)。
          • 使用fmin函數(shù)進(jìn)行優(yōu)化:使用Hyperopt的fmin函數(shù)進(jìn)行優(yōu)化,該函數(shù)接受目標(biāo)函數(shù)、超參數(shù)搜索空間和優(yōu)化算法作為輸入,并返回最佳的超參數(shù)組合。

          官方學(xué)習(xí)地址:https://github.com/hyperopt/hyperopt

          2、基于python優(yōu)化的實(shí)戰(zhàn)案例

                
                  from hyperopt import hp, fmin, tpe  
          from sklearn.datasets import load_iris  
          from sklearn.model_selection import train_test_split  
          from sklearn.svm import SVC  
            
          # 加載數(shù)據(jù)集  
          iris = load_iris()  
          X = iris.data  
          y = iris.target  
            
          # 劃分訓(xùn)練集和測試集  
          X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
            
          # 定義目標(biāo)函數(shù)  
          def objective(params):  
              clf = SVC(kernel=params['kernel'], C=params['C'], gamma=params['gamma'])  
              clf.fit(X_train, y_train)  
              score = clf.score(X_test, y_test)  
              return -score  # 因?yàn)镠yperopt需要最小化目標(biāo)函數(shù),所以我們需要將準(zhǔn)確率取反  
            
          # 定義超參數(shù)搜索空間  
          space = {  
              'kernel': hp.choice('kernel', ['linear''poly''rbf''sigmoid']),  
              'C': hp.uniform('C'0.00110),  
              'gamma': hp.uniform('gamma'0.00110)  
          }  
            
          # 使用貝葉斯優(yōu)化進(jìn)行超參數(shù)搜索  
          best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=100)  
          print('Best parameters: ', best)

          4.5 Optuna庫

          1、Optuna庫簡介

          Optuna是一個(gè)用于超參數(shù)優(yōu)化的庫,它支持定義目標(biāo)函數(shù),搜索超參數(shù)空間并自動(dòng)進(jìn)行優(yōu)化。

          ac32e369da39da63035ccac7a9092104.webp

          可以使用pip命令來安裝Optuna庫:

                
                  pip install Optuna

          使用步驟:

          • 定義搜索空間:使用Optuna提供的分布函數(shù)來定義超參數(shù)的搜索空間。例如,對于一個(gè)取值范圍為[0, 1]的浮點(diǎn)數(shù),可以使用uniform函數(shù)來定義該超參數(shù)的搜索空間。
          • 定義目標(biāo)函數(shù):目標(biāo)函數(shù)是需要優(yōu)化的模型,可以是任何可調(diào)用對象,如Python函數(shù)、類方法等。目標(biāo)函數(shù)的輸入是超參數(shù)的值,輸出是模型的性能指標(biāo)。
          • 創(chuàng)建Optuna試驗(yàn):創(chuàng)建Optuna試驗(yàn)對象,并指定目標(biāo)函數(shù)和搜索算法。
          • 運(yùn)行Optuna試驗(yàn):運(yùn)行Optuna試驗(yàn),進(jìn)行超參數(shù)搜索。在每次試驗(yàn)結(jié)束后,Optuna會更新超參數(shù)的取值,并記錄當(dāng)前試驗(yàn)的性能指標(biāo)。可以設(shè)置嘗試的次數(shù)或時(shí)間,來控制搜索空間的大小和搜索時(shí)間的限制。
          • 分析試驗(yàn)結(jié)果:在試驗(yàn)結(jié)束后,可以使用Optuna提供的可視化工具來分析試驗(yàn)結(jié)果,并選擇最優(yōu)的超參數(shù)組合。

          2、基于python的使用案例

                
                  import numpy as np  
          from sklearn.datasets import make_regression  
          from sklearn.model_selection import train_test_split  
          from sklearn.linear_model import SGDRegressor  
            
          # 生成數(shù)據(jù)集  
          X, y = make_regression(n_samples=100, n_features=1, noise=0.1)  
          X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
            
          # 定義目標(biāo)函數(shù)  
          def objective(trial):  
              # 定義超參數(shù)  
              learning_rate = trial.suggest_float('learning_rate'1e-101e-5)  
              batch_size = trial.suggest_int('batch_size'32256)  
              optimizer = trial.suggest_categorical('optimizer', ['sgd''adam'])  
            
              # 創(chuàng)建模型  
              model = SGDRegressor(learning_rate=learning_rate, batch_size=batch_size, optimizer=optimizer)  
            
              # 訓(xùn)練模型  
              model.fit(X_train, y_train)  
            
              # 計(jì)算性能指標(biāo)  
              loss = np.mean((model.predict(X_test) - y_test) ** 2)  
              return loss

          # 創(chuàng)建Optuna的study對象,并指定需要優(yōu)化的目標(biāo)函數(shù)和搜索空間
          import optuna  
          study = optuna.create_study()  
          study.optimize(objective, n_trials=100)

          # 最佳的超參數(shù)組合
          print(study.best_params)  # 輸出最佳的超參數(shù)組合  
          print(study.best_value)   # 輸出最佳的性能指標(biāo)值

          4.6Spearmint庫

          1、Spearmint庫簡介

          Spearmint是一個(gè)用于優(yōu)化貝葉斯推斷的庫。它基于論文《實(shí)用貝葉斯優(yōu)化》中概述的算法。該庫可用于執(zhí)行貝葉斯優(yōu)化,這是一種用于全局優(yōu)化的算法,主要用于尋找最小化目標(biāo)函數(shù)的配置。(建議少使用)

          54df0dad0845710ffecf5dc2e8d44523.webp

          https://github.com/JasperSnoek/spearmint

          Spearmint庫提供了一種表達(dá)和優(yōu)化貝葉斯推斷問題的方式。它允許用戶定義目標(biāo)函數(shù)以及用于描述優(yōu)化問題的約束和邊界。庫中的核心算法則負(fù)責(zé)根據(jù)這些定義來優(yōu)化目標(biāo)函數(shù)。Spearmint庫的優(yōu)點(diǎn)包括:

          • 靈活的目標(biāo)函數(shù)表達(dá):Spearmint支持多種類型的數(shù)據(jù)和復(fù)雜的模型結(jié)構(gòu),使得用戶可以靈活地表達(dá)各種目標(biāo)函數(shù)。
          • 高性能:Spearmint通過高效的實(shí)現(xiàn)和優(yōu)化算法來提高運(yùn)行速度,從而能夠處理大規(guī)模的數(shù)據(jù)集和復(fù)雜的模型。
          • 易于使用:Spearmint提供了簡單易用的接口,使得用戶可以輕松地配置和運(yùn)行優(yōu)化任務(wù)。
          • 社區(qū)支持:Spearmint是由一個(gè)活躍的社區(qū)支持的開源項(xiàng)目,這意味著用戶可以獲得來自其他開發(fā)者的反饋和支持。

          2、基于Spearmint的實(shí)戰(zhàn)案例

                
                  import numpy as np  
          import spearmint as sp  
          from scipy.stats import norm  
            
          # 定義目標(biāo)函數(shù)  
          def objective(x):  
              # 假設(shè)目標(biāo)函數(shù)是一個(gè)簡單的二次函數(shù),其中x是一個(gè)向量  
              return x[0]**2 + x[1]**2  
            
          # 定義Spearmint的優(yōu)化器  
          spearmint = sp.Spearmint()  
            
          # 設(shè)置要優(yōu)化的參數(shù)范圍  
          var_names = ['var1''var2']  
          bounds = [[-55], [-55]]  
          priors = [sp.priors.NormalPrior(01), sp.priors.NormalPrior(01)]  
            
          # 運(yùn)行貝葉斯優(yōu)化,設(shè)置最大迭代次數(shù)為10次  
          results = spearmint.optimize(objective, var_names, bounds, priors, n_iter=10)  
            
          # 輸出最優(yōu)的參數(shù)組合和對應(yīng)的函數(shù)值  
          print('最優(yōu)參數(shù)組合:', results.x)  
          print('最優(yōu)函數(shù)值:', results.func)

          4.7GPGO庫

          1、GPGO簡介

          GPGO全稱是Gaussian Process Optimization for Hyperparameters Optimization,是Google的超參數(shù)優(yōu)化庫,它使用Gaussian Processes(高斯過程)進(jìn)行超參數(shù)優(yōu)化,專為TensorFlow和Keras而設(shè)計(jì)。

          高斯過程是一種強(qiáng)大的非參數(shù)貝葉斯模型,它為超參數(shù)優(yōu)化提供了一種概率框架,可以自動(dòng)管理探索與利用的權(quán)衡。

          使用之前先安裝:

                
                  pip install gpgo

          使用步驟:

          • 首先,需要定義要優(yōu)化的目標(biāo)函數(shù)(例如,神經(jīng)網(wǎng)絡(luò)的訓(xùn)練損失)。
          • 其次,需要定義搜索空間,即超參數(shù)的可能取值范圍。
          • 然后,使用GPGO運(yùn)行優(yōu)化過程。在每次迭代中,優(yōu)化器會選擇一組超參數(shù),并使用目標(biāo)函數(shù)評估該組超參數(shù)的性能。
          • 最后,優(yōu)化器會根據(jù)評估結(jié)果更新其關(guān)于最佳超參數(shù)的信念,并繼續(xù)搜索,直到達(dá)到預(yù)設(shè)的終止條件(例如,達(dá)到最大迭代次數(shù)或找到滿意的超參數(shù)組合)。

          2、python實(shí)戰(zhàn)案例

                
                  import numpy as np  
          import tensorflow as tf  
          from tensorflow.keras.datasets import mnist  
          from tensorflow.keras.models import Sequential  
          from tensorflow.keras.layers import Dense, Flatten  
          from gpgo import GPGO  
            
          # 加載MNIST數(shù)據(jù)集
          (x_train, y_train), (x_test, y_test) = mnist.load_data()  
          # 數(shù)據(jù)縮放
          x_train = x_train / 255.0  
          x_test = x_test / 255.0  
            
          # 1-定義神經(jīng)網(wǎng)絡(luò)模型  
          model = Sequential([  
              Flatten(input_shape=(2828)),  
              Dense(128, activation='relu'),  
              Dense(64, activation='relu'),  
              Dense(10)  
          ])  
            
          #2- 定義優(yōu)化目標(biāo)函數(shù)(即神經(jīng)網(wǎng)絡(luò)的訓(xùn)練損失)  
          def loss_fn(y_true, y_pred):  
              return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_pred))  
            
          # 3-定義優(yōu)化器并設(shè)置超參數(shù)的搜索空間  
          optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4)  
          hyperparams = {  
              'kernel__lgcp': [51020],  
              'kernel__scale': [1e-41e-31e-2],  
              'kernel__lengthscale': [1.5.10.]  
          }  
            
          # 4-創(chuàng)建GPGO優(yōu)化器并運(yùn)行優(yōu)化過程  
          gpgo = GPGO(optimizer=optimizer, loss_fn=loss_fn, hyperparams=hyperparams, datasets=(x_train, y_train), epochs=10)  
          best_params, best_loss = gpgo.run()
          • 加載MNIST數(shù)據(jù)集并定義了一個(gè)簡單的神經(jīng)網(wǎng)絡(luò)模型
          • 定義了優(yōu)化目標(biāo)函數(shù),即神經(jīng)網(wǎng)絡(luò)的訓(xùn)練損失
          • 創(chuàng)建了一個(gè)GPGO優(yōu)化器,并將超參數(shù)的搜索空間傳遞給它
          • 使用 run 方法運(yùn)行優(yōu)化過程,并輸出最佳超參數(shù)和最低的訓(xùn)練損失

          4.8Ray Tune庫

          1、簡介

          Ray Tune是Ray的一個(gè)超參數(shù)優(yōu)化庫,可以用于優(yōu)化深度學(xué)習(xí)模型的性能。它基于Scikit-learn和Google Vizier的接口,并提供了簡單易用的API來定義和運(yùn)行超參數(shù)搜索實(shí)驗(yàn)。

          416625a03962a049003cd814dbd8e6c9.webp

          Ray Tune的特性包括:

          • 支持多種超參數(shù)優(yōu)化算法,如網(wǎng)格搜索、隨機(jī)搜索和貝葉斯優(yōu)化等。
          • 可以自動(dòng)管理實(shí)驗(yàn)的進(jìn)度和結(jié)果,提供清晰的可視化界面。
          • 可以輕松擴(kuò)展到分布式環(huán)境,支持多節(jié)點(diǎn)并行超參數(shù)搜索。
          • 與Ray框架無縫集成,可以輕松擴(kuò)展到其他Ray任務(wù)中。

          官方學(xué)習(xí)地址:https://docs.ray.io/en/latest/tune/index.html

          2、官網(wǎng)提供的優(yōu)化實(shí)戰(zhàn)案例:

                
                  from ray import tune

          def objective(config):  # 1-定義目標(biāo)優(yōu)化函數(shù)
              score = config["a"] ** 2 + config["b"]
              return {"score": score}

          search_space = {  # 2-定義超參數(shù)搜索空間
              "a": tune.grid_search([0.0010.010.11.0]),
              "b": tune.choice([123]),
          }

          tuner = tune.Tuner(objective, param_space=search_space)  # 3-執(zhí)行搜索過程
          results = tuner.fit()
          print(results.get_best_result(metric="score", mode="min").config)  # 最佳超參數(shù)組合

          4.9 Bayesian Optimization庫

          1、簡介

          Bayesian optimization,也稱為Bayesian experimental design或sequential design,是一種使用貝葉斯推理和高斯過程(Gaussian process)的全局優(yōu)化技術(shù)。它是一種在盡可能少的迭代次數(shù)內(nèi)找到一個(gè)未知函數(shù)的最大值或最小值的方法,特別適合優(yōu)化高成本函數(shù)或在勘探和開發(fā)之間需要平衡的情況。

          官方學(xué)習(xí)地址:https://github.com/bayesian-optimization/BayesianOptimization

          d76bef572920393a2a7c40c0655b44c1.webp

          先安裝:

                
                  pip install bayesian-optimization

          2、python實(shí)戰(zhàn)案例

                
                  import numpy as np  
          from sklearn.gaussian_process import GaussianProcessRegressor  
          from scipy.optimize import minimize  
            
          # 定義目標(biāo)函數(shù)  
          def target_function(x):  
              return np.sin(5 * x) + np.cos(2 * x) + np.random.normal(00.1, size=x.shape)  
            
          # 定義高斯過程模型  
          def gpr_model(X, y):  
              kernel = 1.0 * np.eye(X.shape[0]) + 0.5 * np.ones((X.shape[0], X.shape[0]))  
              gpr = GaussianProcessRegressor(kernel=kernel)  
              gpr.fit(X, y)  
              return gpr  
            
          # 定義Bayesian Optimization函數(shù)  
          def bayesian_optimization(n_iterations, n_initial_points):  
              # 初始化數(shù)據(jù)點(diǎn)  
              x_initial = np.random.uniform(-55, n_initial_points)  
              y_initial = target_function(x_initial)  
            
              # 初始化高斯過程模型  
              X_train = np.vstack((x_initial, x_initial))  
              y_train = np.vstack((y_initial, y_initial))  
              gpr = gpr_model(X_train, y_train)  
            
              # 進(jìn)行n_iterations次迭代  
              for i in range(n_iterations):  
                  # 使用EI策略選擇新的數(shù)據(jù)點(diǎn)  
                  acquisition_func = gpr.predictive_mean + np.sqrt(gpr.predictive_covariance(x_initial)[:, NoneNone]) * np.random.randn(*x_initial.shape)  
                  EI = -gpr.negative_log_predictive_density(y_initial, acquisition_func)  
                  x_new = x_initial[np.argmax(EI)]  
                  y_new = target_function(x_new)  
                  
                  X_train = np.vstack((X_train, x_new))  
                  y_train = np.vstack((y_train, y_new)) 
                  
                  gpr = gpr_model(X_train, y_train)  
                  
                  x_initial = np.vstack((x_initial, x_new))  
                  y_initial = np.vstack((y_initial, y_new)) 
                  
                  print("Iteration {}: Best value = {} at x = {}".format(i+1, np.min(y_initial), np.argmin(y_initial)))  
              return x_initial[np.argmin(y_initial)], np.min(y_initial)  
            
          # 運(yùn)行Bayesian Optimization函數(shù)并輸出結(jié)果  
          best_x, best_y = bayesian_optimization(n_iterations=10, n_initial_points=3)  
          print("Best x = {}, best y = {}".format(best_x, best_y))
          • 定義了一個(gè)目標(biāo)函數(shù) target_function ,該函數(shù)是一個(gè)帶有隨機(jī)噪聲的正弦和余弦函數(shù)的組合;
          • 定義了一個(gè)高斯過程模型 gpr_model ,該模型使用一個(gè)常數(shù)核來構(gòu)建高斯過程;
          • 定義了一個(gè) bayesian_optimization 函數(shù),該函數(shù)使用貝葉斯優(yōu)化算法來找到目標(biāo)函數(shù)的最大值;
          • 最后調(diào)用 bayesian_optimization 函數(shù)并輸出結(jié)果

          4.9GPyOpt庫

          1、簡介

          GPyOpt是一個(gè)基于GPy的Python庫,用于實(shí)現(xiàn)貝葉斯優(yōu)化。它提供了靈活的框架,可以處理具有各種類型代理模型(如高斯過程和隨機(jī)森林)的優(yōu)化問題。

          168137378d5ed7e69b29899ca5eb8479.webp

          GPyOpt庫旨在解決實(shí)際問題,包括但不限于函數(shù)優(yōu)化、超參數(shù)優(yōu)化、深度學(xué)習(xí)中的模型調(diào)參等。使用者可以根據(jù)需要自定義代理模型,并且能夠方便地與第三方庫集成。此外,GPyOpt支持多種優(yōu)化算法,如貝葉斯優(yōu)化、粒子群優(yōu)化等,以滿足不同應(yīng)用場景的需求。

          官方學(xué)習(xí)地址:https://sheffieldml.github.io/GPyOpt/

          直接使用pip進(jìn)行安裝:

                
                  pip install gpyopt

          基于源碼的安裝:

                
                  
                    # git clone https://github.com/SheffieldML/GPyOpt.git
                    
          # cd GPyOpt
          # git checkout devel
          # nosetests GPyOpt/testing

          3個(gè)主要依賴包的版本要求:

          • GPy (>=1.0.8)
          • numpy (>=1.7)
          • scipy (>=0.16)

          2、基于python的使用案例

          使用GPyOpt庫來解決一個(gè)簡單的函數(shù)優(yōu)化問題:嘗試找到函數(shù)的最大值

                
                  import numpy as np  
          from gpyopt import Optimizer  
            
          # 定義目標(biāo)函數(shù)  
          def f(x):  
              return -x**2  
            
          # 定義初始點(diǎn)  
          x0 = np.array([0.0])  
          # 定義優(yōu)化器  
          optimizer = Optimizer(f=f, x0=x0)  
          # 設(shè)置優(yōu)化選項(xiàng)  
          optimizer.set_verbose(True)  # 設(shè)置是否輸出優(yōu)化信息  
          optimizer.set_stop_condition(stop='max_iter', value=100)  # 設(shè)置最大迭代次數(shù)和停止條件  
            
          # 運(yùn)行優(yōu)化  
          optimizer.optimize()  
            
          # 輸出結(jié)果  
          print('最優(yōu)解:', optimizer.x_opt)  
          print('最優(yōu)值:', optimizer.f_opt)

          4.10SigOpt庫

          1、簡介

          SigOpt超參數(shù)優(yōu)化庫是一個(gè)用于優(yōu)化機(jī)器學(xué)習(xí)模型的軟件庫。SigOpt的優(yōu)化算法使用貝葉斯優(yōu)化,這是一種用于尋找全局最優(yōu)的優(yōu)化算法,通常用于尋找深度學(xué)習(xí)模型中的最佳超參數(shù)組合。

          3533889e8b481f0c8d9a07790ac7497d.webp

          SigOpt的API使得調(diào)整模型超參數(shù)變得容易,并且可以與許多不同的機(jī)器學(xué)習(xí)庫(包括TensorFlow、PyTorch、Scikit-learn等)集成。SigOpt還提供了一個(gè)可視化界面,可以幫助用戶監(jiān)控和調(diào)整優(yōu)化過程。通過使用SigOpt,開發(fā)人員可以更快地找到最佳超參數(shù)組合,提高模型的性能和準(zhǔn)確性。

          官方學(xué)習(xí)地址:https://docs.sigopt.com/intro/main-concepts

          基于pip的安裝:

                
                  pip install sigopt  

          2、基于python的實(shí)戰(zhàn)案例

                
                  import torch  
          import torch.nn as nn  
          from torch.utils.data import DataLoader  
          from torchvision import datasets, transforms
          # 優(yōu)化相關(guān)
          import sigopt  
          from sigopt.api import create_run  
          from sigopt.config import get_version_id  
          from sigopt.local import local_experiment  
          from sigopt.run import run_fn, get_default_args, get_default_config, get_default_options, get_default_suggestion_callback, run_in_notebook, run_in_script, run_in_jupyter_notebook   # 用于定義運(yùn)行函數(shù)和運(yùn)行環(huán)境  
          from sigopt.suggestion import get_suggestion, get_suggestion_from_web  # 用于獲取建議的超參數(shù)值


          # 定義學(xué)習(xí)率和批量大小
          space = {  
            "learning_rate": (1e-51e-2"log-uniform"),  
            "batch_size": (32256"uniform")  
          }

          # 定義基于pytorch的深度學(xué)習(xí)模型
          class SimpleModel(nn.Module):  
            def __init__(self):  
              super(SimpleModel, self).__init__()  
              self.fc = nn.Linear(78410)  
                
            def forward(self, x):  
              x = x.view(-1784)  
              x = self.fc(x)  
              return x

          # 加載mnist數(shù)據(jù)集
          transform = transforms.Compose([  
            transforms.ToTensor(),    # 轉(zhuǎn)成張量
            transforms.Normalize((0.1307,), (0.3081,))  # 數(shù)據(jù)標(biāo)準(zhǔn)化  
          ])  
          train_dataset = datasets.MNIST(root="data", train=True, transform=transform, download=True)  
          train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)

          # 優(yōu)化過程
          def objective(config):  # 定義優(yōu)化目標(biāo)函數(shù),即模型的準(zhǔn)確率  
            model = SimpleModel()  # 創(chuàng)建模型實(shí)例  
            optimizer = torch.optim.Adam(model.parameters(), lr=config["learning_rate"])  # 創(chuàng)建優(yōu)化器并設(shè)置學(xué)習(xí)率  
            criterion = nn.CrossEntropyLoss()  # 創(chuàng)建損失函數(shù)  
            train_loss = 0.0  
            correct = 0.0  
            total = 0.0  
            for i, data in enumerate(train_loader, 0):  # 對訓(xùn)練集進(jìn)行迭代,計(jì)算損失和準(zhǔn)確率  
              inputs, labels = data  # 獲取輸入和標(biāo)簽數(shù)據(jù)  
              optimizer.zero_grad()  # 清零梯度緩存  
              outputs = model(inputs)  # 前向傳播,計(jì)算輸出張量  
              loss = criterion(outputs, labels)  # 計(jì)算損失張量  
              loss.backward()  # 反向傳播,計(jì)算梯度張量并更新權(quán)重參數(shù)  
              train_loss += loss.item()  # 累加損失值并計(jì)算平均損失值和準(zhǔn)確率 
              
              _, predicted = torch.max(outputs.data, 1)  # 找到最大概率的標(biāo)簽作為預(yù)測結(jié)果并計(jì)算準(zhǔn)確率  
              total += labels.size(0)  # 累加樣本數(shù)以計(jì)算總體準(zhǔn)確率  
              correct += predicted.eq(labels.data).cpu().sum()  # 累加正確預(yù)測的樣本數(shù)并計(jì)算準(zhǔn)確率  
            accuracy = correct / total  # 計(jì)算總體準(zhǔn)確率并返回給優(yōu)化器作為目標(biāo)函數(shù)值  
            return accuracy, {"learning_rate": config["learning_rate"], "batch_size": config["batch_size"]}  # 將目標(biāo)函數(shù)值和超參數(shù)值返回給優(yōu)化器

          4.11Keras Tuner

          KerasTuner是一個(gè)易于使用的分布式超參數(shù)優(yōu)化框架,能夠解決執(zhí)行超參數(shù)搜索時(shí)的一些痛點(diǎn)。它利用高級搜索和優(yōu)化方法,如HyperBand搜索和貝葉斯優(yōu)化,來幫助找到最佳的神經(jīng)網(wǎng)絡(luò)超參數(shù)。

          6d9718561e6f68318752ef00d6fe3bd5.webp

          安裝命令:

                
                  pip install keras-tuner --upgrade

          官方學(xué)習(xí)地址:https://keras.io/keras_tuner/

          2、實(shí)戰(zhàn)案例

                
                  import keras_tuner
          from tensorflow import keras

          # 定義網(wǎng)絡(luò)模型
          def build_model(hp):
              model = keras.Sequential()
              model.add(keras.layers.Dense(
                  hp.Choice("units", [8,16,32]),
                  activation="relu"
              ))
              model.add(keras.layers.Dense(1,activation="relu"))
              model.compile(loss="mse")
              return model

          tuner = keras_tuner.RandomSearch(
              build_model,
              objective="val_loss",
              max_trials=5
          )

          tuner.search(x_train, y_train, epochs=5, validation_data=(x_val, y_val))

          完整案例:https://www.analyticsvidhya.com/blog/2021/06/tuning-hyperparameters-of-an-artificial-neural-network-leveraging-keras-tuner/

          五、基于AutoML庫的超參數(shù)調(diào)優(yōu)

          5.1什么是AutoML庫

          自動(dòng)化機(jī)器學(xué)習(xí)庫(AutoML)是一種軟件工具或庫,旨在自動(dòng)化機(jī)器學(xué)習(xí)工作流程。這些庫使用不同的算法和技術(shù),以實(shí)現(xiàn)自動(dòng)化機(jī)器學(xué)習(xí)任務(wù)的過程,包括數(shù)據(jù)預(yù)處理、特征選擇、模型選擇、參數(shù)優(yōu)化、模型評估等。

          AutoML的目的是簡化機(jī)器學(xué)習(xí)的過程,使非專業(yè)人士也可以應(yīng)用機(jī)器學(xué)習(xí),或者幫助專業(yè)人士更高效地處理機(jī)器學(xué)習(xí)任務(wù)。這些庫通常提供易于使用的接口,并且能夠處理大規(guī)模的數(shù)據(jù)集。

          5.2常見的自動(dòng)化機(jī)器學(xué)習(xí)庫

          自動(dòng)化機(jī)器學(xué)習(xí)庫有以下幾種:

          • Auto-Sklearn。Auto-Sklearn是基于scikit-learn軟件包構(gòu)建的開源AutoML庫。它為給定的數(shù)據(jù)集找到最佳性能的模型以及最佳的超參數(shù)集。它包括一些特征工程技術(shù),例如單點(diǎn)編碼,特征歸一化,降維等。該庫適用于中小型數(shù)據(jù)集,不適用大型數(shù)據(jù)集。

          • H2O AutoML。H2O AutoML是一個(gè)完整的端到端的機(jī)器學(xué)習(xí)自動(dòng)化工具,可以處理各種類型的數(shù)據(jù)集,包括小數(shù)據(jù)和大數(shù)據(jù),標(biāo)準(zhǔn)數(shù)據(jù)和非標(biāo)準(zhǔn)數(shù)據(jù)。它實(shí)現(xiàn)了整個(gè)機(jī)器學(xué)習(xí)流程的自動(dòng)化,包括數(shù)據(jù)準(zhǔn)備,模型選擇,特征選擇,模型優(yōu)化等。

          • Auto-Keras。Auto-Keras是一個(gè)基于Keras深度學(xué)習(xí)框架的自動(dòng)機(jī)器學(xué)習(xí)庫。它旨在為深度學(xué)習(xí)模型提供高度自動(dòng)化的設(shè)計(jì)和訓(xùn)練流程,以解決用戶在面對不同任務(wù)時(shí)可能需要重復(fù)編寫大量代碼的問題。

          • AutoGluon。AutoGluon是一個(gè)開源的深度學(xué)習(xí)自動(dòng)機(jī)器學(xué)習(xí)庫,由AWS團(tuán)隊(duì)開發(fā)和維護(hù)。它旨在幫助開發(fā)者自動(dòng)完成機(jī)器學(xué)習(xí)的所有過程,包括數(shù)據(jù)預(yù)處理、特征工程、模型選擇和超參數(shù)調(diào)整等。AutoGluon使用了一種稱為“神經(jīng)架構(gòu)搜索”的技術(shù)來自動(dòng)化地選擇最佳的模型架構(gòu)。

          • Pycaret。PyCaret 是一個(gè)開源的、低代碼的機(jī)器學(xué)習(xí)庫,旨在簡化機(jī)器學(xué)習(xí)工作流并提高工作效率。它是一個(gè) Python 庫,封裝了多個(gè)流行的機(jī)器學(xué)習(xí)庫和框架,如 scikit-learn、XGBoost、LightGBM、CatBoost、spaCy、Optuna、Hyperopt、Ray 等。PyCaret 還提供了一套簡單易用的 API,可以幫助你完成各種機(jī)器學(xué)習(xí)任務(wù),包括數(shù)據(jù)預(yù)處理、模型訓(xùn)練、評估和部署等。

          • MLBox。MLBox是一個(gè)功能強(qiáng)大的自動(dòng)化機(jī)器學(xué)習(xí)庫,旨在為機(jī)器學(xué)習(xí)工程師和研究者提供一站式的機(jī)器學(xué)習(xí)解決方案。它是由國內(nèi)的一家公司開發(fā)的,封裝了多種流行的機(jī)器學(xué)習(xí)算法和框架,如scikit-learn、XGBoost、LightGBM、CatBoost、spaCy、Optuna、Hyperopt、Ray等,并將它們整合到一個(gè)統(tǒng)一的框架中,提供了簡單易用的API,使得機(jī)器學(xué)習(xí)的流程變得更加高效和便捷。

          • Auto-PyTorch。Auto-PyTorch是一個(gè)基于PyTorch的自動(dòng)機(jī)器學(xué)習(xí)庫。它旨在為超參數(shù)搜索和模型選擇提供自動(dòng)化的解決方案,以幫助用戶在訓(xùn)練深度學(xué)習(xí)模型時(shí)提高效率和準(zhǔn)確性。

          5.3Auto-Sklearn

          1、簡介

          Auto-Sklearn是一個(gè)開源的AutoML庫,它利用流行的Scikit-Learn機(jī)器學(xué)習(xí)庫進(jìn)行數(shù)據(jù)轉(zhuǎn)換和機(jī)器學(xué)習(xí)算法。Auto-Sklearn是由Matthias Feurer等人開發(fā)的。在他們的2015年題為“efficient and robust automated machine learning”的論文中進(jìn)行了描述。

          2aa0494a51e21eda547e838e3d097b98.webp

          Auto-Sklearn通過元學(xué)習(xí)(meta-learning)或梯度增強(qiáng)來自動(dòng)選擇最佳的學(xué)習(xí)算法及其超參數(shù)。它還可以自動(dòng)調(diào)整模型的復(fù)雜性和集成度,以及執(zhí)行數(shù)據(jù)預(yù)處理和后處理。

          安裝命令:

                
                  pip install -i https://pypi.tuna.tsinghua.edu.cn/simple auto-sklearn

          官方學(xué)習(xí)地址:https://automl.github.io/auto-sklearn/master/

          2、案例學(xué)習(xí)

                
                  import autosklearn.classification  # 基于自動(dòng)化機(jī)器學(xué)習(xí)庫的分類模型
          import sklearn.model_selection
          import sklearn.datasets
          import sklearn.metrics

          if __name__ == "__main__":
              X, y = sklearn.datasets.load_digits(return_X_y=True)
              # 數(shù)據(jù)切分
              X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, random_state=1)
              # 基于自動(dòng)化機(jī)器學(xué)習(xí)庫的分類模型
              automl = autosklearn.classification.AutoSklearnClassifier()
              # 模型訓(xùn)練和預(yù)測
              automl.fit(X_train, y_train)
              y_hat = automl.predict(X_test)
              print("Accuracy score", sklearn.metrics.accuracy_score(y_test, y_hat))

          5.4H2O AutoML

          1、簡介

          H2O AutoML是一款由H2O.ai開發(fā)的自動(dòng)化機(jī)器學(xué)習(xí)工具。它通過自動(dòng)化機(jī)器學(xué)習(xí)領(lǐng)域中的流程和技術(shù),使得數(shù)據(jù)分析師和科學(xué)家們能夠更快、更容易地構(gòu)建高質(zhì)量的預(yù)測模型。

          a692182f28fc2a47b31bf4754e2cf8cb.webp

          H2O AutoML支持多種算法和模型選擇,包括基于樹的方法、線性模型和深度學(xué)習(xí)模型等。該工具還提供了自動(dòng)特征工程、模型交叉驗(yàn)證和超參數(shù)優(yōu)化等功能,可以幫助用戶自動(dòng)地進(jìn)行數(shù)據(jù)清洗、特征工程、模型選擇和調(diào)優(yōu)等過程,從而提高模型的準(zhǔn)確性和效率。

          官網(wǎng)學(xué)習(xí)地址:https://docs.h2o.ai/h2o/latest-stable/h2o-docs/automl.html

          2、使用案例

                
                  import h2o
          from h2o.automl import H2OAutoML

          # 啟動(dòng)H2O
          h2o.init()

          # 導(dǎo)入一個(gè)二分類數(shù)據(jù)集
          train = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_train_10k.csv")
          test = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_test_5k.csv")

          x = train.columns
          y = "response"
          x.remove(y)

          # 轉(zhuǎn)成向量
          train[y] = train[y].asfactor()
          test[y] = test[y].asfactor()

          # 訓(xùn)練模型:最多20個(gè)基線模型
          aml = H2OAutoML(max_models=20, seed=1)
          aml.train(x=x, y=y, training_frame=train)

          # 查看模型效果 
          lb = aml.leaderboard
          lb.head(rows=lb.nrows) 

          # 預(yù)測
          preds = aml.predict(test)
          # preds = aml.leader.predict(test)

          # 模型排行輸出
          lb = h2o.automl.get_leaderboard(aml, extra_columns = "ALL")

          獲取單個(gè)模型的效果:

                
                  m = aml.leader
          # 等效
          m = aml.get_best_model()

          # 使用非默認(rèn)指標(biāo)獲取最佳模型
          m = aml.get_best_model(criterion="logloss")
          # 基于默認(rèn)的排序指標(biāo)獲取XGBoost模型
          xgb = aml.get_best_model(algorithm="xgboost")
          # 基于logloss指標(biāo)獲取 XGBoost 
          xgb = aml.get_best_model(algorithm="xgboost", criterion="logloss")
          # 指定獲取某個(gè)特殊的模型
          m = h2o.get_model("StackedEnsemble_BestOfFamily_AutoML_20191213_174603")

          # 獲取模型的參數(shù)信息
          xgb.params.keys()
          # 特定參數(shù)
          xgb.params['ntrees']

          獲取H2O的訓(xùn)練日志及時(shí)間信息:

                
                  log = aml.event_log  # 日志
          info = aml.training_info  # 時(shí)間

          5.5Auto-Keras

          1、簡介

          Auto-Keras是一種自動(dòng)機(jī)器學(xué)習(xí)(AutoML)工具,旨在簡化深度學(xué)習(xí)模型的構(gòu)建和優(yōu)化。它利用神經(jīng)架構(gòu)搜索(NAS)技術(shù)自動(dòng)選擇合適的模型結(jié)構(gòu)和超參數(shù),從而大大減少了人工調(diào)整的繁瑣工作。

          Auto-Keras通過智能搜索算法,自動(dòng)搜索適合數(shù)據(jù)集的最佳模型結(jié)構(gòu)和超參數(shù),從而提供最佳的模型性能。它提供了簡潔易用的接口,使得即使沒有深入了解深度學(xué)習(xí)的用戶也能夠快速構(gòu)建強(qiáng)大的深度學(xué)習(xí)模型。

          b4c682d9f6742d488c1300bbf40fce85.webp

          Auto-Keras支持多種數(shù)據(jù)類型,包括傳統(tǒng)的結(jié)構(gòu)化數(shù)據(jù)、圖像、文本和時(shí)間序列等不同類型的數(shù)據(jù)。它還提供了許多高級功能,如自動(dòng)化模型選擇、簡潔的用戶界面、支持多種數(shù)據(jù)類型等,使得即使沒有專業(yè)知識的用戶也能夠快速構(gòu)建強(qiáng)大的機(jī)器學(xué)習(xí)模型

          安裝Auto-Keras:

                
                  pip install autokeras

          對應(yīng)python和TensorFlow的版本要求:Python >= 3.7 and TensorFlow >= 2.8.0.

          官方學(xué)習(xí)地址:https://autokeras.com/

          2、實(shí)戰(zhàn)案例

                
                  import numpy as np
          import tensorflow as tf
          from tensorflow.keras.datasets import mnist

          import autokeras as ak

          # 導(dǎo)入數(shù)據(jù)集
          (x_train, y_train), (x_test, y_test) = mnist.load_data()
          print(x_train.shape)  # (60000, 28, 28)
          print(y_train.shape)  # (60000,)
          print(y_train[:3])  # array([7, 2, 1], dtype=uint8)

          # 創(chuàng)建模型并訓(xùn)練
          clf = ak.ImageClassifier(overwrite=True, max_trials=1)
          clf.fit(x_train, y_train, epochs=10)
          # 預(yù)測模型
          predicted_y = clf.predict(x_test)
          # 評估模型
          clf.evaluate(x_test, y_test)

          使用驗(yàn)證數(shù)據(jù)集:

                
                  clf.fit(
              x_train,
              y_train,
              validation_split=0.15,   # 驗(yàn)證集比例
              epochs=10,
          )

          # 手動(dòng)切分驗(yàn)證集
          split = 50000
          x_val = x_train[split:]
          y_val = y_train[split:]
          x_train = x_train[:split]
          y_train = y_train[:split]
          clf.fit(
              x_train,
              y_train,
              validation_data=(x_val, y_val),
              epochs=10,
          )

          自定義搜索空間:

                
                  input_node = ak.ImageInput()
          output_node = ak.ImageBlock(
              block_type = "resnet",
              normalize=True,  # 標(biāo)準(zhǔn)化
              augment=False  # 沒有數(shù)據(jù)增強(qiáng)
          )(input_node)

          output_node = ak.Classification()(output_node)

          clf = ak.AutoModel(inputs=input_node, 
                            outputs=output_node,
                            overwrite=True,
                            max_trials=1)

          clf.fit(x_train,y_train, epochs=10)

          5.6AutoGluon

          1、簡介

          AutoGluon是一個(gè)自動(dòng)化機(jī)器學(xué)習(xí)框架,由AWS團(tuán)隊(duì)開發(fā)和維護(hù)。它可以自動(dòng)調(diào)整超參數(shù)并選擇最佳的深度學(xué)習(xí)模型來解決回歸和分類問題。AutoGluon提供了一種簡單易用的界面來控制自動(dòng)機(jī)器學(xué)習(xí)流程,并且可以與其他常用的深度學(xué)習(xí)框架集成。

          5b478e03802e0ac828376bbccf3de520.webp

          AutoGluon的原理是基于自動(dòng)化機(jī)器學(xué)習(xí)的思想,它使用了一系列的算法和技術(shù)來實(shí)現(xiàn)自動(dòng)化機(jī)器學(xué)習(xí)的過程。其中,AutoGluon使用了一種稱為“神經(jīng)架構(gòu)搜索”的技術(shù)來自動(dòng)化地選擇最佳的模型架構(gòu)。此外,AutoGluon還提供了一些實(shí)用的功能,例如自動(dòng)數(shù)據(jù)增強(qiáng)、自動(dòng)模型選擇、自動(dòng)調(diào)整學(xué)習(xí)率等。

          Windows10系統(tǒng)下的安裝:

          https://auto.gluon.ai/stable/install.html

                
                  conda create -n myenv python=3.9 -y   # 創(chuàng)建虛擬環(huán)境  指定python版本
          conda activate myenv  # 進(jìn)入虛擬環(huán)境

          pip install -U pip
          pip install -U setuptools wheel
          # 安裝torch相關(guān)
          pip install torch==1.13.1+cpu torchvision==0.14.1+cpu -f https://download.pytorch.org/whl/cpu/torch_stable.html
          # 安裝
          pip install autogluon

          官網(wǎng)學(xué)習(xí)地址:https://auto.gluon.ai/stable/index.html

          AutoGluon requires Python version 3.8, 3.9, or 3.10 and is available on Linux, MacOS, and Windows.

          2、實(shí)戰(zhàn)案例

                
                  import pandas as pd
          import numpy as np
          np.random.seed=42

          import warnings
          warnings.filterwarnings("ignore")

          from autogluon.tabular import TabularDataset, TabularPredictor
          # 讀取在線數(shù)據(jù)
          data_url = 'https://raw.githubusercontent.com/mli/ag-docs/main/knot_theory/'
          train = TabularDataset(f'{data_url}train.csv')
          # 數(shù)據(jù)基本信息
          train.shape  # (10000, 19)
          train.columns 
          # 結(jié)果
          Index(['Unnamed: 0''chern_simons''cusp_volume',
                 'hyperbolic_adjoint_torsion_degree''hyperbolic_torsion_degree',
                 'injectivity_radius''longitudinal_translation',
                 'meridinal_translation_imag''meridinal_translation_real',
                 'short_geodesic_imag_part''short_geodesic_real_part''Symmetry_0',
                 'Symmetry_D3''Symmetry_D4''Symmetry_D6''Symmetry_D8',
                 'Symmetry_Z/2 + Z/2''volume''signature'],
                dtype='object')

          # 目標(biāo)變量
          label  = "signature"
          train[label].describe()
          # 模型訓(xùn)練
          predictor = TabularPredictor(label=label).fit(train)
          # 模型預(yù)測
          test = TabularDataset(f"{data_url}test.csv")
          pred = predictor.predict(test.drop(columns=label))

          # 模型評估
          predictor.evaluate(test, silent=True)
          # 結(jié)果
          {'accuracy'0.9448,
           'balanced_accuracy'0.7445352845015228,
           'mcc'0.9323703476874563}

          # 對比不同模型
          predictor.leaderboard(test, silent=True)

          5.7PyCaret

          1、簡介

          PyCaret 是一個(gè)開源的、低代碼的機(jī)器學(xué)習(xí)庫,旨在簡化機(jī)器學(xué)習(xí)工作流并提高工作效率。它是一個(gè) Python 庫,封裝了多個(gè)流行的機(jī)器學(xué)習(xí)庫和框架,如 scikit-learn、XGBoost、LightGBM、CatBoost、spaCy、Optuna、Hyperopt、Ray 等。

          官方學(xué)習(xí)地址:https://pycaret.org/

          7398b00f66acab1ee9f6bc2f829405b2.webp

          基于清華源安裝pycaret:

                
                  pip install pycaret  -i  https://pypi.tuna.tsinghua.edu.cn/simple

          # 相關(guān)依賴安裝
          pip install pycaret[analysis]
          pip install pycaret[models]
          pip install pycaret[tuner]
          pip install pycaret[mlops]
          pip install pycaret[parallel]
          pip install pycaret[test]
          pip install pycaret[analysis,models]

          版本要求:

          • Python 3.7, 3.8, 3.9, and 3.10
          • Ubuntu 16.04 or later
          • Windows 7 or later

          2、實(shí)戰(zhàn)案例

          一個(gè)關(guān)于二分類問題的實(shí)戰(zhàn)案例,使用內(nèi)置的數(shù)據(jù)集

                
                  from pycaret.datasets import get_data
          from pycaret.classification import *

          data = get_data("diabetes")
          # 查看數(shù)據(jù)基本信息

          # 1-函數(shù)式API
          s = setup(data, target="Class variable",session_id=123)

          # 2-OOP API
          from pycaret.classification import ClassificationExperiment
          s = ClassificationExperiment()
          s.setup(data, target="Class variable", session_id=123)

          # 比較不同模型

          # 函數(shù)式API
          # best = compare_models()
          # OOP-API
          best = s.compare_models()

          # 模型分析

          # 函數(shù)式API
          # evaluate_model(best)
          # OOP-API
          s.evaluate_model(best)

          # 模型預(yù)測

          # 函數(shù)式API
          # predict_model(best)
          # OOP-API
          s.predict_model(best)

          模型的保存和加載使用:

                
                  # functional API
          # save_model(best, 'my_first_pipeline')
          # OOP API
          s.save_model(best, 'my_first_pipeline')

          # functional API
          # loaded_model = load_model('my_first_pipeline')
          # OOP API
          loaded_model = s.load_model('my_first_pipeline')
          print(loaded_model)

          5.8MLBox

          1、簡介

          MLBox是一個(gè)功能強(qiáng)大的自動(dòng)化機(jī)器學(xué)習(xí)庫,旨在為機(jī)器學(xué)習(xí)工程師和研究者提供一站式的機(jī)器學(xué)習(xí)解決方案。

          MLBox提供了多種數(shù)據(jù)預(yù)處理、特征工程、模型選擇和超參數(shù)優(yōu)化等功能,可以幫助用戶快速構(gòu)建和評估各種機(jī)器學(xué)習(xí)模型。它還支持多種類型的任務(wù),包括分類、回歸、聚類和異常檢測等。此外,MLBox還提供了一些額外的功能,如模型解釋和模型部署等,可以幫助用戶更好地理解和應(yīng)用機(jī)器學(xué)習(xí)模型。它提供以下功能:

          • 快速進(jìn)行數(shù)據(jù)讀取和分布式數(shù)據(jù)預(yù)處理/清洗/格式化。
          • 高可靠性的特征選擇和信息泄漏檢測。
          • 高維空間中精確超參數(shù)優(yōu)化。
          • 用于分類和回歸的最先進(jìn)的預(yù)測模型(深度學(xué)習(xí),堆疊,LightGBM等)。
          • 具有模型解釋的預(yù)測。
          74adf3427480a81700a1c49840ba422d.webp

          官網(wǎng)學(xué)習(xí)地址:https://mlbox.readthedocs.io/en/latest/

          python版本要求:Python versions: 3.5 - 3.7. & 64-bit version only(32位的Windows系統(tǒng)不再支持)。

                
                  pip install mlbox

          基于源碼的安裝:

                
                  # linux 或者M(jìn)acos
          git clone git://github.com/AxeldeRomblay/mlbox
          cd MLBox
          python setup.py install

          2、實(shí)戰(zhàn)案例

                
                  from mlbox.preprocessing import *
          from mlbox.optimisation import *
          from mlbox.prediction import *

          paths = ["<file_1>.csv""<file_2>.csv", ..., "<file_n>.csv"
          target_name = "<my_target>" 

          data = Reader(sep=",").train_test_split(paths, target_name)  
          data = Drift_thresholder().fit_transform(data)

          # 評估模型
          Optimiser().evaluate(None, data)

          # 自定義搜索參數(shù)
          space = {
                  'ne__numerical_strategy' : {"space" : [0'mean']},
                  'ce__strategy' : {"space" : ["label_encoding""random_projection""entity_embedding"]},
                  'fs__strategy' : {"space" : ["variance""rf_feature_importance"]},
                  'fs__threshold': {"search" : "choice""space" : [0.10.20.3]},
                  'est__strategy' : {"space" : ["LightGBM"]},
                  'est__max_depth' : {"search" : "choice""space" : [5,6]},
                  'est__subsample' : {"search" : "uniform""space" : [0.6,0.9]}
                  }
          best = opt.optimise(space, data, max_evals = 5)

          # 預(yù)測
          Predictor().fit_predict(best, data)

          5.9Auto-Pytorch

          1、簡介

          Auto-PyTorch是一個(gè)自動(dòng)機(jī)器學(xué)習(xí)的框架,它通過使用PyTorch實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)體系架構(gòu)的自動(dòng)搜索。Auto-PyTorch可以根據(jù)數(shù)據(jù)集的特點(diǎn)自動(dòng)選擇最佳的神經(jīng)網(wǎng)絡(luò)架構(gòu),從而使得模型的性能達(dá)到最優(yōu)。

          a2ddb7b5dc46925d5f472c603e82ea44.webp

          Auto-PyTorch的算法會自動(dòng)搜索神經(jīng)網(wǎng)絡(luò)的架構(gòu)、超參數(shù)等,以尋找在特定數(shù)據(jù)集上表現(xiàn)最佳的模型。這種自動(dòng)搜索可以通過GPU計(jì)算來加速,大大減少了人工調(diào)整模型參數(shù)和架構(gòu)的繁瑣工作。

          要使用Auto-PyTorch,需要先安裝PyTorch和Auto-PyTorch庫。然后,可以通過編寫簡單的Python代碼來定義訓(xùn)練和測試數(shù)據(jù)集,并調(diào)用Auto-PyTorch的API進(jìn)行自動(dòng)模型訓(xùn)練和測試。

          GitHub官網(wǎng)地址:https://github.com/automl/Auto-PyTorch

          安裝:

                
                  pip install autoPyTorch
          # 時(shí)序預(yù)測相關(guān)
          pip install autoPyTorch[forecasting]

          手動(dòng)安裝:

                
                  # 創(chuàng)建虛擬環(huán)境
          conda create -n auto-pytorch python=3.8
          conda activate auto-pytorch
          conda install swig
          python setup.py install

          2、實(shí)戰(zhàn)案例

                
                  from autoPyTorch.api.tabular_classification import TabularClassificationTask

          # 導(dǎo)入數(shù)據(jù)
          import sklearn.model_selection
          import sklearn.datasets
          import sklearn.metrics
          X, y = sklearn.datasets.load_digits(return_X_y=True)
          X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, random_state=1)

          # 實(shí)例化分類模型
          api = TabularClassificationTask()

          # 自動(dòng)化搜索
          api.search(
              X_train=X_train,
              y_train=y_train,
              X_test=X_test,
              y_test=y_test,
              optimize_metric='accuracy',
              total_walltime_limit=300,
              func_eval_time_limit_secs=50
          )

          # 計(jì)算準(zhǔn)確率
          y_pred = api.predict(X_test)
          score = api.score(y_pred, y_test)
          print("Accuracy score", score)

          六、基于算法的超參數(shù)調(diào)優(yōu)

          6.1基于算法的超參數(shù)調(diào)優(yōu)

          基于算法的超參數(shù)優(yōu)化是指通過運(yùn)行不同的算法,例如遺傳算法、粒子群優(yōu)化算法等,來自動(dòng)調(diào)整超參數(shù),以尋找最優(yōu)的超參數(shù)組合。這種方法通過利用算法來搜索超參數(shù)空間,以找到最優(yōu)的超參數(shù)組合。

          基于算法的超參數(shù)優(yōu)化通常需要設(shè)置一些參數(shù),例如種群大小、迭代次數(shù)等,這些參數(shù)會影響優(yōu)化的效果。在運(yùn)行算法時(shí),會根據(jù)一定的評估標(biāo)準(zhǔn)來評估不同超參數(shù)組合的效果,并逐漸搜索出最優(yōu)的超參數(shù)組合。

          6.2常見用于超參數(shù)優(yōu)化的算法

          • Bayesian Optimization and HyperBand:一種超參數(shù)優(yōu)化算法,結(jié)合了貝葉斯優(yōu)化和HyperBand算法。BOHB的目標(biāo)是在給定的預(yù)算內(nèi)找到最優(yōu)的超參數(shù)組合,使得機(jī)器學(xué)習(xí)模型在特定任務(wù)上的性能達(dá)到最佳。

          • 遺傳優(yōu)化算法:遺傳優(yōu)化算法是一種通過模擬自然進(jìn)化過程來搜索最優(yōu)解的方法。它是一種全局優(yōu)化方法,可以在一個(gè)較大的解空間內(nèi)搜索最優(yōu)解。

          • 梯度優(yōu)化算法:梯度優(yōu)化算法是一種基于梯度下降的優(yōu)化算法,用于求解復(fù)雜的優(yōu)化問題。它通過迭代地調(diào)整參數(shù),最小化損失函數(shù),從而搜索最優(yōu)解。在梯度下降算法中,每次迭代時(shí),算法會根據(jù)當(dāng)前梯度方向調(diào)整參數(shù),更新參數(shù)的值。如動(dòng)量梯度下降、Adam算法和L-BFGS算法等。

          • 種群優(yōu)化算法:種群優(yōu)化算法是一種基于自然界生物進(jìn)化原理的優(yōu)化算法,它模擬了生物進(jìn)化的過程,通過不斷地迭代和優(yōu)勝劣汰的過程,逐步尋找最優(yōu)解。種群優(yōu)化算法的核心思想是將待優(yōu)化問題轉(zhuǎn)化為一個(gè)適應(yīng)度函數(shù),然后通過不斷地迭代和優(yōu)勝劣汰的過程,逐步尋找最優(yōu)解

          6.3Bayesian Optimization and HyperBand(BOHB)

          1、簡介

          Bayesian Optimization and HyperBand混合了Hyperband算法和Bayesian優(yōu)化。BOHB算法使用貝葉斯優(yōu)化算法進(jìn)行采樣,并通過對超參數(shù)的組合進(jìn)行評估來尋找最佳的超參數(shù)組合。它結(jié)合了全局和局部搜索的優(yōu)勢,能夠快速找到最優(yōu)的超參數(shù)組合,同時(shí)具有健壯性和可擴(kuò)展性。

          BOHB算法適用于深度學(xué)習(xí)任務(wù),通過選擇合適的超參數(shù),可以顯著提高模型的性能和準(zhǔn)確性。它適用于不同的模型和數(shù)據(jù)集,可以輕松添加新的超參數(shù)和約束條件。

          BOHB算法的步驟如下:

          1. 初始化:選擇超參數(shù)的初始范圍和分布,定義評估指標(biāo)和評估次數(shù)。
          2. 運(yùn)行貝葉斯優(yōu)化算法:根據(jù)初始范圍和分布,生成超參數(shù)組合,使用貝葉斯優(yōu)化算法進(jìn)行評估和選擇。
          3. 根據(jù)HyperBand算法進(jìn)行資源分配和模型選擇:根據(jù)貝葉斯優(yōu)化算法的評估結(jié)果,將模型分為若干等級,并根據(jù)等級分配不同的資源。
          4. 重復(fù)步驟2和3,直到達(dá)到預(yù)設(shè)的評估次數(shù)或預(yù)算。
          5. 輸出最優(yōu)的超參數(shù)組合:從所有評估結(jié)果中選擇最優(yōu)的超參數(shù)組合作為最終結(jié)果。

          參考文獻(xiàn):

          https://www.automl.org/blog_bohb/

          https://neptune.ai/blog/hyperband-and-bohb-understanding-state-of-the-art-hyperparameter-optimization-algorithms

          2、python實(shí)戰(zhàn)案例

                
                  import numpy as np  
          from keras.models import Sequential  
          from keras.layers import Dense  
          from keras.optimizers import Adam  
          from keras.losses import BinaryCrossentropy  
          from keras.metrics import Accuracy  
          from keras.utils import to_categorical  
          from sklearn.model_selection import train_test_split  
          from bandit import Bandit  
            
          # 加載數(shù)據(jù)集  
          data = np.loadtxt('data.csv', delimiter=',')   # data數(shù)據(jù)集最后一個(gè)為預(yù)測目標(biāo)變量,前面所有字段為特征變量
          X = data[:, :-1]  
          y = to_categorical(data[:, -1])  
          X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
            
          # 定義模型  
          model = Sequential()  
          model.add(Dense(64, activation='relu', input_shape=(X_train.shape[1],)))  
          model.add(Dense(64, activation='relu'))  
          model.add(Dense(y_train.shape[1], activation='softmax'))  
          model.compile(optimizer=Adam(), loss=BinaryCrossentropy(), metrics=[Accuracy()])  
            
          # 定義BOHB優(yōu)化器  
          def bohb(x):  
              model.set_weights(x)  
              history = model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)  
              loss, accuracy = history.history['val_loss'], history.history['val_accuracy']  
              return loss, accuracy  
            
          # 定義Bandit類  
          bandit = Bandit(bohb, n_iter=1000, n_restarts=10, noise=0.1)  
            
          # 進(jìn)行優(yōu)化  
          bandit.run()

          6.4遺傳優(yōu)化算法(Genetic Algorithm)

          1、什么是遺傳算法?

          遺傳優(yōu)化算法是一種通過模擬自然進(jìn)化過程來搜索最優(yōu)解的優(yōu)化算法。

          這種算法主要受到生物進(jìn)化中自然選擇、交叉(遺傳信息重組)和突變過程的啟發(fā)。遺傳優(yōu)化算法通常用于解決一些復(fù)雜的優(yōu)化問題,如函數(shù)優(yōu)化、組合優(yōu)化、機(jī)器學(xué)習(xí)中的參數(shù)優(yōu)化等。

          https://cloud.tencent.com/developer/article/1425840

          2、遺傳算法的基本步驟:

          • 初始化:首先,算法會隨機(jī)生成一個(gè)種群,這個(gè)種群包含了可能的解決方案。
          • 適應(yīng)度評估:每個(gè)個(gè)體(即種群中的每一個(gè)解決方案)都有一個(gè)與其相對應(yīng)的適應(yīng)度值。這個(gè)適應(yīng)度值表示該個(gè)體的優(yōu)良程度,通常是目標(biāo)函數(shù)值的一種度量。
          • 選擇:根據(jù)適應(yīng)度值,選擇種群中的一部分個(gè)體進(jìn)行繁殖。高適應(yīng)度的個(gè)體有更大的機(jī)會被選擇。
          • 交叉:被選中的個(gè)體通過交叉操作生成新的個(gè)體。這個(gè)過程模擬了生物進(jìn)化中的基因重組。
          • 突變:為了保持種群的多樣性,會隨機(jī)對某些個(gè)體進(jìn)行突變操作,模擬了生物進(jìn)化中的基因突變。
          • 替換:用新生成的一批個(gè)體替換原來種群中的一部分個(gè)體,形成新的種群。
          • 終止條件:如果滿足終止條件(如達(dá)到最大迭代次數(shù)或最優(yōu)適應(yīng)度已經(jīng)達(dá)到一定精度),則停止搜索,否則回到步驟2。

          3、遺傳算法的python實(shí)戰(zhàn)

                
                  import numpy as np  
            
          # 目標(biāo)函數(shù)  
          def f(x):  
              return x ** 2  
            
          # 遺傳算法優(yōu)化函數(shù)  
          def genetic_algorithm(n_pop, n_gen, lower_bound, upper_bound):  
              # 初始化種群  
              pop = np.random.uniform(lower_bound, upper_bound, n_pop)  
              # 計(jì)算適應(yīng)度  
              fit = np.array([f(x) for x in pop])  
              # 進(jìn)行遺傳優(yōu)化  
              for gen in range(n_gen):  
                  # 選擇  
                  idx = np.random.choice(np.arange(n_pop), size=n_pop, replace=True, p=fit/fit.sum())  
                  pop = pop[idx]  
                  fit = fit[idx]  
                  # 交叉  
                  for i in range(0, n_pop, 2):  
                      if np.random.rand() < 0.5:  
                          pop[i], pop[i+1] = pop[i+1], pop[i]  
                      pop[i] = (pop[i] + pop[i+1]) / 2.0  
                  # 突變  
                  for i in range(n_pop):  
                      if np.random.rand() < 0.1:  
                          pop[i] += np.random.normal(00.5)  
              # 返回最優(yōu)解  
              return pop[np.argmin(fit)]  
            
          # 參數(shù)設(shè)置  
          n_pop = 100  # 種群大小  
          n_gen = 100  # 迭代次數(shù)  
          lower_bound = -10  # 下界  
          upper_bound = 10  # 上界  
            
          # 進(jìn)行遺傳優(yōu)化  
          best_x = genetic_algorithm(n_pop, n_gen, lower_bound, upper_bound)  
          print('最優(yōu)解:x = %.3f, f(x) = %.3f' % (best_x, f(best_x)))
          • 定義了目標(biāo)函數(shù)f(x) = x**2,然后實(shí)現(xiàn)了一個(gè)遺傳算法優(yōu)化函數(shù)

          • 基于numpy庫生成一個(gè)均勻分布的隨機(jī)種群,并計(jì)算每個(gè)個(gè)體的適應(yīng)度

          • 在迭代過程中,使用輪盤賭選擇、算術(shù)交叉和隨機(jī)突變操作來生成新的種群。最后,返回適應(yīng)度最小的個(gè)體,即最優(yōu)解

          6.5基于梯度的優(yōu)化Gradient Optimization Algorithm

          1、什么是梯度優(yōu)化?

          基于梯度的優(yōu)化是一種利用梯度信息進(jìn)行優(yōu)化的方法。其基本原理是利用目標(biāo)函數(shù)的梯度信息來逐步迭代更新參數(shù),以找到目標(biāo)函數(shù)的最小值(或最大值)。

          具體來說,梯度優(yōu)化算法Gradient Optimization Algorithm通過計(jì)算目標(biāo)函數(shù)的梯度,即函數(shù)在某一點(diǎn)的切線斜率,來決定參數(shù)更新的方向和步長。在每一次迭代中,算法根據(jù)梯度信息來更新參數(shù),使得目標(biāo)函數(shù)的值朝著梯度的反方向進(jìn)行更新。通過這樣的迭代過程,梯度優(yōu)化算法可以逐步逼近目標(biāo)函數(shù)的最小值點(diǎn)。

          梯度優(yōu)化算法還經(jīng)常結(jié)合其他的優(yōu)化技巧,如動(dòng)量法、學(xué)習(xí)率退火等。

          2、梯度優(yōu)化算法的python實(shí)戰(zhàn)

                
                  import numpy as np  
            
          # 加載數(shù)據(jù)集  
          X = np.array([[00], [01], [10], [11]])  
          y = np.array([0110])  
            
          # 參數(shù)初始化  
          theta = np.random.randn(21)  
          alpha = 0.1  # 學(xué)習(xí)率  
          iters = 1000  
            
          # 梯度下降算法  
          for i in range(iters):  
              # 計(jì)算預(yù)測值和誤差  
              y_pred = np.dot(X, theta) >= 0.5  
              error = y - y_pred  
              # 計(jì)算梯度  
              gradient = np.dot(X.T, error) / len(X) + alpha * theta  
              # 更新參數(shù)  
              theta -= gradient  
            
          # 輸出結(jié)果  
          print('最優(yōu)解:theta =', theta)

          6.6 基于種群的優(yōu)化Population-based Optimization Algorithm

          1、種群優(yōu)化算法的原理

          種群優(yōu)化算法Population-Based Optimization Algorithms(POAs)的原理基于群體智慧和群體進(jìn)化規(guī)則,它通過模擬生物進(jìn)化過程的算法來求解復(fù)雜優(yōu)化問題。在種群優(yōu)化算法中,每個(gè)個(gè)體都代表了一個(gè)可能的解,而整個(gè)種群則代表了所有可能的解。每個(gè)個(gè)體都有一個(gè)適應(yīng)度值,表示其在優(yōu)化問題中的優(yōu)良程度。

          算法的核心思想是將待優(yōu)化問題轉(zhuǎn)化為一個(gè)適應(yīng)度函數(shù),然后通過不斷地迭代和優(yōu)勝劣汰的過程,逐步尋找最優(yōu)解。在每一次迭代中,種群中的每個(gè)個(gè)體都會根據(jù)其適應(yīng)度值進(jìn)行排序,然后根據(jù)一定的概率進(jìn)行選擇、交叉和變異,從而產(chǎn)生新的個(gè)體。這個(gè)過程會不斷地重復(fù),直到找到最優(yōu)解或達(dá)到預(yù)設(shè)的迭代次數(shù)。

          種群優(yōu)化算法具有全局搜索能力強(qiáng)、對問題依賴少、魯棒性強(qiáng)等優(yōu)點(diǎn),適用于解決復(fù)雜的非線性優(yōu)化問題。常見的種群優(yōu)化算法包括遺傳算法、粒子群優(yōu)化算法、蟻群算法等。

          2、種群優(yōu)化算法的python實(shí)戰(zhàn)

                
                  import numpy as np  
            
          # 適應(yīng)度函數(shù)  
          def fitness(x):  
              return x ** 2  
            
          # 初始化種群  
          population_size = 100  
          gene_length = 10  
          population = np.random.randint(2, size=(population_size, 基因長度))  
            
          # 迭代進(jìn)化  
          iters = 100    # 迭代次數(shù)
          cross_entropy = 0.8   # 交叉概率
          mutation_probability = 0.01    # 變異概率
            
          for i in range(iters):  
              # 選擇  
              selection_probability = fitness(population) / sum(fitness(population))  
              selected = np.random.choice(np.arange(population_size), size=population_size, p=selection_probability)  
              population = population[selected]  
            
              # 交叉  
              for j in range(population_size):  
                  if np.random.rand() < cross_entropy:  
                      pos = np.random.randint(gene_length)  
                      population[j], population[j+1] = np.roll(population[j], pos), np.roll(population[j+1], pos)  
            
              # 變異  
              for j in range(population_size):  
                  if np.random.rand() < mutation_probability:  
                      pos = np.random.randint(gene_length)  
                      population[j][pos] = 1 - population[j][pos]  
            
              # 計(jì)算適應(yīng)度值并排序  
              fitness_value = np.array([fitness(x) for x in population])  
              fitness_value_index = np.argsort(fitness_value)[::-1]  
              population = population[fitness_value_index]  
            
          # 輸出最優(yōu)解  
          best_solution_index = np.argmax(fitness_value)  
          best_solution = population[best_solution_index]  
          print('最優(yōu)解:',best_solution)

          瀏覽 78
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美午夜精品一区二区三区 | 日韩黄色在线免费观看 | 色美女亚洲被日 | 豆花视频在线看 | 美女黄频免费 |