Seu Primeiro Modelo de IA
Chegou a hora! Você já aprendeu a preparar dados como um profissional. Agora vamos criar um modelo de Machine Learning que realmente funciona e gera previsões precisas.
Não vai ser mais um exemplo teórico - vamos resolver um problema real, com dados reais, e você vai ver sua IA funcionando na prática.
O que você vai construir hoje:
1. Modelo de Previsão: Sistema que prevê preços de casas
2. Pipeline Completo: Da entrada de dados até a predição final
3. Avaliação Profissional: Métricas para medir qualidade do modelo
4. Otimização: Como melhorar a performance
5. Deploy Básico: Colocar o modelo para funcionar
Escolhendo o Algoritmo Certo
Existem dezenas de algoritmos. Como escolher o melhor? Vou te mostrar os mais importantes:
📈
Regressão Linear
Usa quando: Relação linear entre variáveis
Vantagens: Simples, interpretável, rápida
Exemplo: Preço = 150 * área + 50000
🌳
Random Forest
Usa quando: Relações complexas, many features
Vantagens: Funciona bem na maioria dos casos
Exemplo: Combina várias árvores de decisão
🎯
Gradient Boosting
Usa quando: Quer máxima precisão
Vantagens: Muito preciso, ganha competições
Exemplo: XGBoost, LightGBM
Projeto: Previsão de Preços de Casas
Vamos criar um modelo que prevê o preço de imóveis baseado em características como área, localização, quartos, etc.
Dataset: Boston Housing
Usaremos dados reais de casas vendidas em Boston. Inclui 13 características diferentes como criminalidade da região, número de quartos, distância do centro, etc.
Objetivo: Prever o preço (em milhares de dólares) baseado nessas características.
Código Completo do Modelo
# Importações necessárias
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
import matplotlib.pyplot as plt
import seaborn as sns
print("🚀 Iniciando o projeto de previsão de preços...")
# 1. CARREGAMENTO E EXPLORAÇÃO DOS DADOS
print("\n📊 Carregando dados...")
boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = pd.Series(boston.target, name='price')
print(f"Shape dos dados: {X.shape}")
print(f"Características: {list(X.columns)}")
print(f"Preço médio: ${y.mean():.2f}k")
print(f"Preço mín: ${y.min():.2f}k, máx: ${y.max():.2f}k")
# 2. ANÁLISE EXPLORATÓRIA RÁPIDA
print("\n🔍 Análise exploratória...")
# Correlação com o preço
correlations = X.corrwith(y).sort_values(ascending=False)
print("Top 5 características mais correlacionadas com preço:")
print(correlations.head())
# Verificar dados faltantes
print(f"\nDados faltantes: {X.isnull().sum().sum()}")
# Estatísticas básicas
print(f"\nResumo estatístico:")
print(X.describe().round(2))
# 3. PREPARAÇÃO DOS DADOS
print("\n⚙️ Preparando dados para ML...")
# Divisão treino/teste
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Padronização (importante para alguns algoritmos)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
print(f"Treino: {X_train.shape[0]} amostras")
print(f"Teste: {X_test.shape[0]} amostras")
# 4. TREINAMENTO DOS MODELOS
print("\n🧠 Treinando modelos...")
# Modelo 1: Regressão Linear
linear_model = LinearRegression()
linear_model.fit(X_train_scaled, y_train)
# Modelo 2: Random Forest
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train) # RF não precisa de normalização
print("✅ Modelos treinados com sucesso!")
# 5. AVALIAÇÃO DOS MODELOS
print("\n📊 Avaliando performance...")
def avaliar_modelo(modelo, X_train, X_test, y_train, y_test, nome, usar_scaled=False):
"""Avalia um modelo com métricas completas"""
if usar_scaled:
y_train_pred = modelo.predict(X_train_scaled)
y_test_pred = modelo.predict(X_test_scaled)
else:
y_train_pred = modelo.predict(X_train)
y_test_pred = modelo.predict(X_test)
# Métricas de treino
train_r2 = r2_score(y_train, y_train_pred)
train_rmse = np.sqrt(mean_squared_error(y_train, y_train_pred))
# Métricas de teste
test_r2 = r2_score(y_test, y_test_pred)
test_rmse = np.sqrt(mean_squared_error(y_test, y_test_pred))
test_mae = mean_absolute_error(y_test, y_test_pred)
print(f"\n{nome}:")
print(f" R² Treino: {train_r2:.3f}")
print(f" R² Teste: {test_r2:.3f}")
print(f" RMSE Teste: {test_rmse:.2f}k")
print(f" MAE Teste: {test_mae:.2f}k")
# Detectar overfitting
if train_r2 - test_r2 > 0.1:
print(f" ⚠️ Possível overfitting detectado!")
return test_r2, test_rmse
# Avaliar ambos os modelos
r2_linear, rmse_linear = avaliar_modelo(
linear_model, X_train, X_test, y_train, y_test,
"🔵 Regressão Linear", usar_scaled=True
)
r2_rf, rmse_rf = avaliar_modelo(
rf_model, X_train, X_test, y_train, y_test,
"🌳 Random Forest"
)
Entendendo as Métricas
Números sem contexto não servem para nada. Vou explicar cada métrica:
R² (R-squared)
0.85
Significa: 85% da variação dos preços é explicada pelo modelo
Ideal: Próximo de 1.0
RMSE
4.2k
Significa: Erro médio de $4,200
Ideal: Menor possível
MAE
3.1k
Significa: 50% dos erros são menores que $3,100
Ideal: Menor possível
Interpretando o Modelo
# 6. INTERPRETAÇÃO DO MODELO
print("\n🔍 Interpretando resultados...")
# Para Regressão Linear: coeficientes
print("Coeficientes mais importantes (Regressão Linear):")
coefs = pd.DataFrame({
'Feature': X.columns,
'Coeficiente': linear_model.coef_
})
coefs['Impacto_Abs'] = abs(coefs['Coeficiente'])
coefs_sorted = coefs.sort_values('Impacto_Abs', ascending=False)
print(coefs_sorted.head(10))
# Para Random Forest: importância das features
print("\nFeatures mais importantes (Random Forest):")
importance = pd.DataFrame({
'Feature': X.columns,
'Importancia': rf_model.feature_importances_
})
importance_sorted = importance.sort_values('Importancia', ascending=False)
print(importance_sorted.head(10))
Fazendo Previsões Reais
# 7. FAZENDO PREVISÕES COM NOVOS DADOS
print("\n🔮 Testando com casos reais...")
# Exemplo: casa específica
exemplo_casa = X_test.iloc[0:1] # Primeira casa do conjunto de teste
preco_real = y_test.iloc[0]
# Previsões
pred_linear = linear_model.predict(scaler.transform(exemplo_casa))[0]
pred_rf = rf_model.predict(exemplo_casa)[0]
print(f"🏠 Características da casa:")
for feature, value in exemplo_casa.iloc[0].items():
print(f" {feature}: {value:.2f}")
print(f"\n💰 Previsões:")
print(f" Preço Real: ${preco_real:.2f}k")
print(f" Regressão Linear: ${pred_linear:.2f}k (erro: ${abs(preco_real-pred_linear):.2f}k)")
print(f" Random Forest: ${pred_rf:.2f}k (erro: ${abs(preco_real-pred_rf):.2f}k)")
# Função para previsão interativa
def prever_preco_casa(**kwargs):
"""Função para prever preço de uma casa nova"""
# Criar DataFrame com as características
nova_casa = pd.DataFrame([kwargs])
# Garantir que tem todas as features
for col in X.columns:
if col not in nova_casa.columns:
nova_casa[col] = X[col].median() # Usar mediana como padrão
# Reordenar colunas
nova_casa = nova_casa[X.columns]
# Fazer previsões
nova_casa_scaled = scaler.transform(nova_casa)
pred_linear = linear_model.predict(nova_casa_scaled)[0]
pred_rf = rf_model.predict(nova_casa)[0]
print(f"\n🏠 Nova Casa - Previsões:")
print(f" Regressão Linear: ${pred_linear:.2f}k")
print(f" Random Forest: ${pred_rf:.2f}k")
print(f" Média dos modelos: ${(pred_linear + pred_rf)/2:.2f}k")
return (pred_linear + pred_rf) / 2
# Exemplo de uso
preco_estimado = prever_preco_casa(
RM=6.5, # 6.5 quartos
AGE=15.0, # 15 anos
DIS=3.0, # 3km do centro
CRIM=0.1 # Baixa criminalidade
)
Otimizando o Modelo
Problemas Comuns e Soluções
- Overfitting: Modelo muito complexo → Simplificar ou usar regularização
- Underfitting: Modelo muito simples → Adicionar features ou complexidade
- Dados de baixa qualidade: → Voltar à etapa de limpeza
- Features irrelevantes: → Seleção de features
# 8. OTIMIZAÇÕES SIMPLES
print("\n⚡ Otimizando modelos...")
from sklearn.model_selection import GridSearchCV
# Otimizar Random Forest
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [10, 20, None],
'min_samples_split': [2, 5, 10]
}
print("🔍 Buscando melhores parâmetros...")
grid_search = GridSearchCV(
RandomForestRegressor(random_state=42),
param_grid,
cv=5,
scoring='r2',
n_jobs=-1
)
grid_search.fit(X_train, y_train)
best_rf = grid_search.best_estimator_
print(f"Melhores parâmetros: {grid_search.best_params_}")
print(f"Melhor score CV: {grid_search.best_score_:.3f}")
# Avaliar modelo otimizado
y_pred_optimized = best_rf.predict(X_test)
r2_optimized = r2_score(y_test, y_pred_optimized)
rmse_optimized = np.sqrt(mean_squared_error(y_test, y_pred_optimized))
print(f"\n📊 Modelo Otimizado:")
print(f" R² Teste: {r2_optimized:.3f}")
print(f" RMSE Teste: {rmse_optimized:.2f}k")
print(f" Melhoria: {r2_optimized - r2_rf:.3f} pontos no R²")
Salvando o Modelo
# 9. SALVANDO O MODELO PARA USO FUTURO
import joblib
# Salvar modelo e scaler
joblib.dump(best_rf, 'modelo_precos_casas.pkl')
joblib.dump(scaler, 'scaler_precos_casas.pkl')
print("✅ Modelo salvo com sucesso!")
print(" - modelo_precos_casas.pkl")
print(" - scaler_precos_casas.pkl")
# Como carregar depois:
# modelo_carregado = joblib.load('modelo_precos_casas.pkl')
# scaler_carregado = joblib.load('scaler_precos_casas.pkl')
Teste Seu Conhecimento
Vamos verificar se você entendeu os conceitos de Machine Learning!
Resumo da Aula
Parabéns! Você criou seu primeiro modelo de ML:
- Escolheu o algoritmo adequado para o problema
- Treinou múltiplos modelos e comparou performance
- Avaliou com métricas profissionais (R², RMSE, MAE)
- Interpretou os resultados e identificou features importantes
- Otimizou o modelo com Grid Search
- Salvou o modelo para uso futuro
Próximo Nível
Agora você tem as bases sólidas de Machine Learning! Na próxima aula, vamos instalar ferramentas de IA ainda mais poderosas: Ollama para rodar modelos abertos (Llama, Qwen, Gemma, DeepSeek) localmente, sem depender da internet!