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 中的超参数调优