Séance 1: Introduction IA et Machine Learning

NoteInformations de la séance
  • Type: Cours
  • Durée: 2h
  • Objectifs: Obj1, Obj2, Obj3

1. Définition et Concepts de Base

1.1 Intelligence Artificielle (IA)

L’Intelligence Artificielle est un domaine de l’informatique qui vise à créer des systèmes capables d’effectuer des tâches nécessitant normalement l’intelligence humaine.

TipExemples d’IA au quotidien
  • Assistants vocaux (Siri, Alexa, Google Assistant)
  • Recommandations Netflix/Spotify
  • Filtres anti-spam des emails
  • Reconnaissance faciale sur smartphones
  • Traduction automatique

1.2 Machine Learning (Apprentissage Automatique)

Le Machine Learning est une sous-discipline de l’IA qui permet aux ordinateurs d’apprendre à partir de données sans être explicitement programmés.

Différence clé:

  • Programmation traditionnelle: Humain écrit les règles → Ordinateur applique
  • Machine Learning: Ordinateur apprend les règles à partir des données
# Approche traditionnelle
def classifier_email(email):
    if "viagra" in email or "lottery" in email:
        return "spam"
    else:
        return "not spam"

# Approche Machine Learning
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)  # Apprend des exemples
prediction = model.predict(new_email)

1.3 Deep Learning

Le Deep Learning est une sous-catégorie du ML utilisant des réseaux de neurones artificiels profonds (plusieurs couches).

Diagramme mermaid:

graph TD
    A[Intelligence Artificielle] --> B[Machine Learning]
    B --> C[Deep Learning]
    A --> D[Systèmes experts]
    A --> E[Robotique]
    B --> F[Apprentissage supervisé]
    B --> G[Apprentissage non supervisé]
    B --> H[Apprentissage par renforcement]

2. Applications et Cas d’Utilisation

2.1 Vision par Ordinateur

  • Détection d’objets
  • Reconnaissance faciale
  • Diagnostic médical (imagerie)
  • Voitures autonomes

2.2 Traitement du Langage Naturel (NLP)

  • Chatbots et assistants virtuels
  • Traduction automatique
  • Analyse de sentiments
  • Résumé automatique de textes

2.3 Systèmes de Recommandation

  • E-commerce (Amazon, Alibaba)
  • Streaming (Netflix, YouTube)
  • Réseaux sociaux (Facebook, Instagram)

2.4 Finance

  • Détection de fraude
  • Trading algorithmique
  • Évaluation de risque de crédit

2.5 Santé

  • Diagnostic de maladies
  • Découverte de médicaments
  • Analyse d’imagerie médicale

3. Types d’Apprentissage

3.1 Apprentissage Supervisé

Le modèle apprend à partir de données étiquetées (avec réponses connues).

NoteExemple

Données d’entraînement: emails avec labels “spam” ou “non spam” Objectif: Prédire si un nouveau email est spam

Tâches principales:

  • Classification: prédire une catégorie (spam/non spam, chat/chien)
  • Régression: prédire une valeur continue (prix maison, température)
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestRegressor

# Classification
clf = LogisticRegression()
clf.fit(X_train, y_train)  # y_train contient les catégories
pred_class = clf.predict(X_test)

# Régression
reg = RandomForestRegressor()
reg.fit(X_train, y_train)  # y_train contient les valeurs continues
pred_value = reg.predict(X_test)

3.2 Apprentissage Non Supervisé

Le modèle apprend à partir de données non étiquetées (sans réponses).

NoteExemple

Données: comportements d’achat de clients Objectif: Identifier des groupes de clients similaires (segmentation)

Tâches principales:

  • Clustering: regrouper des données similaires
  • Réduction de dimension: simplifier les données
  • Détection d’anomalies: identifier des points inhabituels
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

# Clustering
kmeans = KMeans(n_clusters=3)
clusters = kmeans.fit_predict(X)

