Erros Comuns em Machine Learning que Você Deve Evitar (Guia Completo)

Erros Comuns em Machine Learning que Você Deve Evitar (Guia Completo)

“`html





Erros comuns em Machine Learning que você deve evitar


Boas práticas
para aprender mais rápido e errar menos

Erros comuns em Machine Learning que você deve evitar

Eu vejo os mesmos deslizes repetirem em projetos que “quase” funcionam: dados fora de contexto, validação mal definida,
métricas escolhidas sem critério e pipelines inconsistentes. A seguir, eu listo os erros mais comuns e como corrigir.

validação
engenharia de dados
métricas
reprodutibilidade


Misturar dados de treino e teste (leakage)

Esse é o erro mais traiçoeiro: o desempenho fica “perfeito” durante a avaliação e despenca na prática.
Normalmente, acontece quando informações do futuro entram no passado — por exemplo, quando algum pré-processamento
usa estatísticas calculadas no conjunto inteiro.

!

Se você faz normalização, imputação ou seleção de atributos usando os dados completos antes de dividir treino/teste,
você está permitindo que o modelo “veja” padrões do teste.

!

Em séries temporais e dados com dependência por usuário, o erro pode vir da forma como você faz o split:
aleatório, por linha, ignora a estrutura real do problema.

Como evitar: aplique o pré-processamento apenas com o treino e replique o mesmo transformador no teste.
Para dados dependentes, use splits por tempo ou por entidade (ex.: usuário, sessão, região).


Avaliar com a métrica errada (ou sem refletir custos)

Escolher uma métrica “bonita” sem alinhamento com o objetivo é um caminho rápido para decisões ruins.
A curva pode melhorar, mas o resultado operacional piora — especialmente em classificação desbalanceada.

  • Acurácia costuma enganar quando classes são desbalanceadas.
  • Log-loss pode penalizar excesso de confiança, mas você precisa entender se isso representa seu custo real.
  • F1-score esconde trade-offs: qual erro você aceita mais (falso positivo vs falso negativo)?
  • RMSE/MAE ignoram assimetria do problema quando superestimar e subestimar têm impactos diferentes.

Como evitar: defina a métrica com base no custo (ou intenção) do negócio e use um conjunto de métricas
coerentes com a etapa (treino, validação, teste). Se dá para medir custo diretamente, melhor ainda.

Um bom sinal: você consegue explicar o que acontece com o sistema quando a métrica melhora — e isso é consistente com o uso real.


Pré-processamento inconsistente entre treino e produção

Um projeto “funciona” no notebook e falha depois por causa de divergência de transformações:
encoding diferente, ordem de colunas alterada, tratamento de valores ausentes ausente, escalonamento calculado errado.

  • Normalização baseada em estatísticas do treino não é reaplicada do mesmo jeito.
  • Campos categóricos: valores novos surgem e você não define fallback.
  • Datas/horários: timezone e granularidade mudam sem controle.
  • Imputação: estratégia muda (ou é diferente entre treino/teste).
!

Como evitar: trate transformações como parte do experimento. Considere validar “data contracts”:
tipos, ranges e presença de colunas esperadas.

!

Eu gosto de medir o quanto a distribuição muda no teste/produção (ex.: drift de categorias e estatísticas numéricas).
Isso não resolve tudo, mas evita surpresa tardia.


Não controlar o procedimento experimental (reprodutibilidade)

Mesmo com dados bons e métricas corretas, você pode “perder” o que funcionou por falta de rastreabilidade.
Isso aparece como: variações silenciosas de seed, splits diferentes a cada execução, e hiperparâmetros ajustados sem registro.

  • Seeds inconsistentes tornam comparações injustas.
  • Splits recalculados sem fixar critério dificultam depuração.
  • Configurações espalhadas: cada ajuste vira uma versão diferente do pipeline.
  • Critérios de parada frágeis: você para quando “parece bom”, não quando está claro.

Como evitar: padronize o fluxo (split → fit → validar → testar), registre parâmetros e mantenha o conjunto de avaliação fixo.
Se você troca uma etapa, troque uma variável por vez — e compare de forma honesta.

# Exemplo (Python): split honesto + pré-processamento aplicado só no treino
# Observação: ajuste para seu caso (classificação/regressão, numéricos/categóricos).

from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
import numpy as np

RANDOM_SEED = 42

X = ...  # features em DataFrame
y = ...  # target

num_cols = ["idade", "renda"]            # exemplo
cat_cols = ["cidade", "canal"]          # exemplo

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=RANDOM_SEED, stratify=y
)

numeric_tf = Pipeline(steps=[
    ("imputer", SimpleImputer(strategy="median")),
    ("scaler", StandardScaler())
])

categorical_tf = Pipeline(steps=[
    ("imputer", SimpleImputer(strategy="most_frequent")),
    ("onehot", OneHotEncoder(handle_unknown="ignore"))
])

preprocess = ColumnTransformer(
    transformers=[
        ("num", numeric_tf, num_cols),
        ("cat", categorical_tf, cat_cols),
    ],
    remainder="drop"
)

model = LogisticRegression(max_iter=2000, random_state=RANDOM_SEED)

clf = Pipeline(steps=[
    ("preprocess", preprocess),
    ("model", model)
])

clf.fit(X_train, y_train)

# Métrica em teste: sem ajustes após fit
proba = clf.predict_proba(X_test)[:, 1]
auc = roc_auc_score(y_test, proba)

print({"roc_auc_test": float(auc)})

Esse padrão força consistência: o pré-processamento “aprende” no treino e só transforma o teste com o mesmo criterio.

Quer evoluir mais rápido com fundamentos práticos?

Agora que você sabe os erros mais comuns, eu recomendo que você leia os próximos posts:
eles aprofundam diagnóstico, validação e decisão prática para você parar de “caçar” melhorias e começar a construir soluções confiáveis.

Dica rápida: se uma métrica melhorou, pergunte sempre “o que mudou no procedimento?”. A resposta costuma revelar o erro.



“`