Guia de Engenharia de ML & MLOps

Referência rápida passo a passo do Tech Challenge (Fase 1)

Passo 1 Entendimento do Negócio & CRISP-DM
Mapeamento da dor do negócio, alinhamento de KPIs x Métricas Técnicas e método STAR.

Conceitos Vitais:

  • CRISP-DM: A fase inicial é sempre o Business Understanding antes de escrever qualquer código.
  • KPI de Negócio vs. Métrica Técnica: O KPI mede impacto financeiro/operacional (ex.: Reduzir o Churn mensal em 10%), enquanto a Métrica Técnica mede a performance do modelo (ex.: Recall, ROC-AUC).
  • Método STAR: Estrutura para o vídeo final: Situation, Task, Action, Result.
Passo 2 Análise Exploratória (EDA) & Limpeza de Dados
Tratamento de nulos, conversão de tipos de dados e One-Hot Encoding no dataset Telco Churn.
# 1. Converter Total Charges para numérico
df['Total Charges'] = pd.to_numeric(df['Total Charges'], errors='coerce').fillna(0)

# 2. Mapear variável target
df['target'] = df['Churn Label'].map({'No': 0, 'Yes': 1})

# 3. Remover colunas de vazamento (Data Leakage)
X = df.drop(columns=['CustomerID', 'Churn Reason', 'Churn Score', 'target'])
X = pd.get_dummies(X, drop_first=True)
Passo 3 Modelo Baseline & Prevenção de Data Leakage
Treinamento do baseline com Regressão Logística e divisão estratificada com StandardScaler.

Regra de Ouro: Aplicar fit_transform() no conjunto de treino e apenas transform() no teste/produção para evitar contaminação estatística (Data Leakage).

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

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

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model = LogisticRegression(random_state=42)
model.fit(X_train_scaled, y_train)
Passo 4 Modelos Avançados & Validação Cruzada (K-Fold)
Comparativo entre Regressão Logística, Random Forest e MLP Neural Net via 5-Fold Stratified CV.

Por que a Regressão Logística venceu? Pelo princípio da parcimônia (Navalha de Occam): apresentou as melhores métricas gerais, menor variância no CV (94.11% ± 1.01%) e menor custo computacional para produção.

Passo 5 Modularização em src/ & Scikit-Learn Pipeline
Organização do código em src/data.py e src/train.py com serialização via Joblib.
from sklearn.pipeline import Pipeline
import joblib

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', LogisticRegression(random_state=42))
])
pipeline.fit(X_train, y_train)

joblib.dump(pipeline, 'models/model_pipeline.joblib')
Passo 6 Testes Automatizados com Pytest
Criação da suite de testes unitários para garantir integridade dos dados e do split.
# Executar testes no terminal
python3 -m pytest
Passo 7 API REST com FastAPI & Pydantic
Servindo o modelo treinado com endpoints /health e /predict.
# Rodar o servidor de API
uvicorn src.api:app --reload
# Acesse a documentação em: http://127.0.0.1:8000/docs
Passo 8 Rastreamento de Experimentos com MLflow
Registro de hiperparâmetros, métricas e modelos na dashboard do MLflow.
import mlflow

mlflow.set_experiment("Telco_Churn_Experimentation")
with mlflow.start_run():
    mlflow.log_params(params)
    mlflow.log_metric("recall", rec)
    mlflow.sklearn.log_model(pipeline, "model")

# Rodar interface do MLflow
python3 -m mlflow ui