# Réduction de dimension
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

3.3 Apprentissage Semi-Supervisé

Combine données étiquetées (peu) et non étiquetées (beaucoup).

Cas d’usage: Lorsque l’étiquetage est coûteux (imagerie médicale, reconnaissance vocale)

3.4 Apprentissage par Renforcement

L’agent apprend par essai-erreur en interagissant avec un environnement.

NoteExemple
  • Jeux vidéo (AlphaGo, Chess AI)
  • Robotique
  • Contrôle de systèmes complexes

Composants:

  • Agent: celui qui apprend
  • Environnement: le monde dans lequel l’agent évolue
  • Actions: ce que l’agent peut faire
  • Récompenses: feedback positif/négatif

4. Étapes de Conception d’un Modèle IA

4.1 Pipeline ML Standard

Diagramme mermaid:

graph TB
    A[1 Définir le problème] --> B[2 Collecter les données]
    B --> C[3 Explorer les données]
    C --> D[4 Préparer les données]
    D --> E[5 Choisir un modèle]
    E --> F[6 Entraîner le modèle]
    F --> G[7 Évaluer le modèle]
    G --> H{Performance OK?}
    H -->|Non| E
    H -->|Oui| I[8 Déployer]
    I --> J[9 Monitorer]

4.2 Détails des Étapes

Étape 1: Définir le Problème

  • Quel type de problème? (classification, régression, clustering)
  • Quelles sont les métriques de succès?
  • Quelles sont les contraintes?

Étape 2: Collecter les Données

  • Sources de données
  • Quantité nécessaire
  • Qualité des données

Étape 3: Explorer les Données (EDA)

  • Statistiques descriptives
  • Visualisations
  • Identifier les patterns, outliers, données manquantes
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Exemple EDA simple
df = pd.read_csv('data.csv')
print(df.info())
print(df.describe())

# Visualisation
sns.pairplot(df)
plt.show()

Étape 4: Préparer les Données

  • Nettoyage (valeurs manquantes, doublons)
  • Transformation (normalisation, encodage)
  • Feature engineering
  • Split train/test
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer

# Split des données
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# Normalisation
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Gestion des valeurs manquantes
imputer = SimpleImputer(strategy='mean')
X_train_imputed = imputer.fit_transform(X_train)
X_test_imputed = imputer.transform(X_test)

Étape 5: Choisir un Modèle

  • Basé sur le type de problème
  • Complexité vs interprétabilité
  • Ressources disponibles

Étape 6: Entraîner le Modèle

  • Ajuster les paramètres
  • Optimisation

Étape 7: Évaluer le Modèle

  • Métriques appropriées
  • Validation croisée
  • Analyse des erreurs

Étape 8: Déployer

  • Mise en production
  • API, application web, etc.

Étape 9: Monitorer

  • Performances en production
  • Dérive des données (data drift)
  • Mise à jour du modèle

5. Concepts Clés

5.1 Overfitting vs Underfitting

  • Modèle trop simple
  • Ne capture pas les patterns dans les données
  • Biais élevé, variance faible
  • Mauvaise performance train ET test
  • Modèle trop complexe
  • Mémorise les données d’entraînement (bruit inclus)
  • Biais faible, variance élevée
  • Bonne performance train, mauvaise performance test
  • Modèle équilibré
  • Capture les vrais patterns
  • Biais et variance faibles
  • Bonne généralisation
import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# Génération de données
np.random.seed(42)
X = np.linspace(0, 10, 50)
y = 2*X + 1 + np.random.randn(50)*2

# Sous-ajustement (linear)
underfit_model = LinearRegression()
underfit_model.fit(X.reshape(-1, 1), y)
y_underfit = underfit_model.predict(X.reshape(-1, 1))

