Python 超參數調校
Alex Scriven
Data Scientist
貝氏法則:
一種統計方法,利用新證據反覆更新我們對某個_結果_的_信念_。
貝氏法則形式:
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
左側=在 B 已發生下,A 的機率。B 是新證據。
右側是計算方式。
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
這可能有點抽象。我們用常見的醫療診斷例子來說明。
醫療範例:
任一個人罹患該病的機率是多少?
$$ P(D) = 0.05 $$
這是我們在沒有證據時的先驗。
具「易感體質」的人罹患該病的機率是多少?
$$ P(D \mid Pre) = \frac{P(Pre \mid D) \, P(D)}{P(pre)} $$
$$ P(D \mid Pre) = \frac{0.2 \, * 0.05}{0.1} = 0.1 $$
把這個邏輯用於超參數調校:
貝氏式超參數調校相對新,但在大型、複雜的調校任務很受歡迎,因為在這些情境下它常能找到更佳的超參數組合。
介紹 Hyperopt 套件。
要進行貝氏式超參數調校,你需要:
設定格點的多種方式:
Hyperopt 不用單點格點;每個點代表各超參數值的機率分佈。
我們先用簡單的均勻分佈;更多選項請見文件。
設定格點:
space = {
'max_depth': hp.quniform('max_depth', 2, 10, 2),
'min_samples_leaf': hp.quniform('min_samples_leaf', 2, 8, 2),
'learning_rate': hp.uniform('learning_rate', 0.01, 1, 55),
}
目標函式負責執行演算法:
def objective(params): params = {'max_depth': int(params['max_depth']), 'min_samples_leaf': int(params['min_samples_leaf']), 'learning_rate': params['learning_rate']} gbm_clf = GradientBoostingClassifier(n_estimators=500, **params)best_score = cross_val_score(gbm_clf, X_train, y_train, scoring='accuracy', cv=10, n_jobs=4).mean() loss = 1 - best_scorewrite_results(best_score, params, iteration) return loss
執行演算法:
best_result = fmin(
fn=objective,
space=space,
max_evals=500,
rstate=np.random.default_rng(42),
algo=tpe.suggest)
Python 超參數調校