Информированные методы: байесовская статистика

Подбор гиперпараметров в Python

Alex Scriven

Data Scientist

Введение в правило Байеса

 

Правило Байеса:

Статистический метод, при котором новые данные итеративно обновляют наши представления о некотором результате

  • Хорошо сочетается с идеей информированного поиска: чем больше данных, тем точнее результат.
Подбор гиперпараметров в Python

Правило Байеса

Правило Байеса имеет вид:

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

  • Левая часть — вероятность A при условии, что B произошло. B — новое свидетельство.

    • Это называется «апостериорной вероятностью».
  • Правая часть — формула для её вычисления.

  • P(A) — «априорная вероятность»: начальная гипотеза о событии. Она отличается от P(A|B): 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

Область поиска

 

Настройка сетки:

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

Давайте потренируемся!

Подбор гиперпараметров в Python

Preparing Video For Download...