📘 Lição 2: O Mapa do Tesouro — Compreendendo o Fluxo de Trabalho de um Projeto de Machine Learning

"Não comece a cozinhar sem uma receita. Não construa um modelo sem um plano."


⏱️ Duração estimada desta lição: 60-75 minutos


🧭 Por que esta lição é tão importante?

Muitos iniciantes cometem o mesmo erro: querem pular diretamente para o modelo.

"Quero treinar uma IA como o ChatGPT AGORA!"

Mas isso é como querer construir um avião sem saber o que é um parafuso.

Nesta lição, você não apenas aprenderá as etapas de um projeto de ML… você aprenderá por que cada etapa existe, o que acontece se você pulá-la, e como pensar como um cientista de dados desde o primeiro minuto.

No final, você terá um mapa mental claro que poderá aplicar a qualquer projeto: classificação de spam, previsão de preços, detecção de fraudes, diagnóstico médico, qualquer coisa!


🗺️ O Mapa do Tesouro: As 5 Etapas Douradas de um Projeto de ML

Imagine que você é um pirata procurando por tesouro enterrado. Você não pode simplesmente começar a cavar em qualquer lugar. Você precisa:

  1. Um mapa → Definir o problema.
  2. Procurar pistas → Obter e explorar os dados.
  3. Preparar suas ferramentas → Limpar e transformar os dados.
  4. Cavar no lugar certo → Treinar o modelo.
  5. Verificar se é ouro verdadeiro → Avaliar o modelo.

É exatamente isso que faremos em ML!

Vamos detalhar cada etapa, com exemplos reais, erros comuns e dicas de especialistas.


🧩 Etapa 1: Definir o Problema — O que você quer prever? Para quem? Por quê?

"Um problema bem definido já está meio resolvido."

Antes de tocar no código, antes de procurar dados… pare e pense.

🔍 Perguntas-chave que você deve se fazer:

  • O que eu quero prever?

    • Uma categoria? → Classificação (spam/ham, gato/cachorro, aprovado/reprovado).
    • Um número? → Regressão (preço da casa, temperatura, vendas mensais).
    • Uma sequência? → Geração (texto, música, código).
  • Quem usará essa previsão?

    • Um médico? → Você precisa de alta precisão, explicabilidade.
    • Um usuário de aplicativo? → Você precisa de velocidade, simplicidade.
    • Um CEO? → Você precisa de métricas de negócios claras.
  • Por que é importante resolver isso?

    • Isso economiza dinheiro? Salva vidas? Melhora a experiência do usuário?
    • Se você não pode responder a isso… talvez não valha a pena fazer.

🎯 Exemplo 1: Classificador de Spam

  • O que: Prever se uma mensagem é "spam" ou "ham" (não spam).
  • Quem: Usuários de e-mail ou SMS (eles querem menos spam).
  • Por quê: Reduzir tempo perdido, prevenir fraudes, melhorar a produtividade.

🎯 Exemplo 2: Preditor de Preços de Casas

  • O que: Prever o preço (número) de uma casa dadas suas características.
  • Quem: Compradores, vendedores, corretores de imóveis.
  • Por quê: Ajudar a definir preços justos, acelerar vendas, reduzir incerteza.

❌ Erro Comum #1: Pular esta etapa

"Vou usar este conjunto de dados do Titanic porque é legal."

Não! O conjunto de dados não é o objetivo. O problema é o objetivo. O conjunto de dados é apenas uma ferramenta para resolvê-lo.


📦 Etapa 2: Obter e Explorar os Dados — A Mina de Ouro (ou de Carvão)

"Dados são o novo petróleo… mas às vezes vêm cheios de lama."

Uma vez definido o problema, você precisa de dados. Sem dados, não há ML.

🔍 Onde conseguir dados?

  • Conjuntos de dados públicos: Kaggle, Hugging Face, UCI Machine Learning Repository, Google Dataset Search.
  • Seus próprios dados: Pesquisas, logs de aplicativos, histórico de vendas, etc.
  • APIs: Twitter, Reddit, Google Trends, etc.
  • Web scraping (com cuidado e ética): BeautifulSoup, Scrapy.

🎯 Exemplo: Conjunto de Dados de Spam de SMS

Usaremos isso neste curso. Está no Kaggle e é pequeno, limpo e perfeito para começar.

import pandas as pd

url = "https://raw.githubusercontent.com/justmarkham/DAT8/master/data/sms.tsv"
data = pd.read_csv(url, sep='\t', names=['label', 'message'])

