“`html
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.
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.
“`
Sou Apaixonado pela programação e estou trilhando o caminho de ter cada diz mais conhecimento e trazer toda minha experiência vinda do Design para a programação resultando em layouts incríveis e idéias inovadoras! Conecte-se Comigo!