"""
Module: Gradient Boosting
Catégorie : Apprentissage supervisé - Régression
Difficulté : Intermédiaire

Généré depuis la plateforme ML Formation
"""

# Imports
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, mean_squared_error, r2_score

# Charger le dataset
df = pd.read_csv('housing_simple.csv')

# Explorer les données
# Type: Code exécutable
# Fonction pour formater les nombres au style francais (espace comme separateur)
def fmt(n, decimals=0):
    n = float(n)  # Convertit les arrays numpy en scalaire
    return f"{n:,.{decimals}f}".replace(",", " ")

print("=" * 70)
print("   EXPLORATION DU DATASET IMMOBILIER")
print("   Pour l'entrainement du Gradient Boosting")
print("=" * 70)

# =================================================================
# 1. APERCU DES DONNEES
# =================================================================
print("\n" + "-" * 40)
print("1. APERCU DU DATASET")
print("-" * 40)
print("""
Nous utilisons le meme dataset immobilier que pour le Random Forest.
Le Gradient Boosting va apprendre a corriger iterativement ses erreurs.
""")
display(df.head(10), title="Dataset Immobilier")

# =================================================================
# 2. DISTRIBUTION DES PRIX
# =================================================================
print("\n" + "-" * 40)
print("2. DISTRIBUTION DU PRIX CIBLE")
print("-" * 40)

print(f"""
STATISTIQUES DU PRIX:

  Minimum:     {df['price'].min():>12,} EUR
  Maximum:     {df['price'].max():>12,} EUR
  Moyenne:     {fmt(df['price'].mean()):>12} EUR
  Mediane:     {fmt(df['price'].median()):>12} EUR
  Ecart-type:  {fmt(df['price'].std()):>12} EUR

INTERPRETATION:
- Le Gradient Boosting va commencer par predire la moyenne (~{fmt(df['price'].mean())} EUR)
- Puis, chaque arbre va corriger les erreurs residuelles
- Apres N iterations, l'erreur devrait diminuer significativement
""")

# =================================================================
# 3. CORRELATIONS AVEC LE PRIX
# =================================================================
print("\n" + "-" * 40)
print("3. CORRELATIONS")
print("-" * 40)

corr_surface = df['surface'].corr(df['price'])
corr_rooms = df['nb_rooms'].corr(df['price'])

print(f"""
Correlation avec le prix:
  - Surface:   {corr_surface:.3f} ({'forte' if abs(corr_surface) > 0.7 else 'moderee'})
  - Nb_rooms:  {corr_rooms:.3f} ({'forte' if abs(corr_rooms) > 0.7 else 'moderee'})

Le Gradient Boosting peut capturer des relations plus complexes
que les correlations lineaires simples!
""")


# ----------------------------------------------------------------------
# La suite de ce module demande un compte.
# Les cellules de code restantes ne sont pas dans ce fichier.
# ----------------------------------------------------------------------
