Primeiro Modelo de Machine Learning do Zero

📚 Aula 03 de 15
⏱️ 35 minutos
🔢 Módulo 1
📅 25 de agosto de 2025
Progresso do Curso 14.3% completo

🚀 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 LLaMA localmente, sem depender da internet!