Métodos informados: Estatística Bayesiana

Ajuste de Hiperparâmetros em Python

Alex Scriven

Data Scientist

Introdução a Bayes

 

Regra de Bayes:

Um método estatístico que usa novas evidências para atualizar iterativamente nossas crenças sobre algum resultado

  • Combina intuitivamente com a ideia de busca informada. Melhoramos à medida que obtemos mais evidências.
Ajuste de Hiperparâmetros em Python

Regra de Bayes

A Regra de Bayes tem a forma:

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

  • LHS = a probabilidade de A, dado que B ocorreu. B é uma nova evidência.

    • Isso é o "posterior"
  • RHS é como calculamos isso.

  • P(A) é o "prior". A hipótese inicial sobre o evento. É diferente de P(A|B); P(A|B) é a probabilidade dada a nova evidência.
Ajuste de Hiperparâmetros em Python

Regra de Bayes

 

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

  • P(B) é a "verossimilhança marginal" e é a probabilidade de observar essa nova evidência
  • P(B|A) é a "verossimilhança", a probabilidade de observar a evidência dado o evento de interesse.

Isso pode parecer confuso, mas vamos usar um exemplo comum de diagnóstico médico para demonstrar.

Ajuste de Hiperparâmetros em Python

Bayes na Medicina

 

Um exemplo médico:

  • 5% das pessoas na população geral têm uma certa doença
    • P(D)
  • 10% das pessoas são predispostas
    • P(Pre)
  • 20% das pessoas com a doença são predispostas
    • P(Pre|D)
Ajuste de Hiperparâmetros em Python

Bayes na Medicina

Qual é a probabilidade de qualquer pessoa ter a doença?

$$ P(D) = 0.05 $$

Esse é simplesmente nosso prior, pois não há evidências.

Qual é a probabilidade de uma pessoa predisposta ter a doença?

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

Ajuste de Hiperparâmetros em Python

Bayes no ajuste de hiperparâmetros

Podemos aplicar essa lógica ao ajuste de hiperparâmetros:

  • Escolher uma combinação de hiperparâmetros
  • Construir um modelo
  • Obter novas evidências (a pontuação do modelo)
  • Atualizar nossas crenças e escolher hiperparâmetros melhores na próxima rodada

O ajuste bayesiano de hiperparâmetros é novo, mas popular em tarefas maiores e mais complexas, pois encontra boas combinações de hiperparâmetros nessas situações.

Ajuste de Hiperparâmetros em Python

Ajuste bayesiano com Hyperopt

 

Apresentando o pacote Hyperopt.

Para fazer ajuste bayesiano de hiperparâmetros, precisamos:

  1. Definir o domínio: nosso grid (com um toque diferente)
  2. Definir o algoritmo de otimização (use o TPE padrão)
  3. Função objetivo a minimizar: vamos usar 1-Accuracy
Ajuste de Hiperparâmetros em Python

Hyperopt: definir o domínio (grid)

Muitas opções para definir o grid:

  • Números simples
  • Escolha de uma lista
  • Distribuição de valores

O Hyperopt não usa valores pontuais no grid; cada ponto representa probabilidades para cada valor de hiperparâmetro.

Usaremos uma distribuição uniforme simples, mas há muitas outras na documentação.

Ajuste de Hiperparâmetros em Python

O domínio

 

Configurar o grid:

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),
}
Ajuste de Hiperparâmetros em Python

A função objetivo

A função objetivo executa o algoritmo:

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
Ajuste de Hiperparâmetros em Python

Executar o algoritmo

 

Executar o algoritmo:

best_result = fmin(
            fn=objective,
            space=space,
            max_evals=500, 
            rstate=np.random.default_rng(42),
            algo=tpe.suggest)
Ajuste de Hiperparâmetros em Python

Vamos praticar!

Ajuste de Hiperparâmetros em Python

Preparing Video For Download...