Treinar modelos de previsão com AutoML Python API

Este exemplo de caderno mostra como treinar um modelo de previsão de séries temporais em Databricks usando a API Python do AutoML. Usando um conjunto de dados de contagem de casos de COVID-19, faz uma chamada ao automl.forecast() com um horizonte de 30 dias para projetar os números futuros de casos, depois carrega o melhor modelo com MLflow para gerar e traçar previsões.

Requirements

Databricks Runtime para Machine Learning 10.0 ou superior.
Para guardar previsões de modelos, Databricks Runtime for Machine Learning 10.5 ou superior.

Conjunto de dados COVID-19

O conjunto de dados contém registos do número de casos do vírus COVID-19 por data nos EUA, com informação geográfica adicional. O objetivo é prever quantos casos do vírus ocorrerão nos próximos 30 dias nos EUA.

import pyspark.pandas as ps
df = ps.read_csv("/databricks-datasets/COVID/covid-19-data")
df["date"] = ps.to_datetime(df['date'], errors='coerce')
df["cases"] = df["cases"].astype(int)
display(df)

Formação em AutoML

O comando seguinte inicia uma execução do AutoML. Deve fornecer a coluna que o modelo deve prever no argumento target_col e especificar a coluna de tempo. Quando a corrida terminar, pode seguir o link para o melhor caderno de testes para examinar o código de treino.

Este exemplo também especifica:

  • horizon=30 para especificar que o AutoML deveria prever para 30 dias no futuro.
  • frequency="d" especificar que deveria ser fornecida uma previsão para cada dia.
  • primary_metric="mdape" para especificar a métrica a otimizar durante o treino.

Nota

automl.forecast() está disponível apenas no Classic Compute.

import databricks.automl
import logging

# Disable informational messages from fbprophet
logging.getLogger("py4j").setLevel(logging.WARNING)

# Note: If you are running Databricks Runtime for Machine Learning 10.4 or below, use this line instead:
# summary = databricks.automl.forecast(df, target_col="cases", time_col="date", horizon=30, frequency="d",  primary_metric="mdape")

summary = databricks.automl.forecast(df, target_col="cases", time_col="date", horizon=30, frequency="d",  primary_metric="mdape", output_database="default")

Iterar sobre o modelo

  • Explore os cadernos e experimentos acima mencionados.
  • Se as métricas para o melhor caderno de teste estiverem boas, podes continuar com a célula seguinte.
  • Se quiser melhorar o modelo gerado pelo melhor ensaio:
    • Vai ao caderno com o melhor teste e clona-o.
    • Edite o caderno conforme necessário para melhorar o modelo.
    • Quando estiver satisfeito com o modelo, note o URI onde o artefacto do modelo treinado é registado. Atribui este URI à model_uri variável na célula seguinte.

Mostrar os resultados previstos do melhor modelo

Nota: Esta secção requer Databricks Runtime para Machine Learning 10.5 ou superior.

Previsões de carga a partir do melhor modelo

No Databricks Runtime para Machine Learning 10.5 ou superior, se for fornecido output_database, o AutoML guarda as previsões do melhor modelo.

# Load the saved predictions.
forecast_pd = spark.table(summary.output_table_name)
display(forecast_pd)

Utilizar o modelo para previsão

Pode usar os comandos desta secção com Databricks Runtime for Machine Learning 10.0 ou superior.

Carregue o modelo com MLflow

O MLflow permite importar facilmente modelos de volta para Python usando o AutoML trial_id .

import mlflow.pyfunc
from mlflow.tracking import MlflowClient

run_id = MlflowClient()
trial_id = summary.best_trial.mlflow_run_id

model_uri = "runs:/{run_id}/model".format(run_id=trial_id)
pyfunc_model = mlflow.pyfunc.load_model(model_uri)

Usar o modelo para fazer previsões

Chame o método do modelo predict_timeseries para gerar previsões.
No Databricks Runtime, para Machine Learning 10.5 ou superior, pode definir include_history=False para obter apenas os dados previstos.

forecasts = pyfunc_model._model_impl.python_model.predict_timeseries()
display(forecasts)

# Option for Databricks Runtime for Machine Learning 10.5 or above
# forecasts = pyfunc_model._model_impl.python_model.predict_timeseries(include_history=False)

Plote os pontos previsíveis

No gráfico abaixo, a linha preta espessa mostra o conjunto de dados da série temporal, e a linha azul é a previsão criada pelo modelo.

df_true = df.groupby("date").agg(y=("cases", "avg")).reset_index().to_pandas()
import matplotlib.pyplot as plt

fig = plt.figure(facecolor='w', figsize=(10, 6))
ax = fig.add_subplot(111)
forecasts = pyfunc_model._model_impl.python_model.predict_timeseries(include_history=True)
fcst_t = forecasts['ds'].dt.to_pydatetime()
ax.plot(df_true['date'].dt.to_pydatetime(), df_true['y'], 'k.', label='Observed data points')
ax.plot(fcst_t, forecasts['yhat'], ls='-', c='#0072B2', label='Forecasts')
ax.fill_between(fcst_t, forecasts['yhat_lower'], forecasts['yhat_upper'],
                color='#0072B2', alpha=0.2, label='Uncertainty interval')
ax.legend()
plt.show()

Registar e implementar o modelo

Pode registar e implementar um modelo treinado por AutoML como qualquer outro modelo no MLflow Model Registry. Veja Log, load e registe modelos MLflow.

Resolução de Problemas: No module named pandas.core.indexes.numeric

Ao servir um modelo treinado em AutoML com o Mosaic AI Model Serving, pode ver o erro No module named pandas.core.indexes.numeric. Isto acontece quando a pandas versão usada pelo AutoML difere daquela no ambiente de endpoint de serviço do modelo. Para resolver:

  1. Faça o download do add-pandas-dependency.py script. O script edita requirements.txt e conda.yaml para fixar pandas==1.5.3 no modelo registado.
  2. Edite o script para incluir a run_id da execução do MLflow onde o modelo foi registado.
  3. Regista novamente o modelo.
  4. Sirva a nova versão do modelo.

Bloco de notas de exemplo

Treinar modelos de previsão com AutoML Python API

Obter de bloco de notas

Próximos passos

Referência da API Python do AutoML.