Skip to content

Busca Randômica Verbose: Dominando a Sintonização de Hiperparâmetros no Scikit-learn

A sintonização de hiperparâmetros é um aspecto crucial do aprendizado de máquina que pode influenciar significativamente o desempenho de um modelo. O processo envolve ajustar os parâmetros de um modelo para otimizar suas previsões. Um método popular para sintonização de hiperparâmetros é a busca randômica, especialmente na biblioteca scikit-learn. Este artigo irá explorar o conceito de busca randômica, como torná-la verbosa no scikit-learn e a diferença entre busca randômica e busca em grade. Também exploraremos algumas melhores práticas para sintonização de hiperparâmetros usando busca randômica e como interpretar sua saída.

A busca randômica no scikit-learn é uma ferramenta poderosa para sintonização de hiperparâmetros. Ao contrário da busca em grade, que tenta exaustivamente todas as combinações possíveis de parâmetros, a busca randômica seleciona combinações aleatórias de parâmetros para experimentar, o que pode ser mais eficiente. Esse método pode ser particularmente útil ao lidar com um grande número de parâmetros, pois permite controlar o número de configurações de parâmetros experimentadas.

O que é Busca Randômica no Scikit-learn?

A busca randômica no scikit-learn é implementada através da classe RandomizedSearchCV. Essa classe realiza uma busca por valores de parâmetros especificados para um estimador, mas em vez de tentar todas as combinações possíveis de parâmetros (como o GridSearchCV), ela amostra um número específico de candidatos de um espaço de parâmetros com uma distribuição especificada. Essa abordagem pode ser mais eficiente do que uma busca em grade para otimização de hiperparâmetros, especialmente quando se lida com um grande número de parâmetros ou quando o tempo necessário para treinar um modelo é alto.

Aqui está um exemplo simples de como usar o RandomizedSearchCV:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint as sp_randint
 
## inicialize o classificador
clf = RandomForestClassifier(n_jobs=-1)
 
## especifique os parâmetros e as distribuições para amostrar
param_dist = {"max_depth": [3, None],
              "max_features": sp_randint(1, 11),
              "min_samples_split": sp_randint(2, 11),
              "bootstrap": [True, False],
              "criterion": ["gini", "entropy"]}
 
## execute a busca randômica
n_iter_search = 20
random_search = RandomizedSearchCV(clf, param_distributions=param_dist,
                                   n_iter=n_iter_search, cv=5)
 
random_search.fit(X, y)

Neste exemplo, o RandomizedSearchCV irá amostrar 20 candidatos do espaço de parâmetros e realizar uma validação cruzada com 5 folds em cada um.

Tornando a Busca Randômica Verbosa

A verbosidade da busca randômica no scikit-learn pode ser controlada usando o parâmetro verbose. Quanto maior o valor, mais mensagens serão impressas durante o processo de ajuste. Por exemplo, definir verbose=10 irá imprimir a quantidade máxima de mensagens, fornecendo insights detalhados sobre o processo de ajuste. Isso pode ser especialmente útil ao executar trabalhos grandes, pois permite monitorar o progresso da operação.

Veja como tornar a busca randômica verbosa:

random_search = RandomizedSearchCV(clf, param_distributions=param_dist,
                                   n_iter=n_iter_search, cv=5, verbose=10)

Com verbose=10, o scikit-learn imprimirá mensagens para cada tarefa que for iniciada e concluída, como

Busca Randômica vs Busca em Grade no Scikit-learn

Tanto a busca randômica quanto a busca em grade são métodos usados para otimização de hiperparâmetros no scikit-learn. Embora elas explorem o mesmo espaço de parâmetros, a maneira como operam é fundamentalmente diferente.

A busca em grade, implementada no scikit-learn como GridSearchCV, tenta exaustivamente todas as combinações possíveis de parâmetros. Isso significa que se você tiver uma lista de 10 valores para um parâmetro e 10 para outro, a busca em grade tentará todas as 100 combinações. Isso pode ser computacionalmente caro e demorado, especialmente ao lidar com um grande número de parâmetros ou quando o modelo leva muito tempo para ser treinado. Por outro lado, a busca aleatória, implementada como RandomizedSearchCV, amostra aleatoriamente um número dado de candidatos do espaço de parâmetros. Isso significa que você pode controlar o número de configurações de parâmetros que são testadas, o que pode ser muito mais eficiente do que testar todas as combinações, especialmente quando lidando com um grande número de parâmetros.

Os resultados nas configurações de parâmetros entre a busca aleatória e a busca em grade são bastante semelhantes, mas o tempo de execução da busca aleatória é drasticamente menor. Isso torna a busca aleatória a escolha preferida ao lidar com um grande número de parâmetros e quando os recursos computacionais são limitados.

Aqui está um exemplo de como usar GridSearchCV para comparação:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
 
