Fase 4 6 horas Avançado

# A Subida de Recuperação

Depois do salto, a subida exige inteligência — não só força. Aqui você recore ao cérebro artificial para tomar decisões melhores a cada pedalada.

Progresso: 0/8 (0%)

## Objetivos da Fase

#### O que você vai aprender:

- O que é Machine Learning e quando usá-lo
- Árvores de decisão com scikit-learn
- Dados de treino vs. dados de teste
- Listas de dados estruturados (features + labels)
- Avaliação de acurácia de modelos
- Bots inteligentes: tomada de decisão por predição
- Integração de IA no simulador do Circuito

#### O que você vai criar:

- Modelo de classificação de corredores
- Preditor de resultado do salto (buraco/voo)
- Bot que sugere velocidade ideal para a rampa
- Relatório de acurácia com dados históricos

## 4.1 — O Problema que a IA Resolve

Treinar 100 pilotos manualmente é inviável. Mas se tivermos os dados históricos de 6 corridas — peso, velocidade, inclinação, resultado — podemos ensinar uma máquina a decidir.

#### 📊 Dados de treino do Circuito Ferradura

Features (entradas): [velocidade, peso, inclinação_rampa]
Label (saída): 0 = BURACO, 1 = QUASE, 2 = VOOU, 3 = LENDÁRIO

    # Dataset do Circuito Ferradura — corridas históricas
    X_treino = [
        [4.5, 65, 15],   # velocidade, peso (kg), inclinação (°)
        [7.0, 70, 20],
        [9.5, 60, 25],
        [11.0, 55, 30],
        [3.0, 80, 10],
        [8.5, 63, 22],
        [6.5, 72, 18],
        [12.0, 58, 35],
    ]
    y_treino = [0, 1, 2, 3, 0, 2, 1, 3]  # BURACO, QUASE, VOOU, LENDÁRIO

    CLASSES = ["BURACO", "QUASE", "VOOU", "LENDÁRIO"]

## 4.2 — Treinando o Modelo

    from sklearn.tree import DecisionTreeClassifier
    from sklearn.metrics import accuracy_score

    # Treinar a árvore de decisão
    modelo = DecisionTreeClassifier(max_depth=4, random_state=42)
    modelo.fit(X_treino, y_treino)

    # Prever resultado para um novo piloto
    novo_piloto = [[8.0, 67, 21]]
    predicao = modelo.predict(novo_piloto)
    print(f"Resultado previsto: {CLASSES[predicao[0]]}")
    Resultado previsto: VOOU

    # Acurácia no conjunto de treino
    precisao = accuracy_score(y_treino, modelo.predict(X_treino))
    print(f"Acurácia: {precisao:.0%}")
    Acurácia: 100%

## 4.3 — Bot Inteligente de Corrida

Com o modelo treinado, criamos um bot que analisa as condições da pista em tempo real e sugere a velocidade ideal para o salto.

    class BotFerradura:
        def __init__(self, modelo, classes):
            self.modelo = modelo
            self.classes = classes

        def analisar(self, velocidade: float, peso: float, inclinacao: float) -> str:
            entrada = [[velocidade, peso, inclinacao]]
            codigo = self.modelo.predict(entrada)[0]
            resultado = self.classes[codigo]

            if codigo == 0:
                dica = "⚠️  Aumente a velocidade! Risco de buraco."
            elif codigo == 3:
                dica = "🏆 Velocidade lendária! Segure o guidão."
            else:
                dica = f"✅ Resultado previsto: {resultado}"

            return dica

    bot = BotFerradura(modelo, CLASSES)
    print(bot.analisar(9.0, 65, 25))
    ✅ Resultado previsto: VOOU

## ✅ Checklist da Fase 4

Montei o dataset com pelo menos 8 corridas históricas
Treinei o `DecisionTreeClassifier` com scikit-learn
Fiz previsão para pelo menos 3 pilotos novos
Calculei e imprimi a acurácia do modelo
Implementei a classe `BotFerradura` com `analisar()`
Bot exibe dica personalizada para cada nível de resultado
Integrei o bot ao simulador existente do Circuito
Gerei relatório comparativo: predição vs. resultado real

#### 🤖 Projeto da Fase 4

Expanda o dataset para 20 corridas, separe 80% para treino e 20% para teste real, avalie a acurácia no conjunto de teste, e ajuste o `max_depth` para encontrar o modelo mais equilibrado (sem overfitting). Documente os resultados.

🔒 LGPD — Usamos localStorage para salvar progresso.