Como guardar e carregar um modelo com joblib em Python
Depois de treinar um modelo de Machine Learning, voltar a treiná-lo sempre que precisas de uma previsão é um desperdício de tempo e de recursos. A solução é guardar o modelo num ficheiro e carregá-lo quando for preciso — num script, numa API ou num serviço em produção. Vais aprender a guardar e carregar um modelo com joblib, a forma mais comum de o fazer no ecossistema scikit-learn, com um exemplo pronto a correr.
Pré-requisitos
- Python 3.9 ou superior instalado.
- scikit-learn instalado com
pip install scikit-learn. Ojoblibjá vem incluído como dependência. - Noções básicas de como treinar um modelo (usamos um exemplo simples e reproduzível).
Passo 1: Treinar um modelo de exemplo
Para o resultado ser reproduzível, treinamos um classificador sobre o dataset Iris, que já acompanha o scikit-learn. Podes trocar por qualquer modelo teu — o processo de gravação é igual.
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42)
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
print("Accuracy:", model.score(X_test, y_test))
Passo 2: Guardar o modelo com joblib.dump
Com o modelo treinado, guardá-lo em disco é uma só linha. A função joblib.dump recebe o objeto do modelo e o nome do ficheiro; por convenção usamos a extensão .joblib.
import joblib
joblib.dump(model, "iris_model.joblib")
Isto cria o ficheiro iris_model.joblib na pasta atual, com tudo o que o modelo aprendeu. O scikit-learn recomenda o joblib em vez do pickle padrão porque é mais eficiente a guardar objetos com grandes arrays NumPy, como os que existem dentro de florestas ou redes neuronais.
Passo 3: Carregar o modelo e fazer uma previsão
Noutro script — ou noutro dia — carregas o modelo com joblib.load e usá-lo como se o tivesses acabado de treinar. Repara que não é preciso chamar fit outra vez.
import joblib
loaded_model = joblib.load("iris_model.joblib")
# Predict a new sample (4 measurements of one flower)
new_sample = [[5.1, 3.5, 1.4, 0.2]]
print("Predicted class:", loaded_model.predict(new_sample))
O modelo carregado tem exatamente o mesmo estado do original, por isso devolve as mesmas previsões.
Passo 4: Guardar todo o Pipeline (evita um erro comum)
Um erro muito frequente é guardar só o modelo e esquecer o pré-processamento — por exemplo, o StandardScaler que normalizou os dados. Se o treino usou dados transformados, a previsão tem de aplicar exatamente a mesma transformação. A forma segura é juntar tudo num Pipeline e guardar o pipeline inteiro num único ficheiro.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
pipeline = Pipeline([
("scaler", StandardScaler()),
("clf", LogisticRegression(max_iter=1000)),
])
pipeline.fit(X_train, y_train)
joblib.dump(pipeline, "iris_pipeline.joblib")
Agora o ficheiro guarda a normalização e o modelo. Ao carregar o pipeline, o pré-processamento é aplicado automaticamente antes de cada previsão, e deixas de correr o risco de esquecer um passo.
Verificar o resultado
Para confirmar que a gravação correu bem, compara as previsões do modelo original com as do modelo carregado — têm de ser idênticas:
import numpy as np
original = model.predict(X_test)
loaded = joblib.load("iris_model.joblib").predict(X_test)
print("Identical?", np.array_equal(original, loaded)) # True
Confirma também que o ficheiro iris_model.joblib existe na pasta. Se aparecer um aviso de versão ao carregar, garante que usas a mesma versão do scikit-learn com que gravaste, porque versões diferentes podem causar incompatibilidades.
Segurança: carrega apenas ficheiros.joblibde fontes em que confias. Tal como opickle, o joblib pode executar código ao carregar um ficheiro, por isso nunca abras modelos de origem desconhecida.
Conclusão
Já consegues guardar e carregar um modelo com joblib e, mais importante, guardar o Pipeline completo para que o pré-processamento viaje sempre com o modelo. O próximo passo natural é versionar os ficheiros (por exemplo, iris_model_v1.joblib) e servir as previsões através de uma API. Que nome vais dar ao teu primeiro modelo em produção?