🔍 Exploração Inicial: Conheça seus dados!

Nunca assuma que os dados estão limpos. Sempre os explore primeiro.

Faça-se estas perguntas:

  • Quantas linhas e colunas ele tem?
print(data.shape)  # (5572, 2) → 5572 mensagens, 2 colunas
  • Como são as primeiras linhas?
print(data.head())
  label                                            message
0   ham  Go until jurong point, crazy.. Available only ...
1   ham                      Ok lar... Joking wif u oni...
2  spam  Free entry in 2 a wkly comp to win FA Cup fina...
3   ham  U dun say so early hor... U c already then say...
4   ham  Nah I don't think he goes to usf, he lives aro...
  • Quantos valores únicos existem no rótulo?
print(data['label'].value_counts())
ham     4825
spam     747
Name: label, dtype: int64

→ Temos muito mais "ham" do que "spam"! Isso é importante (veremos na avaliação).

  • Existem valores nulos?
print(data.isnull().sum())

→ Neste caso, não. Mas na vida real, quase sempre há!

  • Como é a distribuição do comprimento das mensagens?
data['length'] = data['message'].apply(len)
print(data['length'].describe())
count    5572.000000
mean       80.489052
std        59.942492
min         2.000000
25%        36.000000
50%        61.000000
75%       111.000000
max       910.000000

→ Existem mensagens de até 910 caracteres! Serão spam? Serão normais?

import matplotlib.pyplot as plt
import seaborn as sns

sns.histplot(data=data, x='length', hue='label', bins=50)
plt.title("Distribuição do comprimento das mensagens por tipo")
plt.show()

→ Você verá que as mensagens de spam tendem a ser mais longas. Isso é uma pista valiosa!


🧹 Etapa 3: Preparar os Dados — Limpar, Transformar, Dividir

"Lixo entra, lixo sai." — Lei de Garbage In, Garbage Out (GIGO)

Modelos de ML são como motores de Fórmula 1: muito poderosos, mas muito sensíveis à qualidade do combustível.

🔧 Tarefas comuns de preparação:

1. Tratamento de valores nulos

# Se houvesse nulos, você poderia:
# data = data.dropna()  # Remover linhas com nulos
# ou
# data['column'] = data['column'].fillna(data['column'].mean())  # Preencher com a média

2. Codificação de rótulos (se for classificação)

# Converter 'ham'/'spam' para 0/1
data['label'] = data['label'].map({'ham': 0, 'spam': 1})

3. Dividir em treino e teste

Nunca, nunca, nunca treine e avalie com os mesmos dados!

from sklearn.model_selection import train_test_split

X = data['message']  # Características
y = data['label']    # Alvo

X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.2,   # 20% para teste
    random_state=42  # Para resultados reproduzíveis
)

print(f"Treino: {len(X_train)} mensagens")
print(f"Teste: {len(X_test)} mensagens")

4. Vetorização (converter texto em números)

Modelos não entendem texto. Eles entendem números.

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)  # Aprender vocabulário + transformar
X_test_vec = vectorizer.transform(X_test)        # Apenas transformar (não aprender!)

print(f"Vocabulário: {len(vectorizer.vocabulary_)} palavras únicas")
print(f"Formato de X_train_vec: {X_train_vec.shape}")  # (4457, 7358) → 4457 mensagens, 7358 palavras

📌 O que o CountVectorizer faz?

  • Cria um vocabulário com todas as palavras únicas em X_train.
  • Para cada mensagem, conta quantas vezes cada palavra aparece.
  • Converte cada mensagem em um vetor de números (frequências).

Exemplo:

Mensagem: "free money now"
Vocabulário: ['free', 'money', 'now', 'click', 'here', ...]

Vetor: [1, 1, 1, 0, 0, ...] → "free" aparece 1 vez, "money" 1 vez, etc.

🤖 Etapa 4: Treinar o Modelo — A Magia (que não é mágica)

"É aqui que o computador aprende… mas você dá as ferramentas."

Agora, chegou a hora de treinar!

🔧 Escolhendo um algoritmo

Para classificação de texto, um bom ponto de partida é Naive Bayes Multinomial.

Por quê?

  • É simples, rápido e funciona surpreendentemente bem com texto.
  • Não precisa de muito poder.
  • É robusto contra dados desbalanceados (como nosso conjunto de dados, com mais "ham" do que "spam").
from sklearn.naive_bayes import MultinomialNB

model = MultinomialNB()
model.fit(X_train_vec, y_train)  # Treinar o modelo!