## inicialize o classificador
clf = RandomForestClassifier(n_jobs=-1)
 
## especifique os parâmetros e as distribuições para amostragem
param_grid = {"max_depth": [3, None],
              "max_features": [1, 3, 10],
              "min_samples_split": [2, 3, 10],
              "bootstrap": [True, False],
              "criterion": ["gini", "entropy"]}
 
## execute a busca em grade
grid_search = GridSearchCV(clf, param_grid=param_grid, cv=5)
 
grid_search.fit(X, y)

Neste exemplo, GridSearchCV tentará todas as combinações de parâmetros e realizará validação cruzada de 5 dobras em cada uma.

Embora ambos os métodos tenham suas vantagens, a escolha entre busca aleatória e busca em grade dependerá de suas necessidades específicas e recursos. Se você tiver recursos computacionais e tempo suficientes, e quiser ter certeza de encontrar os parâmetros ótimos, talvez a busca em grade seja a melhor opção. No entanto, se você quiser economizar tempo e recursos, e estiver satisfeito em encontrar um conjunto de parâmetros que seja bom o suficiente, então a busca aleatória pode ser uma escolha melhor.

Melhores práticas para ajuste de hiperparâmetros usando busca aleatória

Ao usar a busca aleatória para ajuste de hiperparâmetros, existem várias melhores práticas que podem ajudá-lo a obter o máximo deste método.

Em primeiro lugar, é importante ter um bom entendimento dos hiperparâmetros do modelo com o qual você está trabalhando e da faixa de valores que eles podem assumir. Isso permitirá que você defina um espaço de parâmetros significativo para a busca aleatória amostrar.

Em segundo lugar, considere usar uma validação cruzada com divisões k estratificadas em vez de uma simples divisão treino-teste. Isso garante que cada divisão dos dados tenha a mesma proporção de amostras de cada classe, o que pode levar a resultados mais confiáveis, especialmente ao lidar com conjuntos de dados desbalanceados.

Em terceiro lugar, lembre-se de definir um estado aleatório para a busca aleatória para garantir que seus resultados sejam reproduzíveis. Isso pode ser especialmente útil quando você deseja comparar o desempenho de diferentes modelos ou conjuntos de hiperparâmetros.

Por último, não se esqueça de usar o parâmetro verbose para monitorar o progresso da busca. Isso pode ser especialmente útil ao executar tarefas grandes, pois permite acompanhar a operação e diagnosticar quaisquer problemas potenciais.

Interpretando a saída da busca aleatória no scikit-learn

A saída de uma busca aleatória no scikit-learn é um objeto RandomizedSearchCV ajustado. Este objeto contém informações sobre os melhores parâmetros encontrados durante a busca, os resultados da validação cruzada para cada combinação de parâmetros e o modelo ajustado com os melhores parâmetros.

Você pode acessar os melhores parâmetros usando o atributo best_params_, desta forma:

best_params = random_search.best_params_

Isso retornará um dicionário com os nomes dos parâmetros como chaves e os melhores valores como valores.

Os resultados da validação cruzada podem ser acessados usando o atributo cv_results_. Isso retorna um dicionário com várias chaves relacionadas ao processo de validação cruzada, como a média e o desvio padrão do escore de teste para cada combinação de parâmetros.

O modelo ajustado com os melhores parâmetros pode ser acessado usando o atributo best_estimator_. Você pode usar esse modelo para fazer previsões em novos dados.

Perguntas frequentes

Qual é a diferença entre busca aleatória e busca em grade no scikit-learn?

A busca aleatória e a busca em grade são ambos métodos de otimização de hiperparâmetros no scikit-learn. A principal diferença entre eles é que a busca em grade tenta exaustivamente todas as combinações possíveis de parâmetros, enquanto a busca aleatória amostra aleatoriamente um número dado de candidatos do espaço de parâmetros. Isso torna a busca aleatória mais eficiente que a busca em grade ao lidar com um grande número de parâmetros ou quando o modelo leva muito tempo para treinar.

Como posso tornar a busca aleatória verbosa no scikit-learn?

A verbosidade da busca aleatória no scikit-learn pode ser controlada usando o parâmetro verbose. Quanto maior o valor, mais mensagens serão impressas durante o processo de ajuste. Por exemplo, configurar verbose=10 imprimirá a quantidade máxima de mensagens, fornecendo insights detalhados no processo de ajuste.

Quais são algumas das melhores práticas para ajuste de hiperparâmetros usando busca aleatória?

Algumas das melhores práticas para ajuste de hiperparâmetros usando busca aleatória incluem ter um bom entendimento dos hiperparâmetros e sua faixa de valores, usar validação cruzada com divisões k estratificadas, definir um estado aleatório para reprodução e fazer uso do parâmetro verbose para monitorar o progresso da busca.