# Bon ajustement (polynomial degree 2)
goodfit_model = Pipeline([
    ('poly', PolynomialFeatures(degree=2)),
    ('linear', LinearRegression())
])
goodfit_model.fit(X.reshape(-1, 1), y)
y_goodfit = goodfit_model.predict(X.reshape(-1, 1))

# Surajustement (polynomial degree 15)
overfit_model = Pipeline([
    ('poly', PolynomialFeatures(degree=15)),
    ('linear', LinearRegression())
])
overfit_model.fit(X.reshape(-1, 1), y)
y_overfit = overfit_model.predict(X.reshape(-1, 1))

# Visualisation
fig, axes = plt.subplots(1, 3, figsize=(15, 4))

axes[0].scatter(X, y, alpha=0.5)
axes[0].plot(X, y_underfit, 'r-', linewidth=2)
axes[0].set_title('Underfitting (linéaire)')

axes[1].scatter(X, y, alpha=0.5)
axes[1].plot(X, y_goodfit, 'g-', linewidth=2)
axes[1].set_title('Good Fit (polynomial deg 2)')

axes[2].scatter(X, y, alpha=0.5)
axes[2].plot(X, y_overfit, 'b-', linewidth=2)
axes[2].set_title('Overfitting (polynomial deg 15)')

plt.tight_layout()
plt.show()

5.2 Compromis Biais-Variance

L’équilibre fondamental du Machine Learning

Le compromis biais-variance est un concept essentiel qui explique pourquoi certains modèles ne généralisent pas bien. Imaginez apprendre pour un examen :

  • Biais élevé = Vous survolez trop le cours (sous-apprentissage)
  • Variance élevée = Vous mémorisez par cœur sans comprendre (sur-apprentissage)

Formules Mathématiques Clés

Erreur totale du modèle : \[E_{\text{total}} = \underbrace{\text{Biais}^2}_{\text{simplicité}} + \underbrace{\text{Variance}}_{\text{complexité}} + \epsilon\]

Où :

  • \(\text{Biais} = E[\hat{f}(x)] - f(x)\) (différence entre prédiction moyenne et vérité)
  • \(\text{Variance} = E[(\hat{f}(x) - E[\hat{f}(x)])^2]\) (variabilité des prédictions)
  • \(\epsilon\) = Bruit irréductible des données

Exemple Illustratif avec Python

Dans cet exemple ,nous allons explorer le compromis biais-variance à travers un cas concret :

Le Scénario

Imaginons que nous voulons prédire une variable y à partir d’une variable X. Nos données suivent une tendance sinusoïdale (comme une vague) avec du bruit aléatoire ajouté pour simuler des mesures réelles imparfaites.

Les Trois Types de Modèles Testés

Nous allons ajuster trois modèles polynomiaux de complexité croissante :

  1. Degré 1 (Linéaire) :
    • Modèle le plus simple : une ligne droite
    • Problème attendu : Trop simple pour capturer la forme sinusoïdale → Biais élevé (sous-ajustement)
    • La ligne droite ne peut pas suivre les courbes des données
  2. Degré 3 (Cubique) :
    • Complexité modérée : peut faire des courbes douces
    • Résultat attendu : Bon équilibre entre simplicité et flexibilité
    • Capture la tendance générale sans trop coller au bruit
  3. Degré 9 (Polynôme de haut degré) :
    • Modèle très complexe : peut faire des courbes très compliquées
    • Problème attendu : Trop flexible, suit le bruit → Variance élevée (sur-ajustement)
    • Passe par presque tous les points d’entraînement mais prédit mal sur de nouvelles données

Ce que Vous Allez Observer

Dans les onglets suivants, vous verrez :

  • Points bleus = Données d’entraînement (le modèle “voit” ces points)
  • Points rouges = Données de test (le modèle ne “voit” PAS ces points)
  • Ligne verte = Prédictions du modèle

Question clé à observer : Quel modèle prédit le mieux les points rouges (test) qu’il n’a jamais vus ?



