(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como guardar e carregar um modelo com joblib em Python

João Barros 09 de July de 2026 4 min de leitura

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. O joblib já 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 .joblib de fontes em que confias. Tal como o pickle, 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?