Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🤖 Scikit-learn – Le Machine Learning en Python

Guide complet IDEO-Lab : API (fit/predict), Pipeline, GridSearchCV & Métriques.

1.1 Facile

Vue d'ensemble

ML "classique" en Python. NumPy, SciPy, Matplotlib.

Machine Learning Python
1.2 Facile

Pourquoi Scikit-learn ?

API simple et **cohérente** (Estimator). Robuste & Populaire.

API Cohérente Documentation
1.3 Facile

Installation (Python)

pip install scikit-learn (sklearn à l'import).

pip sklearn
1.4 Moyen

L'API "Estimator"

.fit(X, y), .predict(X), .transform(X).

.fit() .predict()
2.1 Facile

Étape 1 : train_test_split

Séparer les données (Train/Test) pour éviter l'overfitting.

train_test_split Overfitting
2.2 Moyen

Étape 2 : Preprocessing (Num)

StandardScaler (centrer-réduire), MinMaxScaler.

StandardScaler Scaling
2.3 Moyen

Étape 2 : Preprocessing (Cat)

OneHotEncoder (Dummies), LabelEncoder (Target).

OneHotEncoder Catégoriel
2.4 Avancé

Étape 3 : Pipeline

Chaîner les étapes (Scaler + Modèle). ColumnTransformer.

Pipeline ColumnTransformer
3.1 Facile

Supervisé : Classification (Lin)

LogisticRegression, KNeighborsClassifier (k-NN), SVC (SVM).

Classification LogisticRegression
3.2 Moyen

Supervisé : Classification (Ens)

DecisionTreeClassifier, RandomForestClassifier, GradientBoosting.

RandomForest Ensemble
3.3 Facile

Supervisé : Régression (Lin)

LinearRegression, Ridge (L2), Lasso (L1).

Régression LinearRegression
3.4 Moyen

Supervisé : Régression (Ens)

RandomForestRegressor, SVR (SVM Régression).

RandomForest Régression
4.1 Moyen

Non-Supervisé : Clustering

KMeans (Centroïdes), DBSCAN (Densité).

KMeans Clustering
4.2 Moyen

Non-Supervisé : PCA

Réduction de dimension. n_components, variance expliquée.

PCA Dimensions
4.3 Moyen

Model Selection (Tuning)

GridSearchCV, RandomizedSearchCV, Cross-Validation.

GridSearchCV Tuning
4.4 Facile

Persistance (joblib)

Sauvegarder et charger le modèle (dump, load).

joblib .save()
5.1 Facile

Métriques (Classification)

accuracy_score, confusion_matrix, classification_report.

Accuracy Precision/Recall
5.2 Facile

Métriques (Régression)

mean_squared_error (MSE/RMSE), r2_score (R²).

MSE R2
5.3 Facile

Vitrine & Cas d'usages

Spotify, Airbnb, Booking.com. Le standard de la Data Science.

Spotify Data Science
5.4 Facile

Liens Utiles & Formation

User Guide (Top !), API Docs, Exemples (Plotting).

Documentation User Guide
5.5 Facile

Cheat-sheet

Workflow complet : Split, Pipeline, GridSearch, Fit, Predict.

cheat Workflow
1.1 Vue d'ensemble : Le ML "Classique" en Python
Qu'est-ce que Scikit-learn ?

Scikit-learn (ou sklearn) est la bibliothèque de **Machine Learning (ML)** la plus populaire et la plus robuste en Python.

Elle se concentre sur le ML "classique" (statistique) : Régressions, Random Forests, SVM, K-Means...

Elle n'est **pas** conçue pour le Deep Learning (Réseaux de Neurones Profonds). Pour cela, on utilise TensorFlow ou PyTorch. Scikit-learn tourne sur CPU.

L'écosystème SciPy (PyData)

Scikit-learn ne vit pas seul. Il est au cœur de l'écosystème "PyData" et s'intègre parfaitement avec :

  • NumPy : (Dépendance) Requis pour les tableaux (ndarray) que sklearn utilise en entrée (X, y).
  • SciPy : (Dépendance) Utilisé en interne pour les mathématiques/statistiques optimisées.
  • Pandas : Pour le chargement et la préparation des données (DataFrame) avant de les passer à sklearn.
  • Matplotlib/Seaborn : Pour visualiser les résultats (ex: plot_confusion_matrix).
Diagramme : Flux de Travail Typique
+----------------------+
| Données (CSV, SQL...) |
+----------------------+
      | (1. pandas.read_csv)
      ▼
+-----------------------+
| Pandas DataFrame      |
| (Nettoyage, Features) |
+-----------------------+
      | (2. X, y = df['...'])
      ▼
+-----------------------+
| NumPy Arrays (X, y)   |
+-----------------------+
      | (3. sklearn.model_selection)
      ▼
+---------------------------+
| X_train, X_test, y_train, y_test |
+---------------------------+
      | (4. sklearn.pipeline)
      ▼
+-----------------------+
| Pipeline (Scaler + Modèle) |
| (model.fit(X_train, y_train)) |
+-----------------------+
      | (5. sklearn.metrics)
      ▼
+-----------------------+
| Évaluation (Score)    |
| (model.predict(X_test)) |
+-----------------------+
1.2 Pourquoi Scikit-learn ? (L'API Cohérente)

Le génie de Scikit-learn est son **API Cohérente** (l'interface "Estimator"). Que vous utilisiez une Régression Logistique ou une Random Forest, la syntaxe est la **même**.

L'API "Estimator"

Tout "estimateur" (modèle) suit ce pattern :

  1. Instancier : Choisir le modèle et ses hyperparamètres.
  2. .fit(X, y) : Entraîner le modèle sur les données d'entraînement (X_train, y_train).
  3. .predict(X) : Faire des prédictions sur de nouvelles données (X_test).
// (X_train, y_train, X_test sont prêts)

// --- Modèle 1 : Logistic Regression ---
from sklearn.linear_model import LogisticRegression
model_1 = LogisticRegression(C=1.0)
model_1.fit(X_train, y_train)
preds_1 = model_1.predict(X_test)

// --- Modèle 2 : Random Forest ---
from sklearn.ensemble import RandomForestClassifier
model_2 = RandomForestClassifier(n_estimators=100)
model_2.fit(X_train, y_train)
preds_2 = model_2.predict(X_test)

// (Même syntaxe, modèle différent.
// Cela rend le "benchmarking" trivial)
1.3 Installation

L'installation se fait via pip ou conda. (Un environnement virtuel Python venv est fortement recommandé).

Le nom du paquet est scikit-learn, mais le nom de l'import Python est sklearn.

# 1. Installation (via pip)
# (Installe aussi les dépendances: numpy, scipy)
pip install scikit-learn

# (Recommandé: installer aussi pandas et matplotlib)
pip install pandas matplotlib

# 2. Installation (via Conda)
conda install -c anaconda scikit-learn

# 3. Import en Python
import sklearn
from sklearn.model_selection import train_test_split
1.4 L'API "Estimator" (fit, predict, transform)
L'API "Predictor" (fit + predict)

Utilisée pour les modèles (Régression, Classification, Clustering).

  • .fit(X, y) : Entraîne le modèle. (y est optionnel pour l'Unsupervised, ex: K-Means).
  • .predict(X) : Prédit les classes/valeurs pour X.
  • .predict_proba(X) : (Classification) Retourne les probabilités pour chaque classe.
  • .score(X, y) : Évalue le modèle (Accuracy ou R²).
L'API "Transformer" (fit + transform)

Utilisée pour le preprocessing (StandardScaler, PCA, OneHotEncoder).

  • .fit(X) : "Apprend" les paramètres (ex: la moyenne, l'écart-type) à partir des données X.
  • .transform(X) : Applique la transformation (ex: centre-réduit les données X) en utilisant les paramètres appris.
  • .fit_transform(X) : Raccourci (optimisé) qui fait fit(X) puis transform(X).
Diagramme : Le Piège (Data Leakage)

Règle : Toujours fit sur TRAIN. Toujours transform sur TRAIN et TEST.

(scaler = StandardScaler())

+-----------+                       +-----------+
|  X_train  | -- (Apprend µ, σ) --> | .fit()    |
+-----------+                       +-----------+
      |                                   |
      ▼ (Utilise µ, σ de TRAIN)           |
+-----------+                       +-----------+
| .transform()| <-- (Utilise µ, σ) -- |  X_test   |
+-----------+                       +-----------+
      |                                   |
      ▼                                   ▼
+-----------+                       +-----------+
| X_train_scaled |                  | X_test_scaled |
+-----------+                       +-----------+
2.1 Étape 1 : train_test_split

C'est la première étape **obligatoire** de tout projet ML. On sépare les données en deux sets :

  • Train set (ex: 80%) : Pour entraîner le modèle.
  • Test set (ex: 20%) : Pour évaluer la performance du modèle sur des données qu'il n'a **jamais** vues (simule le futur).

Ne pas le faire (entraîner et tester sur les mêmes données) mène à l'overfitting (le modèle "apprend par cœur" mais ne généralise pas).

from sklearn.model_selection import train_test_split

# (X = features, y = target)
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,    // (Garde 20% pour le test)
    random_state=42,  // (Pour la reproductibilité)
    stratify=y        // (Optionnel: garde la proportion des classes dans 'y')
)

print(X_train.shape, X_test.shape)
2.2 Preprocessing (Numérique) : StandardScaler

Certains modèles (SVM, k-NN, Régressions, PCA) sont sensibles à l'échelle des features (ex: un "âge" [20-60] pèse moins qu'un "salaire" [30k-100k]).

StandardScaler (Centrer-Réduire) est le plus courant : il transforme chaque feature pour qu'elle ait une moyenne=0 et un écart-type=1.

Le Pattern (Manuel)
from sklearn.preprocessing import StandardScaler

# 1. Créer le scaler
scaler = StandardScaler()

# 2. FIT sur TRAIN (apprend la moyenne/std de X_train)
scaler.fit(X_train)

# 3. TRANSFORM (applique la transformation)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test) // (Utilise la moyenne/std de TRAIN !)

// (Raccourci pour l'étape 2 et 3)
// X_train_scaled = scaler.fit_transform(X_train)

Note : Les modèles basés sur les arbres (DecisionTree, RandomForest) ne sont *pas* sensibles à l'échelle.

2.3 Preprocessing (Catégoriel) : OneHotEncoder

Les modèles ne comprennent pas le texte ("Rouge", "Bleu"). Il faut encoder les features catégorielles.

OneHotEncoder (OHE) est la méthode standard. Elle transforme N catégories en N-1 colonnes binaires (Dummies).

Exemple (OHE)
from sklearn.preprocessing import OneHotEncoder

# (Ex: X_train['couleur'] = ["Rouge", "Bleu", "Rouge"])

# drop='first' (évite la multi-colinéarité)
# handle_unknown='ignore' (si une catégorie inconnue arrive en test)
ohe = OneHotEncoder(drop='first', handle_unknown='ignore', sparse_output=False)

# (Apprend les catégories sur TRAIN)
ohe.fit(X_train_categorical)

# (Transforme)
X_train_encoded = ohe.transform(X_train_categorical)
X_test_encoded = ohe.transform(X_test_categorical)
2.4 Étape 3 : Pipeline & ColumnTransformer (Workflow Pro)

Gérer le scaling et l'encoding manuellement (2.2, 2.3) est source d'erreurs (data leakage). La Pipeline automatise tout.

La ColumnTransformer applique des étapes différentes (ex: Scaler) à des colonnes différentes (ex: numériques) au sein de la Pipeline.

Exemple (Workflow complet)
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer // (Bonus: gère les NaN)
from sklearn.ensemble import RandomForestClassifier

# (Supposons X_train/X_test sont des DataFrames Pandas)
# (Définir les listes de noms de colonnes)
cols_num = ["age", "salaire"]
cols_cat = ["departement", "region"]

# 1. Pipeline de preprocessing Numérique
# (Étape 1: Remplir NaN, Étape 2: Scaler)
pipe_num = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])

# 2. Pipeline de preprocessing Catégoriel
pipe_cat = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('encoder', OneHotEncoder(handle_unknown='ignore'))
])