Composition de l’Erreur Totale

Explication : L’erreur totale d’un modèle se décompose en trois parties :

  • Biais² : Erreur systématique due à la simplicité du modèle
  • Variance : Sensibilité du modèle aux variations dans les données
  • Bruit irréductible : Erreur aléatoire inhérente aux données

graph TD
    A["Erreur Totale"] --> B["Biais au carre<br/>Erreur due a la simplicite"]
    A --> C["Variance<br/>Erreur due a la complexite"]
    A --> D["Bruit irreductible<br/>Non controlable"]
    
    style A fill:#e1f5ff
    style B fill:#ffe1e1
    style C fill:#fff4e1
    style D fill:#f0f0f0


Impact de la Complexité sur le Modèle

Explication : Lorsqu’on augmente la complexité d’un modèle :

  • Le biais diminue : le modèle peut mieux capturer les patterns complexes
  • La variance augmente : le modèle devient plus sensible au bruit dans les données

C’est le cœur du compromis biais-variance !

graph TD
    E1["Complexite croissante"] --> F1["Impact sur Biais"]
    E1 --> G1["Impact sur Variance"]
    
    F1 --> H1["Modele simple: Biais eleve"]
    F1 --> I1["Modele complexe: Biais faible"]
    
    G1 --> J1["Modele simple: Variance faible"]
    G1 --> K1["Modele complexe: Variance elevee"]
    
    style E1 fill:#e1f5ff
    style F1 fill:#fff4e1
    style G1 fill:#fff4e1
    style H1 fill:#f8d7da
    style I1 fill:#d4edda
    style J1 fill:#d4edda
    style K1 fill:#f8d7da


Recherche de la Zone Optimale

Explication : L’objectif est de trouver le point d’équilibre où :

  • Le biais n’est pas trop élevé (modèle pas trop simple)
  • La variance n’est pas trop élevée (modèle pas trop complexe)
  • Le modèle généralise bien sur de nouvelles données

graph TD
    L2["Recherche de l equilibre"] --> M2["Zone optimale<br/>Biais carre proche Variance"]
    M2 --> N2["Modele generalise bien"]
    
    style L2 fill:#fff3cd
    style M2 fill:#d1ecf1
    style N2 fill:#d4edda


A Retenir

  1. Biais élevé = Modèle trop simple = Sous-ajustement (underfitting)
  2. Variance élevée = Modèle trop complexe = Sur-ajustement (overfitting)
  3. Objectif = Trouver le juste milieu pour une bonne généralisation
  4. Erreur de test = Indicateur principal de la performance réelle du modèle

Comment Trouver l’Équilibre ?

  1. Commencez simple (régression linéaire comme baseline)
  2. Augmentez progressivement la complexité
  3. Surveillez l’écart entre performance d’entraînement et de test
  4. Arrêtez quand l’erreur de test commence à augmenter

Formule à retenir : \[E_{\text{test}} = \text{Biais}^2 + \text{Variance} + \epsilon\]

Le succès = trouver le point où cette somme est minimale !

Règle d’or : Visez l’équilibre où votre modèle est assez complexe pour apprendre les patterns importants, mais assez simple pour ignorer le bruit aléatoire.

Cette compréhension est cruciale pour choisir et ajuster vos modèles. L’objectif n’est pas d’éliminer le biais ou la variance, mais de trouver l’équilibre optimal pour votre problème spécifique !

Exercice Pratique : Diagnostic et Correction

from sklearn.datasets import make_moons
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

