Інформовані методи: баєсівська статистика

Тюнінг гіперпараметрів у Python

Alex Scriven

Data Scientist

Вступ до Баєса

 

Правило Баєса:

Статистичний підхід, що використовує нові дані, щоб поетапно оновлювати наші переконання щодо певного результату

  • Інтуїтивно збігається з ідеєю інформованого пошуку. Ми поліпшуємося, коли з'являються нові дані.
Тюнінг гіперпараметрів у Python

Правило Баєса

Правило Баєса має вигляд:

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

  • Ліва частина = ймовірність A за умови, що сталося B. B — це нові дані.

    • Це так званий «posterior»
  • Права частина — як це обчислюємо.

  • P(A) — це «prior». Початкова гіпотеза щодо події. Вона відрізняється від P(A|B): P(A|B) — це ймовірність за наявності нових даних.
Тюнінг гіперпараметрів у Python

Правило Баєса

 

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

  • P(B) — це «marginal likelihood», тобто ймовірність спостерігати ці нові дані
  • P(B|A) — це «likelihood», тобто ймовірність спостерігати дані за умови події, що нас цікавить.

Це може збивати з пантелику, тож розгляньмо типовий приклад медичної діагностики.

Тюнінг гіперпараметрів у Python

Баєс у медицині

 

Медичний приклад:

  • 5% людей у загальній популяції мають певну хворобу
    • P(D)
  • 10% людей мають схильність
    • P(Pre)
  • 20% людей із хворобою мають схильність
    • P(Pre|D)
Тюнінг гіперпараметрів у Python

Баєс у медицині

Яка ймовірність, що будь-яка людина має хворобу?

$$ P(D) = 0.05 $$

Це наш prior, адже немає додаткових даних.

Яка ймовірність, що схильна людина має хворобу?

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