# 3. ColumnTransformer (Assemble les pipelines)
preprocessor = ColumnTransformer(
    transformers=[
        ('num', pipe_num, cols_num),
        ('cat', pipe_cat, cols_cat)
    ],
    remainder='passthrough' // (Garde les autres colonnes)
)

# 4. Pipeline Finale (Preproc + Modèle)
model = RandomForestClassifier()

final_pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('model', model)
])

# 5. Entraîner (TOUT se fait en 1 ligne !)
final_pipeline.fit(X_train, y_train)

# 6. Prédire (La pipeline gère tout automatiquement)
preds = final_pipeline.predict(X_test)
3.1 Classification (Linéaire & Voisins)
ModèleDescriptionUsage / Hyperparamètres
LogisticRegressionModèle linéaire (probabiliste). Baseline rapide et interprétable.C (Inverse de la régularisation). Nécessite scaling.
KNeighborsClassifier (k-NN)Non-paramétrique ("Vote des k plus proches voisins"). Simple, mais lent à la prédiction.n_neighbors (k). Nécessite scaling.
SVC (Support Vector)Modèle à "marge maximale". Très puissant (non-linéaire avec "kernel trick").C, kernel ('rbf', 'linear'), gamma. Nécessite scaling.
3.2 Classification (Ensembles & Arbres)

(Ne nécessitent pas de StandardScaler)

ModèleDescriptionUsage / Hyperparamètres
DecisionTreeClassifierInterprétable (série de "if/else"). Tendance à l'overfitting.max_depth (profondeur).
RandomForestClassifier (Bagging)Ensemble d'arbres de décision. Robuste, performant, "go-to" model.n_estimators (nb arbres), max_depth, max_features.
GradientBoostingClassifier (Boosting)Ensemble d'arbres (séquentiel). Souvent le plus performant, mais long à entraîner.n_estimators, learning_rate.
3.3 Régression (Linéaire & Régularisée)

(Nécessitent scaling et OHE)

ModèleDescriptionUsage / Hyperparamètres
LinearRegressionModèle linéaire simple (Moindres Carrés Ordinaires).Interprétabilité (coefficients).
Ridge (L2)Régression linéaire + Régularisation L2. Gère la multi-colinéarité.alpha (force de régularisation).
Lasso (L1)Régression linéaire + L1. Peut faire de la "feature selection" (coefficients à 0).alpha (force de régularisation).
3.4 Régression (Non-linéaire & Ensembles)
ModèleDescriptionUsage / Hyperparamètres
SVR (Support Vector)Régression SVM. (Nécessite scaling).C, kernel, gamma.
RandomForestRegressorEnsemble d'arbres pour la régression. (Pas besoin de scaling).n_estimators, max_depth.
4.1 Non-Supervisé : Clustering (K-Means, DBSCAN)

Objectif : Regrouper des données non-étiquetées (X seulement). .fit_predict(X).

ModèleDescriptionHyperparamètres
KMeansLe plus populaire. Regroupe par "centroïdes" (centres de cluster). (Nécessite scaling).n_clusters (k). (Méthode du "coude" pour le trouver).
DBSCANClustering basé sur la densité. Peut trouver des formes complexes et isoler le "bruit" (outliers).eps (distance), min_samples.
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4, n_init='auto')
clusters = kmeans.fit_predict(X_scaled)
4.2 Non-Supervisé : PCA (Réduction de dimension)

Principal Component Analysis (PCA) : Réduit le nombre de features (dimensions) en trouvant de nouveaux axes (composantes) qui maximisent la variance.

Utile pour la visualisation (réduire à 2D/3D) ou pour "débruiter" les données avant un modèle. (Nécessite StandardScaler).

from sklearn.decomposition import PCA

# (Garder 95% de la variance expliquée)
pca = PCA(n_components=0.95) 

# (ou n_components=2 pour visualiser)
X_train_pca = pca.fit_transform(X_train_scaled)
X_test_pca = pca.transform(X_test_scaled)

print(pca.explained_variance_ratio_)
4.3 Model Selection : GridSearchCV (Tuning)

Grid Search (Recherche par grille) : L'outil pour trouver les meilleurs hyperparamètres. Il teste *toutes* les combinaisons possibles en utilisant la **Cross-Validation (CV)**.

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

// (Utiliser la pipeline (2.4) est la meilleure pratique)
// (On accède aux params du modèle via 'model__PARAM')
pipeline = Pipeline(steps=[
    ('scaler', StandardScaler()),
    ('model', SVC())
])

// 1. Définir la grille de recherche
// (Clé = 'NOM_ETAPE__HYPERPARAMETRE')
param_grid = {
    'model__C': [0.1, 1, 10],
    'model__kernel': ['linear', 'rbf']
}

// 2. Initialiser le GridSearch
// (cv=5 -> 5-fold Cross-Validation)
search = GridSearchCV(
    pipeline,
    param_grid,
    cv=5,
    scoring='accuracy',
    n_jobs=-1 // (Utilise tous les CPUs)
)

// 3. Entraîner (teste toutes les 3*2=6 combos, 5 fois)
search.fit(X_train, y_train)

// 4. Meilleurs résultats
print(search.best_params_)
print(search.best_score_)

// (Le 'search' est maintenant le meilleur modèle)
best_model = search.best_estimator_
preds = best_model.predict(X_test)
4.4 Persistance (joblib)

Pour sauvegarder un modèle (ou une pipeline) entraîné. joblib est préféré à pickle car il est plus efficace pour les gros arrays NumPy.

import joblib

// (Entraîner le modèle/pipeline)
pipeline.fit(X_train, y_train)

// 1. Sauvegarder (Dump)
joblib.dump(pipeline, "mon_modele.joblib")

// --- (Plus tard, dans une autre app) ---

// 2. Charger (Load)
loaded_model = joblib.load("mon_modele.joblib")

// 3. Prédire
preds = loaded_model.predict(X_new_data)
5.1 Métriques (Classification)

Pour évaluer la performance (y_test vs y_pred).

accuracy_score

Pourcentage de prédictions correctes. (Trompeur si les classes sont déséquilibrées).

confusion_matrix & classification_report

Les outils les plus importants pour la classification.

from sklearn.metrics import (
    accuracy_score, 
    confusion_matrix, 
    classification_report
)

y_pred = model.predict(X_test)

// 1. Accuracy
print(accuracy_score(y_test, y_pred)) // ex: 0.91

// 2. Matrice de Confusion
// (DIAGRAMME ASCII)
//
//          Prédit: 0   Prédit: 1
// Réel: 0     [ TN ]      [ FP ]
// Réel: 1     [ FN ]      [ TP ]
//
print(confusion_matrix(y_test, y_pred))

// 3. Rapport Complet
// (Precision, Recall, F1-Score)
print(classification_report(y_test, y_pred))
5.2 Métriques (Régression)

Pour évaluer la performance (y_test vs y_pred_reg).

MétriqueDescription
mean_absolute_error (MAE)Erreur moyenne absolue (facile à interpréter, ex: "erreur de 5k€").
mean_squared_error (MSE)Erreur quadratique moyenne (pénalise les grosses erreurs).
(RMSE)np.sqrt(MSE). (Même unité que la cible, ex: 7.5k€).
r2_score (R²)Coefficient de détermination. (De 0 à 1). "Mon modèle explique 80% de la variance".
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np

y_pred_reg = model.predict(X_test)

mse = mean_squared_error(y_test, y_pred_reg)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred_reg)
5.3 Vitrine (Qui utilise Scikit-learn ?)

Scikit-learn est l'outil **standard** de tout Data Scientist/Analyst travaillant en Python. Il est utilisé par quasiment toutes les entreprises qui traitent des données tabulaires (clients, ventes, capteurs...).

EntrepriseCas d'usage (Exemples)
SpotifyClustering (KMeans) pour découvrir des genres musicaux. Classification (RandomForest) pour prédire le "churn" (désabonnement).
Airbnb / Booking.comRégression (Ridge, GradientBoosting) pour prédire les prix des logements (Dynamic Pricing).
Toute FinTech / BanqueDétection de fraude (LogisticRegression, SVM) sur des données transactionnelles.
Data Scientists (R&D)Outil N°1 pour le prototypage rapide et l'établissement d'une "baseline" avant de passer (peut-être) au Deep Learning.
5.5 Cheat-sheet (Workflow Complet)
Imports
import pandas as pd
import numpy as np
from sklearn.model_selection import (
    train_test_split, 
    GridSearchCV
)
from sklearn.preprocessing import (
    StandardScaler, 
    OneHotEncoder
)
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
import joblib
Workflow
# 1. Load Data (Pandas)
df = pd.read_csv("data.csv")
X = df.drop("target", axis=1)
y = df["target"]

# 2. Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. Define Preprocessor
cols_num = ["age", "salaire"]
cols_cat = ["region"]
pipe_num = Pipeline(steps=[('scaler', StandardScaler())])
pipe_cat = Pipeline(steps=[('ohe', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer(
    transformers=[
        ('num', pipe_num, cols_num),
        ('cat', pipe_cat, cols_cat)
    ])

# 4. Define Full Pipeline
final_pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('model', RandomForestClassifier(random_state=42))
])

# 5. GridSearch (Tuning)
param_grid = {
    'model__n_estimators': [100, 200],
    'model__max_depth': [10, 20]
}
search = GridSearchCV(final_pipeline, param_grid, cv=5, n_jobs=-1)

# 6. Fit
search.fit(X_train, y_train)

# 7. Evaluate
y_pred = search.predict(X_test)
print(classification_report(y_test, y_pred))

# 8. Save
joblib.dump(search.best_estimator_, "model.joblib")