【機器學習基礎(chǔ)】一文歸納AI調(diào)參煉丹之法
1 超參數(shù)優(yōu)化
調(diào)參即超參數(shù)優(yōu)化,是指從超參數(shù)空間中選擇一組合適的超參數(shù),以權(quán)衡好模型的偏差(bias)和方差(variance),從而提高模型效果及性能。常用的調(diào)參方法有:
人工手動調(diào)參 網(wǎng)格/隨機搜索(Grid / Random Search) 貝葉斯優(yōu)化(Bayesian Optimization)

注:超參數(shù) vs 模型參數(shù)差異 超參數(shù)是控制模型學習過程的(如網(wǎng)絡層數(shù)、學習率);模型參數(shù)是通過模型訓練學習后得到的(如網(wǎng)絡最終學習到的權(quán)重值)。
2 人工調(diào)參
手動調(diào)參需要結(jié)合數(shù)據(jù)情況及算法的理解,選擇合適調(diào)參的優(yōu)先順序及參數(shù)的經(jīng)驗值。
不同模型手動調(diào)參思路會有差異,如隨機森林是一種bagging集成的方法,參數(shù)主要有n_estimators(子樹的數(shù)量)、max_depth(樹的最大生長深度)、max_leaf_nodes(最大葉節(jié)點數(shù))等。(此外其他參數(shù)不展開說明) 對于n_estimators:通常越大效果越好。參數(shù)越大,則參與決策的子樹越多,可以消除子樹間的隨機誤差且增加預測的準度,以此降低方差與偏差。對于max_depth或max_leaf_nodes:通常對效果是先增后減的。取值越大則子樹復雜度越高,偏差越低但方差越大。

3 網(wǎng)格/隨機搜索

網(wǎng)格搜索(grid search),是超參數(shù)優(yōu)化的傳統(tǒng)方法,是對超參數(shù)組合的子集進行窮舉搜索,找到表現(xiàn)最佳的超參數(shù)子集。 隨機搜索(random search),是對超參數(shù)組合的子集簡單地做固定次數(shù)的隨機搜索,找到表現(xiàn)最佳的超參數(shù)子集。對于規(guī)模較大的參數(shù)空間,采用隨機搜索往往效率更高。
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
# 選擇模型
model = RandomForestClassifier()
# 參數(shù)搜索空間
param_grid = {
'max_depth': np.arange(1, 20, 1),
'n_estimators': np.arange(1, 50, 10),
'max_leaf_nodes': np.arange(2, 100, 10)
}
# 網(wǎng)格搜索模型參數(shù)
grid_search = GridSearchCV(model, param_grid, cv=5, scoring='f1_micro')
grid_search.fit(x, y)
print(grid_search.best_params_)
print(grid_search.best_score_)
print(grid_search.best_estimator_)
# 隨機搜索模型參數(shù)
rd_search = RandomizedSearchCV(model, param_grid, n_iter=200, cv=5, scoring='f1_micro')
rd_search.fit(x, y)
print(rd_search.best_params_)
print(rd_search.best_score_)
print(rd_search.best_estimator_)
4 貝葉斯優(yōu)化
貝葉斯優(yōu)化(Bayesian Optimization) 與網(wǎng)格/隨機搜索最大的不同,在于考慮了歷史調(diào)參的信息,使得調(diào)參更有效率。(但在高維參數(shù)空間下,貝葉斯優(yōu)化復雜度較高,效果會近似隨機搜索。)

4.1 算法簡介
貝葉斯優(yōu)化思想簡單可歸納為兩部分:
高斯過程(GP):以歷史的調(diào)參信息(Observation)去學習目標函數(shù)的后驗分布(Target)的過程。
采集函數(shù)(AC):由學習的目標函數(shù)進行采樣評估,分為兩種過程:1、開采過程:在最可能出現(xiàn)全局最優(yōu)解的參數(shù)區(qū)域進行采樣評估。2、勘探過程:兼顧不確定性大的參數(shù)區(qū)域的采樣評估,避免陷入局部最優(yōu)。
4.2 算法流程
for循環(huán)n次迭代:
采集函數(shù)依據(jù)學習的目標函數(shù)(或初始化)給出下個開采極值點 Xn+1;
評估超參數(shù)Xn+1得到表現(xiàn)Yn+1;
加入新的Xn+1、Yn+1數(shù)據(jù)樣本,并更新高斯過程模型;

"""
隨機森林分類Iris使用貝葉斯優(yōu)化調(diào)參
"""
import numpy as np
from hyperopt import hp, tpe, Trials, STATUS_OK, Trials, anneal
from functools import partial
from hyperopt.fmin import fmin
from sklearn.metrics import f1_score
from sklearn.ensemble import RandomForestClassifier
def model_metrics(model, x, y):
""" 評估指標 """
yhat = model.predict(x)
return f1_score(y, yhat,average='micro')
def bayes_fmin(train_x, test_x, train_y, test_y, eval_iters=50):
"""
bayes優(yōu)化超參數(shù)
eval_iters:迭代次數(shù)
"""
def factory(params):
"""
定義優(yōu)化的目標函數(shù)
"""
fit_params = {
'max_depth':int(params['max_depth']),
'n_estimators':int(params['n_estimators']),
'max_leaf_nodes': int(params['max_leaf_nodes'])
}
# 選擇模型
model = RandomForestClassifier(**fit_params)
model.fit(train_x, train_y)
# 最小化測試集(- f1score)為目標
train_metric = model_metrics(model, train_x, train_y)
test_metric = model_metrics(model, test_x, test_y)
loss = - test_metric
return {"loss": loss, "status":STATUS_OK}
# 參數(shù)空間
space = {
'max_depth': hp.quniform('max_depth', 1, 20, 1),
'n_estimators': hp.quniform('n_estimators', 2, 50, 1),
'max_leaf_nodes': hp.quniform('max_leaf_nodes', 2, 100, 1)
}
# bayes優(yōu)化搜索參數(shù)
best_params = fmin(factory, space, algo=partial(anneal.suggest,), max_evals=eval_iters, trials=Trials(),return_argmin=True)
# 參數(shù)轉(zhuǎn)為整型
best_params["max_depth"] = int(best_params["max_depth"])
best_params["max_leaf_nodes"] = int(best_params["max_leaf_nodes"])
best_params["n_estimators"] = int(best_params["n_estimators"])
return best_params
# 搜索最優(yōu)參數(shù)
best_params = bayes_fmin(train_x, test_x, train_y, test_y, 100)
print(best_params)
往期精彩回顧
本站qq群704220115,加入微信群請掃碼:
