Otimização de hiperparâmetros bayesianos com tune-sklearn no PyCaret
PyCaret, uma biblioteca Python ML de baixo código, oferece várias maneiras de ajustar os hiperparâmetros de um modelo criado. Neste post, gostaria de mostrar como o Ray Tune é integrado ao PyCaret e como é fácil alavancar seus algoritmos e computação distribuída para obter resultados superiores ao método de pesquisa aleatório padrão.
By Antonio Baum, Colaborador principal da PyCaret e Colaborador da Ray Tune
Aqui está uma situação a cada PyCaretName o usuário está familiarizado: depois de selecionar um ou dois modelos promissores compare_models()
, é hora de ajustar seus hiperparâmetros para espremer todo o potencial do modelo com tune_model()
.
from pycaret.datasets import get_data
from pycaret.classification import * data = get_data("juice") exp = setup( data, target = "Purchase",
)
best_model = compare_models()
tuned_best_model = tune_model(best_model)
(Se você quiser saber mais sobre PyCaret - uma biblioteca de aprendizado de máquina de código aberto e baixo código em Python, este guia é um bom lugar para começar.)
Por padrão, o tune_model()
usa o experimentado e testado RandomizedSearchCV
do scikit-learn. No entanto, nem todo mundo conhece as várias opções avançadas tune_model()
proporciona.
Neste post, vou mostrar como é fácil usar outros algoritmos de última geração com PyCaret, graças a afinar-sklearn, um substituto imediato para o módulo de seleção de modelo do scikit-learn com técnicas de ajuste de hiperparâmetros de ponta. Também relatarei os resultados de uma série de benchmarks, mostrando como o tune-sklearn é capaz de melhorar facilmente o desempenho do modelo de classificação.
Pesquisa aleatória vs otimização bayesiana
Os algoritmos de otimização de hiperparâmetros podem variar muito em eficiência.
A pesquisa aleatória tem sido um grampo do aprendizado de máquina e por um bom motivo: é fácil de implementar, entender e dá bons resultados em um tempo razoável. No entanto, como o nome indica, é completamente aleatório - muito tempo pode ser gasto na avaliação de configurações incorretas. Considerando que a quantidade de iterações é limitada, faria sentido que o algoritmo de otimização se concentrasse nas configurações que considera promissoras, levando em consideração as configurações já avaliadas.
Essa é, em essência, a ideia da otimização bayesiana (BO). Os algoritmos BO acompanham todas as avaliações e usam os dados para construir um "modelo de probabilidade substituto", que pode ser avaliado muito mais rápido do que um modelo ML. Quanto mais configurações foram avaliadas, mais informado o algoritmo se torna e mais próximo o modelo substituto se torna da função objetivo real. Dessa forma, o algoritmo pode fazer uma escolha informada sobre quais configurações avaliar em seguida, em vez de apenas amostrar as aleatórias. Se você quiser saber mais sobre a otimização Bayesiana, confira este excelente artigo de Will Koehrsen.
Felizmente, o PyCaret foi integrado invólucros para várias bibliotecas de otimização, e neste artigo, vamos nos concentrar em afinar-sklearn.
tune-sklearn no PyCaret
afinar-sklearn é um substituto imediato para o módulo de seleção de modelo do scikit-learn. tune-sklearn fornece uma API unificada baseada em scikit-learn que dá acesso a vários algoritmos e bibliotecas de otimização de última geração, incluindo Optuna e scikit-optimize. Essa API unificada permite alternar entre muitas bibliotecas de otimização de hiperparâmetros diferentes com apenas um único parâmetro.
tune-sklearn é alimentado por Sintonia de raio, uma biblioteca Python para execução de experimentos e ajuste de hiperparâmetros em qualquer escala. Isso significa que você pode dimensionar seu ajuste em várias máquinas sem alterar seu código.
Para tornar as coisas ainda mais simples, a partir da versão 2.2.0, tune-sklearn foi integrado ao PyCaret. Você pode simplesmente fazer pip install "pycaret[full]"
e todas as dependências opcionais serão atendidas.
Como tudo funciona em conjunto
!pip install "pycaret[full]" from pycaret.datasets import get_data
from pycaret.classification import * data = get_data("juice") exp = setup( data, target = "Purchase",
)
best_model = compare_models()
tuned_best_model_hyperopt = tune_model( best_model, search_library="tune-sklearn", search_algorithm="hyperopt", n_iter=20
)
tuned_best_model_optuna = tune_model( best_model, search_library="tune-sklearn", search_algorithm="optuna", n_iter=20
)
Apenas adicionando dois argumentos para tune_model()
você pode alternar da pesquisa aleatória para a otimização Bayesiana otimizada por tune-sklearn através Hiperopção or Optar. Lembre-se de que o PyCaret possui espaços de busca integrados para todos os modelos incluídos, mas você sempre pode passar pelo seu próprio, se desejar.
Mas quão bem eles se comparam à pesquisa aleatória?
Um experimento simples
Para ver como a otimização bayesiana se compara à pesquisa aleatória, conduzi um experimento muito simples. Usando o Conjunto de dados de preços de casas Kaggle, Criei dois modelos de regressão populares usando PyCaret - Floresta Aleatória e Rede Elástica. Em seguida, ajustei os dois usando o Random Search do scikit-learn e o Hyperopt e o Optuna Searchers do tune-sklearn (20 iterações para todos, minimizando RMSLE). O processo foi repetido três vezes com sementes diferentes e os resultados foram calculados. Abaixo está uma versão resumida do código - você pode encontrar o código completo SUA PARTICIPAÇÃO FAZ A DIFERENÇA.
from pycaret.datasets import get_data
from pycaret.regression import * data = get_data("house")
exp = setup( data, target = "SalePrice", test_data=data, # so that the entire dataset is used for cross validation - do not normally do this! session_id=42, fold=5
)
rf = create_model("rf")
en = create_model("en") tune_model(rf, search_library = "scikit-learn", optimize="RMSLE", n_iter=20)
tune_model(rf, search_library = "tune-sklearn", search_algorithm="hyperopt", n_iter=20)
tune_model(rf, search_library = "tune-sklearn", search_algorithm="optuna", optimize="RMSLE", n_iter=20) tune_model(en, search_library = "scikit-learn", optimize="RMSLE", n_iter=20)
tune_model(en, search_library = "tune-sklearn", search_algorithm="hyperopt", n_iter=20)
tune_model(en, search_library = "tune-sklearn", search_algorithm="optuna", optimize="RMSLE", n_iter=20)
Não é ótimo como a PyCaret torna as coisas tão fáceis? De qualquer forma, aqui estão as pontuações RMSLE que obtive em minha máquina:
Pontuações RMSLE do experimento
E para colocá-lo em perspectiva, aqui está a porcentagem de melhoria em relação à pesquisa aleatória:
Melhoria percentual em relação à pesquisa aleatória
Tudo isso usando o mesmo número de iterações em tempo comparável. Lembre-se de que, devido à natureza estocástica do processo, sua milhagem pode variar. Se sua melhoria não for perceptível, tente aumentar o número de iterações (n_iter
) do padrão 10. 20–30 geralmente é uma escolha sensata.
O que é ótimo sobre o Ray é que você pode facilmente escalar além de uma única máquina para um cluster de dezenas, centenas ou mais nós. Embora o PyCaret ainda não suporte a integração completa do Ray, é possível inicializar um Aglomerado de raios antes de sintonizar - e tune-sklearn irá usá-lo automaticamente.
exp = setup( data, target = "SalePrice", session_id=42, fold=5
) rf = create_model("rf") tune_model(rf, search_library = "tune-sklearn", search_algorithm="optuna", optimize="RMSLE", n_iter=20) # Will run on Ray cluster!
Desde que todas as configurações necessárias estejam no lugar ( RAY_ADDRESS
variável de ambiente), nada mais é necessário para aproveitar o poder da computação distribuída de Ray para ajuste de hiperparâmetros. Como a otimização de hiperparâmetros geralmente é a parte que exige mais desempenho na criação de um modelo de ML, o ajuste distribuído com o Ray pode economizar muito tempo.
Conclusão
Para acelerar a otimização de hiperparâmetros no PyCaret, tudo que você precisa fazer é instalar as bibliotecas necessárias e alterar dois argumentos em tune_model()
- e graças ao suporte integrado ao tune-sklearn, você pode aproveitar facilmente a computação distribuída de Ray para expandir além de sua máquina local.
Certifique-se de verificar a documentação para PyCaretName, Sintonia de raio e afinar-sklearn bem como os repositórios GitHub de PyCaretName e afinar-sklearn. Finalmente, se você tiver alguma dúvida ou quiser se conectar com a comunidade, participe PyCaret's Slack e Discurso de Ray.
Agradecimentos a Richard Liaw e Moez Ali pela revisão e conselhos.
Bio: Antonio Baum é estudante de mestrado em Ciência da Computação e Econometria, além de colaborador principal da PyCaret e colaborador do Ray Tune.
Óptimo estado. Original. Republicado com permissão.
Relacionado:
Histórias principais nos últimos 30 dias
Confira PrimeXBT
Negocie com os Parceiros CFD Oficiais do AC Milan
A maneira mais fácil de negociar criptografia.
Fonte: https://www.kdnuggets.com/2021/03/bayesian-hyperparameter-optimization-tune-sklearn-pycaret.html