Apresentando Grid Search

Ajuste de Hiperparâmetros em Python

Alex Scriven

Data Scientist

Automatizando 2 hiperparâmetros

Seu trabalho anterior:

neighbors_list = [3,5,10,20,50,75]
accuracy_list = []
for test_number in neighbors_list:
    model = KNeighborsClassifier(n_neighbors=test_number)
    predictions = model.fit(X_train, y_train).predict(X_test)
    accuracy = accuracy_score(y_test, predictions)
    accuracy_list.append(accuracy)

Depois reunimos tudo em um dataframe para analisar.

Ajuste de Hiperparâmetros em Python

Automatizando 2 hiperparâmetros

 

E testar valores de 2 hiperparâmetros?

Usando um algoritmo GBM:

  • learn_rate [0.001, 0.01, 0.05]
  • max_depth [4,6,8,10]

Podemos usar um for (aninhado)!

Ajuste de Hiperparâmetros em Python

Automatizando 2 hiperparâmetros

Primeiro, uma função para criar o modelo:

def gbm_grid_search(learn_rate, max_depth):
    model = GradientBoostingClassifier(
            learning_rate=learn_rate,
            max_depth=max_depth)

predictions = model.fit(X_train, y_train).predict(X_test)
return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Ajuste de Hiperparâmetros em Python

Automatizando 2 hiperparâmetros

 

Agora podemos iterar pelas listas de hiperparâmetros e chamar a função:

results_list = []

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        results_list.append(gbm_grid_search(learn_rate,max_depth))

Ajuste de Hiperparâmetros em Python

Automatizando 2 hiperparâmetros

 

Também podemos colocar esses resultados em um DataFrame e imprimir:

results_df = pd.DataFrame(results_list, columns=['learning_rate', 'max_depth', 'accuracy'])
print(results_df)

tabela de resultados

Ajuste de Hiperparâmetros em Python

Quantos modelos?

 

Ao adicionar mais hiperparâmetros e valores, criamos muito mais modelos.

  • A relação não é linear, é exponencial
  • Um valor a mais de um hiperparâmetro não é só um modelo
  • 5 para o Hiperparâmetro 1 e 10 para o Hiperparâmetro 2 viram 50 modelos!

E a validação cruzada?

  • Com 10 folds, seriam 50x10 = 500 modelos!
Ajuste de Hiperparâmetros em Python

De 2 a N hiperparâmetros

 

E se adicionarmos mais hiperparâmetros?

Podemos aninhar nosso loop!

# Ajuste a lista de valores a testar
learn_rate_list = [0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5]
max_depth_list = [4,6,8, 10, 12, 15, 20, 25, 30]
subsample_list = [0.4,0.6, 0.7, 0.8, 0.9]
max_features_list = ['auto', 'sqrt']
Ajuste de Hiperparâmetros em Python

De 2 a N hiperparâmetros

Ajuste da nossa função:

def gbm_grid_search(learn_rate, max_depth,subsample,max_features):
    model = GradientBoostingClassifier(
        learning_rate=learn_rate, 
        max_depth=max_depth,
        subsample=subsample,
        max_features=max_features)
    predictions = model.fit(X_train, y_train).predict(X_test)
    return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Ajuste de Hiperparâmetros em Python

De 2 a N hiperparâmetros

Ajustando nosso for (aninhamento):

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        for subsample in subsample_list:
            for max_features in max_features_list:
                results_list.append(gbm_grid_search(learn_rate,max_depth,
                                     subsample,max_features))
results_df = pd.DataFrame(results_list, columns=['learning_rate',
                         'max_depth', 'subsample', 'max_features','accuracy'])
print(results_df)
Ajuste de Hiperparâmetros em Python

De 2 a N hiperparâmetros

 

Quantos modelos agora?

  • 7x9x5x2 = 630 (6.300 com validação cruzada!)

Não dá para aninhar para sempre!

Além disso, e se quisermos:

  • Detalhes de tempos de treino e pontuações
  • Detalhes das pontuações de validação cruzada
Ajuste de Hiperparâmetros em Python

Apresentando Grid Search

Vamos criar uma grade:

  • À esquerda, todos os valores de max_depth
  • No topo, todos os valores de learning_rate

Tabela de combinações de hiperparâmetros

Ajuste de Hiperparâmetros em Python

Apresentando Grid Search

Percorrendo cada célula da grade:

tabela de combinações de hiperparâmetros

(4,0.001) equivale a criar um estimator assim:

GradientBoostingClassifier(max_depth=4, learning_rate=0.001)
Ajuste de Hiperparâmetros em Python

Prós e contras do Grid Search

 

Algumas vantagens desta abordagem:

Vantagens:

  • Você não precisa escrever milhares de linhas de código
  • Encontra o melhor modelo dentro da grade (*observação especial aqui!)
  • Fácil de explicar
Ajuste de Hiperparâmetros em Python

Prós e contras do Grid Search

 

Algumas desvantagens desta abordagem:

  • Computacionalmente caro! Lembra como chegamos rápido a 6.000+ modelos?
  • É "não informada". O resultado de um modelo não ajuda a criar o próximo.

 

Veremos métodos "informados" depois!

Ajuste de Hiperparâmetros em Python

Vamos praticar!

Ajuste de Hiperparâmetros em Python

Preparing Video For Download...