Treinar modelos de previsão com a API do AutoML Python

Este notebook de exemplo mostra como treinar um modelo de previsão de série temporal no Databricks usando a API de Python AutoML. Usando um conjunto de dados de contagem de casos COVID-19, você chama automl.forecast() com um horizonte diário de 30 dias para projetar contagens de casos futuros e, em seguida, carrega o melhor modelo com o MLflow para gerar e plotar previsões.

Requirements

Databricks Runtime para Machine Learning 10.0 ou superior.
Para salvar previsões de modelo, é necessário o Databricks Runtime para Machine Learning 10.5 ou superior.

Conjunto de dados COVID-19

O conjunto de dados contém registros para o número de casos do vírus COVID-19 por data nos EUA, com informações geográficas adicionais. A meta é 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)

Treinamento do AutoML

O comando a seguir inicia uma execução de AutoML. Você deve fornecer a coluna que o modelo deve prever no argumento target_col e a coluna correspondente ao tempo. Quando a execução for concluída, você poderá seguir o link para o melhor notebook de experimento para examinar o código de treinamento.

Este exemplo também especifica:

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

Observação

automl.forecast() só está disponível na computação clássica.

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 no modelo

  • Explore os blocos de anotações e experimentos vinculados acima.
  • Se as métricas para o melhor bloco de anotações de teste estiverem adequadas, você pode continuar com a próxima célula.
  • Se você quiser melhorar o modelo gerado pelo melhor teste:
    • Vá para o bloco de anotações com a melhor avaliação e clone-o.
    • Edite o bloco de anotações conforme necessário para melhorar o modelo.
    • Quando estiver satisfeito com o modelo, anote o URI onde o artefato do modelo treinado está registrado. Atribua esse URI à model_uri variável na próxima célula.

Mostrar os resultados previstos do melhor modelo

Note: Esta seção requer o Databricks Runtime para Machine Learning 10.5 ou superior.

Carregar previsões do melhor modelo

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

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

Usar o modelo para previsão

Você pode usar os comandos nesta seção com o Databricks Runtime para Machine Learning 10.0 ou superior.

Carregue o modelo com o MLflow

O MLflow permite que você importe 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 predict_timeseries método de modelo para gerar previsões.
No Databricks Runtime para Machine Learning 10.5 ou superior, você 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)

Plotar os pontos previstos

No gráfico abaixo, a linha preta grossa 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()

Registrar e implantar o modelo

Você pode registrar e implantar um modelo treinado pelo AutoML como qualquer outro modelo no Registro de Modelo do MLflow. Consulte Logar, carregar e registrar modelos de MLflow.

Solucionando problemas: No module named pandas.core.indexes.numeric

Ao servir um modelo treinado por AutoML com o Model Serving, você poderá ver o erro No module named pandas.core.indexes.numeric. Isso acontece quando a pandas versão usada pelo AutoML é diferente daquela no ambiente de endpoint de serviço do modelo. Para resolver esse erro:

  1. Baixe o script add-pandas-dependency.py. O script edita requirements.txt e conda.yaml no modelo registrado para fixar pandas==1.5.3.
  2. Edite o script para incluir a execução do MLflow run_id onde o modelo foi registrado.
  3. Registre novamente o modelo.
  4. Serve a nova versão do modelo.

Caderno de exemplo

Treinar modelos de previsão com a API do AutoML Python

Obter notebook

Próximas etapas

Referência da API Python do AutoML.