devlog.blog

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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *