知情方法:贝叶斯统计

Python 中的超参数调优

Alex Scriven

Data Scientist

贝叶斯简介

 

贝叶斯法则:

一种统计方法,利用新的证据迭代更新我们对某个结果的信念

  • 与"知情"搜索直觉一致:证据越多,越准确。
Python 中的超参数调优

贝叶斯法则

贝叶斯法则形式为:

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • 左侧:给定 B 发生时 A 的概率。B 是新证据。

    • 称为"后验"。
  • 右侧:计算方式。

  • P(A) 为"先验",即对事件的初始假设。不同于 P(A|B),后者是在给定新证据下的概率。
Python 中的超参数调优

贝叶斯法则

 

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • P(B) 为"边际似然",即观察到该新证据的概率
  • P(B|A) 为"似然",即在我们关心的事件发生时观察到证据的概率

这可能有些抽象,下面用常见的医疗诊断示例说明。

Python 中的超参数调优

医学中的贝叶斯

 

医疗示例:

  • 一般人群中有 5% 罹患某病
    • P(D)
  • 10% 的人有易感性
    • P(Pre)
  • 患病人群中 20% 有易感性
    • P(Pre|D)
Python 中的超参数调优

医学中的贝叶斯

任意一人患病的概率是多少?

$$ 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 $$

Python 中的超参数调优

贝叶斯用于超参数调优

我们可将此逻辑用于超参数调优:

  • 选取一组超参数
  • 训练模型
  • 获取新的证据(模型得分)
  • 更新信念,下一轮选择更优超参数

贝叶斯超参数调优较新,但在大型、复杂的调优任务中很流行,因其能更好地找到最优组合

Python 中的超参数调优

用 Hyperopt 做贝叶斯调优

 

介绍 Hyperopt 包。

要进行贝叶斯超参数调优,我们需要:

  1. 设定域:网格(稍有不同)
  2. 设定优化算法(默认 TPE)
  3. 最小化的目标函数:使用 1-Accuracy
Python 中的超参数调优

Hyperopt:设定域(网格)

设置网格的多种方式:

  • 直接数值
  • 从列表选择
  • 值的分布

Hyperopt 不使用网格上的点值,而是每个点表示各超参数值的概率。

我们将用简单的均匀分布,更多选项见文档。

Python 中的超参数调优

域(Domain)

 

设置网格:

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),
}
Python 中的超参数调优

目标函数

目标函数运行算法:

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_score
write_results(best_score, params, iteration) return loss
Python 中的超参数调优

运行算法

 

运行算法:

best_result = fmin(
            fn=objective,
            space=space,
            max_evals=500, 
            rstate=np.random.default_rng(42),
            algo=tpe.suggest)
Python 中的超参数调优

¡Vamos a practicar!

Python 中的超参数调优

Preparing Video For Download...