"Não comece a cozinhar sem uma receita. Não construa um modelo sem um plano."
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!
Imagine que você é um pirata procurando por tesouro enterrado. Você não pode simplesmente começar a cavar em qualquer lugar. Você precisa:
É exatamente isso que faremos em ML!
Vamos detalhar cada etapa, com exemplos reais, erros comuns e dicas de especialistas.
"Um problema bem definido já está meio resolvido."
Antes de tocar no código, antes de procurar dados… pare e pense.
O que eu quero prever?
Quem usará essa previsão?
Por que é importante resolver isso?
"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.
"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.
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'])
Nunca assuma que os dados estão limpos. Sempre os explore primeiro.
Faça-se estas perguntas:
print(data.shape) # (5572, 2) → 5572 mensagens, 2 colunas
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...
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).
print(data.isnull().sum())
→ Neste caso, não. Mas na vida real, quase sempre há!
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!
"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.
# 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
# Converter 'ham'/'spam' para 0/1
data['label'] = data['label'].map({'ham': 0, 'spam': 1})
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")
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?
X_train.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.
"É aqui que o computador aprende… mas você dá as ferramentas."
Agora, chegou a hora de treinar!
Para classificação de texto, um bom ponto de partida é Naive Bayes Multinomial.
Por quê?
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(X_train_vec, y_train) # Treinar o modelo!
📌 O que o fit() faz?
É isso! Seu modelo agora "sabe" como distinguir spam de ham.
"Não confie no seu modelo. Ponha-o à prova."
Treinar é fácil. Avaliar bem é o que separa amadores de profissionais.
y_pred = model.predict(X_test_vec)
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?
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?
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.
Não pare na primeira versão!
Agora que você tem uma base, você pode:
TfidfVectorizer).LogisticRegression, SVM).Ciência de dados é iterativa. Nunca há uma "versão final." Sempre há espaço para melhorias.
☐ 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!
"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: AI-course0
Language: PT
Lesson: 2 ml workflow