Machine Learning na prática: do zero ao MVP em 7 passos
Você já viu mil tutoriais. Agora é hora de colocar algo utilizável no ar, que gere feedback real e possa virar dinheiro. Sem floreio: siga o plano, copie o código, publique hoje.
O plano em 7 passos
Escolha um problema que alguém pagaria para resolver.
Defina uma métrica que vire horas/dinheiro.
Separe um CSV limpo e versionado.
Crie um baseline simples e comparável.
Construa um pipeline único (treino e predição).
Valide sem vazamento e com estratificação.
Exponha via API e colete feedback real.
Exemplo direto: classificador de “Ticket Urgente”
python -m venv .venv && source .venv/bin/activate
pip install pandas scikit-learn joblib fastapi uvicorn
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report
import joblib
df = pd.read_csv(“tickets.csv”) # cols: titulo, descricao, categoria, eh_urgente(0/1)
X = df[[“titulo”,”descricao”,”categoria”]]
y = df[“eh_urgente”]
pre = ColumnTransformer([
(“desc”, TfidfVectorizer(max_features=8000, ngram_range=(1,2)), “descricao”),
(“tit”, TfidfVectorizer(max_features=3000, ngram_range=(1,2)), “titulo”),
(“cat”, OneHotEncoder(handle_unknown=”ignore”), [“categoria”])
], remainder=”drop”, verbose_feature_names_out=False)
pipe = Pipeline([
(“prep”, pre),
(“clf”, LogisticRegression(max_iter=300, class_weight=”balanced”))
])
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
pipe.fit(Xtr, ytr)
pred = pipe.predict(Xte)
print(classification_report(yte, pred, digits=3))
joblib.dump(pipe, “modelo_tickets.joblib”)
from fastapi import FastAPI
import joblib, pandas as pd
app = FastAPI()
model = joblib.load(“modelo_tickets.joblib”)
@app.post(“/priorizar”)
def priorizar(payload: dict):
X = pd.DataFrame([{
“titulo”: payload.get(“titulo”,””),
“descricao”: payload.get(“descricao”,””),
“categoria”: payload.get(“categoria”,””)
}])
proba = float(model.predict_proba(X)[0][1])
prioridade = “URGENTE” if proba >= 0.6 else “NORMAL”
return {“prioridade”: prioridade, “score”: round(proba,3)}
Pronto agora é só rodar com python seuarquivprincipal.py e logo após uvicorn api:app –reload
Métricas que importam
Recall no positivo (não deixar urgente escapar).
Precision no positivo (não entupir a fila).
Horas poupadas/semana convertidas em ROI.
Tenho um desafio para você!
Suba essa API, coloque um painel simples para sua equipe e colete 7 dias de feedback. Depois itere: ajuste threshold, reequilibre classes, teste outro algoritmo — e mostre o antes/depois em horas poupadas.