全面總結(jié)機(jī)器學(xué)習(xí)超參數(shù)調(diào)優(yōu)(附代碼)
公眾號:尤而小屋
作者:Peter
編輯:Peter
大家好,我是Peter~
本文的主題:機(jī)器學(xué)習(xí)建模的超參數(shù)調(diào)優(yōu)。開局一張圖:
文章很長,建議直接收藏~
一、什么是機(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ù)組合是非常必要的。
下文從網(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ù)組合。
https://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.1, 1, 10, 100],
'gamma': [1e-3, 1e-2, 1e-1, 1],
}
# 創(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)解。
這種方法適用于處理高維、非線性、非凸或非連續(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': [100, 200, 300, 400, 500],
'max_depth': [2, 3, 4, 5, 6],
'max_features': ['auto', 'sqrt', 'log2'],
'bootstrap': [True, False]
}
# 執(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)化的對比:
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í)分布。
貝葉斯優(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-3, 1e3)) * RBF(10, (1e-2, 1e2))
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, (100, 1)))
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)化等。
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': [100, 200, 500],
'max_depth': [3, 5, None],
'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)算法。
安裝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.001, 10),
'gamma': hp.uniform('gamma', 0.001, 10)
}
# 使用貝葉斯優(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)化。
可以使用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-10, 1e-5)
batch_size = trial.suggest_int('batch_size', 32, 256)
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ù)的配置。(建議少使用)
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 = [[-5, 5], [-5, 5]]
priors = [sp.priors.NormalPrior(0, 1), sp.priors.NormalPrior(0, 1)]
# 運(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=(28, 28)),
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': [5, 10, 20],
'kernel__scale': [1e-4, 1e-3, 1e-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)。
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.001, 0.01, 0.1, 1.0]),
"b": tune.choice([1, 2, 3]),
}
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
先安裝:
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(0, 0.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(-5, 5, 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)[:, None, None]) * 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)化問題。
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ù)組合。
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-5, 1e-2, "log-uniform"),
"batch_size": (32, 256, "uniform")
}
# 定義基于pytorch的深度學(xué)習(xí)模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(784, 10)
def forward(self, x):
x = x.view(-1, 784)
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ù)。
安裝命令:
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)行了描述。
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ù)測模型。
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í)模型。
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í)框架集成。
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/
基于清華源安裝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ù)測。
官網(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.1, 0.2, 0.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)。
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算法的步驟如下:
- 初始化:選擇超參數(shù)的初始范圍和分布,定義評估指標(biāo)和評估次數(shù)。
- 運(yùn)行貝葉斯優(yōu)化算法:根據(jù)初始范圍和分布,生成超參數(shù)組合,使用貝葉斯優(yōu)化算法進(jìn)行評估和選擇。
- 根據(jù)HyperBand算法進(jìn)行資源分配和模型選擇:根據(jù)貝葉斯優(yōu)化算法的評估結(jié)果,將模型分為若干等級,并根據(jù)等級分配不同的資源。
- 重復(fù)步驟2和3,直到達(dá)到預(yù)設(shè)的評估次數(shù)或預(yù)算。
- 輸出最優(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(0, 0.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([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 1, 1, 0])
# 參數(shù)初始化
theta = np.random.randn(2, 1)
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)
