知情方法:貝氏統計

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. 設定 Domain:我們的格點(但有些變化)
  2. 設定最佳化演算法(使用預設 TPE)
  3. 最小化的目標函式:我們用 1-Accuracy
Python 超參數調校

Hyperopt:設定 Domain(格點)

設定格點的多種方式:

  • 直接給數值
  • 從清單中擇一
  • 指定分佈

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 超參數調校

目標函式(objective function)

目標函式負責執行演算法:

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 超參數調校

一起來練習吧!

Python 超參數調校

Preparing Video For Download...