# Données non-linéaires
X, y = make_moons(n_samples=1000, noise=0.3, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# Test de différents modèles
models = {
    'Arbre Profond (Variance)': DecisionTreeClassifier(max_depth=20),
    'Arbre Simple (Biais)': DecisionTreeClassifier(max_depth=2),
    'Arbre Optimisé': DecisionTreeClassifier(max_depth=5, min_samples_split=10),
    'Random Forest': RandomForestClassifier(n_estimators=100, max_depth=5),
    'SVM Linéaire (Biais)': SVC(kernel='linear', C=1),
    'SVM RBF (Variance)': SVC(kernel='rbf', C=10, gamma=10)
}

print("🧪 TEST DU COMPROMIS BIAS-VARIANCE")
print("=" * 50)

for name, model in models.items():
    diagnose_bias_variance(model, X_train, X_test, y_train, y_test)
    print("-" * 40)
TipCliquez ici pour révéler/masquer la solution interactive

Conclusion et Bonnes Pratiques

Checklist de Validation

Règles Empiriques

  1. Commencez simple : Linéaire/logistique comme baseline
  2. Augmentez progressivement la complexité
  3. Surveillez l’écart entre train et validation
  4. Utilisez l’ensemble de test UNE SEULE FOIS à la fin
  5. Documentez vos choix d’hyperparamètres

Formule à Retenir

Modèle Idéal = Biais² + Variance + Bruit
→ Minimiser la somme, pas individuellement

Le compromis biais-variance n’est pas un problème à éliminer mais un équilibre à maîtriser. La clé réside dans la compréhension des besoins de votre problème spécifique et l’ajustement continu de votre approche.

6. Exercices de Réflexion

WarningQuestion 1

Pour chacun des problèmes suivants, identifiez le type d’apprentissage approprié (supervisé, non supervisé, renforcement):

  1. Prédire si un patient a une maladie cardiaque
  2. Regrouper des articles de presse par thème
  3. Apprendre à un robot à marcher
  4. Prédire le prix d’une maison
  5. Détecter des transactions frauduleuses inhabituelles
  1. Apprentissage supervisé (Classification) : On prédit une étiquette binaire (malade ou non).
  2. Apprentissage non supervisé (Clustering) : On regroupe des données sans étiquettes préalables.
  3. Apprentissage par renforcement : Le robot apprend par essais et erreurs avec un système de récompenses.
  4. Apprentissage supervisé (Régression) : On prédit une valeur numérique continue.
  5. Apprentissage non supervisé (Détection d’anomalies) : On cherche des comportements qui s’écartent de la norme.
WarningQuestion 2

Expliquez pourquoi un modèle avec 100% de précision sur les données d’entraînement peut être problématique.

Une précision de 100 % sur les données d’entraînement est souvent le signe d’un surapprentissage (overfitting). Le modèle a “mémorisé” le bruit et les particularités des données d’entraînement au lieu d’apprendre les tendances générales. Par conséquent, il risque d’avoir de très mauvaises performances sur de nouvelles données (faible capacité de généralisation).

WarningQuestion 3

Donnez 3 exemples d’applications ML dans votre domaine d’intérêt et identifiez le type de problème (classification, régression, clustering).

Exemples dans le domaine du commerce électronique :

  1. Système de recommandation de produits : Identifier des groupes de clients aux comportements similaires (Clustering).
  2. Prévision de la demande (stocks) : Prédire le nombre d’unités qui seront vendues le mois prochain (Régression).
  3. Filtrage de commentaires abusifs : Identifier si un avis client est conforme ou non aux règles de la plateforme (Classification).

Résumé de la Séance

ImportantPoints clés à retenir
  1. ML = apprentissage à partir de données sans programmation explicite
  2. Trois types principaux: supervisé, non supervisé, renforcement
  3. Pipeline ML: Problème → Données → Exploration → Préparation → Modèle → Évaluation → Déploiement
  4. Overfitting vs Underfitting: équilibre crucial pour la généralisation
  5. Applications diverses: vision, NLP, recommandations, finance, santé

Lectures Complémentaires

  1. Géron, A. (2019) - Chapitre 1: The Machine Learning Landscape
  2. Google’s Machine Learning Crash Course
  3. Andrew Ng - What is Machine Learning?