📌 O que o fit() faz?

  • Aprende as probabilidades:
    • Quais palavras aparecem mais em spam?
    • Quais palavras aparecem mais em ham?
  • Salva essas probabilidades internamente.

É isso! Seu modelo agora "sabe" como distinguir spam de ham.


📈 Etapa 5: Avaliar o Modelo — Funciona… ou apenas acha que funciona?

"Não confie no seu modelo. Ponha-o à prova."

Treinar é fácil. Avaliar bem é o que separa amadores de profissionais.

🔍 Prever no conjunto de teste

y_pred = model.predict(X_test_vec)

📊 Calcular métricas

Acurácia (precisão geral)

from sklearn.metrics import accuracy_score

acc = accuracy_score(y_test, y_pred)
print(f"Acurácia: {acc:.4f}")  # Ex.: 0.9825 → 98.25% corretos

→ Parece excelente! Mas é suficiente?

Matriz de confusão

from sklearn.metrics import confusion_matrix
import seaborn as sns

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', 
            xticklabels=['Ham', 'Spam'], 
            yticklabels=['Ham', 'Spam'])
plt.title("Matriz de Confusão")
plt.ylabel("Verdadeiro")
plt.xlabel("Previsto")
plt.show()

→ Ele mostrará algo como:

          Previsto
          Ham  Spam
Verdadeiro
Ham       950    5
Spam       10   150

→ O que isso significa?

  • Verdadeiros Negativos (VN): 950 mensagens ham classificadas corretamente.
  • Falsos Positivos (FP): 5 mensagens ham classificadas como spam (erro grave!).
  • Falsos Negativos (FN): 10 mensagens spam classificadas como ham (erro grave!).
  • Verdadeiros Positivos (VP): 150 mensagens spam classificadas corretamente.

Relatório de classificação

from sklearn.metrics import classification_report

print(classification_report(y_test, y_pred, target_names=['Ham', 'Spam']))
              precision    recall  f1-score   support

         Ham       0.99      0.99      0.99       955
        Spam       0.97      0.94      0.95       160

    accuracy                           0.98      1115
   macro avg       0.98      0.97      0.97      1115
weighted avg       0.98      0.98      0.98      1115

📌 O que significam essas métricas?

  • Precisão: De todos aqueles que eu disse que eram spam, quantos realmente eram?
    → Spam: 0.97 → 97% das mensagens marcadas como spam eram spam. Bom!

  • Revocação (Sensibilidade): De todo spam que existia, quantos eu detectei?
    → Spam: 0.94 → Eu detectei 94% do spam. Muito bom!

  • F1-Score: Média harmônica de precisão e revocação. Ideal para dados desbalanceados.


🔄 O Ciclo de Melhoria: Nunca termina aqui

Não pare na primeira versão!

Agora que você tem uma base, você pode:

  • Experimentar outro vetorizador (TfidfVectorizer).
  • Experimentar outro modelo (LogisticRegression, SVM).
  • Adicionar mais dados.
  • Melhorar a limpeza do texto (remover palavras de parada, lematizar).
  • Ajustar hiperparâmetros.

Ciência de dados é iterativa. Nunca há uma "versão final." Sempre há espaço para melhorias.


❌ Erros Comuns nesta Etapa (Evite-os!)

  1. Avaliar nos dados de treinamento → Dá uma falsa sensação de sucesso.
  2. Não dividir treino/teste → Você não sabe se seu modelo generaliza.
  3. Usar apenas acurácia em dados desbalanceados → Pode esconder erros graves.
  4. Não explorar os dados primeiro → Você perde padrões, erros, oportunidades.
  5. Não documentar o que você faz → Amanhã você não lembrará por que fez algo.

✅ Checklist desta lição — O que você deve entender agora?

☐ As 5 etapas de um projeto de ML e por que cada uma é crucial.
☐ Como explorar um conjunto de dados antes de usá-lo.
☐ Por que dividir em treino/teste é obrigatório.
☐ Como converter texto em números (vetorização).
☐ Como treinar um modelo com fit().
☐ Como avaliá-lo com acurácia, matriz de confusão e relatório de classificação.
☐ Que o primeiro modelo nunca é o último… sempre há espaço para melhorias!


🎯 Frase para lembrar:

"Em ML, a coisa mais importante não é o modelo… é o processo."


← Anterior: Lição 1: Bem-vindo à IA | Próximo: Lição 3: Exploração de Dados →

Course Info

Course: AI-course0

Language: PT

Lesson: 2 ml workflow