maalouf imad
Update tp.html
f3c2376 verified
Raw
History Blame Contribute Delete
57.3 kB
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Travaux Pratiques — ML Academy</title>
<link rel="stylesheet" href="css/shared.css">
<style>
/* ═══════════════════════════════════════════════════════════════════════════
PAGE HERO
═══════════════════════════════════════════════════════════════════════════ */
.tp-hero {
background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-tertiary) 100%);
border-bottom: 1px solid var(--border-color);
padding: var(--space-3xl) var(--space-xl);
text-align: center;
}
.tp-hero-label {
font-family: 'JetBrains Mono', monospace;
font-size: 0.75rem;
color: var(--primary-light);
text-transform: uppercase;
letter-spacing: 2px;
margin-bottom: var(--space-md);
}
.tp-hero-title {
font-size: clamp(2rem, 5vw, 3rem);
font-weight: 700;
color: var(--text-primary);
margin-bottom: var(--space-md);
}
.tp-hero-subtitle {
font-size: 1.1rem;
color: var(--text-secondary);
max-width: 600px;
margin: 0 auto var(--space-xl);
}
.tp-hero-badges {
display: flex;
justify-content: center;
gap: var(--space-md);
flex-wrap: wrap;
}
/* ═══════════════════════════════════════════════════════════════════════════
TP CONTAINER
═══════════════════════════════════════════════════════════════════════════ */
.tp-container {
max-width: 1000px;
margin: 0 auto;
padding: var(--space-2xl) var(--space-xl);
}
/* ═══════════════════════════════════════════════════════════════════════════
TP CARD
═══════════════════════════════════════════════════════════════════════════ */
.tp-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius-lg);
overflow: hidden;
margin-bottom: var(--space-2xl);
transition: all var(--transition-base);
}
.tp-card:hover {
border-color: var(--primary);
box-shadow: var(--shadow-lg), var(--shadow-glow);
}
.tp-header {
display: flex;
align-items: flex-start;
gap: var(--space-lg);
padding: var(--space-xl);
background: linear-gradient(135deg, var(--bg-card), var(--bg-tertiary));
border-bottom: 1px solid var(--border-color);
}
.tp-badge {
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-md);
font-family: 'JetBrains Mono', monospace;
font-size: 0.7rem;
font-weight: 600;
color: white;
text-transform: uppercase;
letter-spacing: 1px;
flex-shrink: 0;
}
.tp-badge.titanic { background: linear-gradient(135deg, #1e40af, #3b82f6); }
.tp-badge.housing { background: linear-gradient(135deg, #047857, #10b981); }
.tp-badge.iris { background: linear-gradient(135deg, #b45309, #f59e0b); }
.tp-badge.energy { background: linear-gradient(135deg, #7c3aed, #a78bfa); }
.tp-badge.mnist { background: linear-gradient(135deg, #be123c, #f43f5e); }
.tp-badge.sentiment { background: linear-gradient(135deg, #0e7490, #06b6d4); }
.tp-header-content {
flex: 1;
}
.tp-title {
font-size: 1.4rem;
font-weight: 700;
color: var(--text-primary);
margin-bottom: var(--space-sm);
}
.tp-meta {
display: flex;
gap: var(--space-sm);
flex-wrap: wrap;
margin-bottom: var(--space-sm);
}
.tp-description {
font-size: 0.95rem;
color: var(--text-secondary);
line-height: 1.6;
}
.tp-colab-btn {
display: inline-flex;
align-items: center;
gap: var(--space-sm);
padding: var(--space-sm) var(--space-md);
background: #f9ab00;
color: #000;
font-family: 'JetBrains Mono', monospace;
font-size: 0.8rem;
font-weight: 600;
text-decoration: none;
border-radius: var(--radius-md);
transition: all var(--transition-base);
flex-shrink: 0;
}
.tp-colab-btn:hover {
background: #fbbf24;
transform: translateY(-2px);
}
/* ═══════════════════════════════════════════════════════════════════════════
TP BODY
═══════════════════════════════════════════════════════════════════════════ */
.tp-body {
padding: var(--space-xl);
}
.tp-goals {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 0;
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
overflow: hidden;
margin-bottom: var(--space-xl);
}
.tp-goal-box {
padding: var(--space-lg);
background: var(--bg-tertiary);
}
.tp-goal-box:first-child {
border-right: 1px solid var(--border-color);
}
.tp-goal-label {
font-family: 'JetBrains Mono', monospace;
font-size: 0.65rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: var(--space-sm);
}
.tp-goal-text {
font-size: 0.9rem;
color: var(--text-secondary);
line-height: 1.6;
}
.tp-goal-text strong {
color: var(--success);
}
/* ═══════════════════════════════════════════════════════════════════════════
CONCEPTS GRID
═══════════════════════════════════════════════════════════════════════════ */
.concepts-title {
font-size: 1rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: var(--space-md);
}
.concepts-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: var(--space-sm);
margin-bottom: var(--space-xl);
}
.concept-item {
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
padding: var(--space-md);
transition: all var(--transition-base);
}
.concept-item:hover {
border-color: var(--primary);
transform: translateY(-2px);
}
.concept-name {
font-size: 0.85rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: var(--space-xs);
}
.concept-desc {
font-size: 0.75rem;
color: var(--text-muted);
}
/* ═══════════════════════════════════════════════════════════════════════════
STEPS
═══════════════════════════════════════════════════════════════════════════ */
.steps-title {
font-size: 1rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: var(--space-md);
}
.steps-list {
display: flex;
flex-direction: column;
gap: 0;
}
.step-item {
display: flex;
gap: 0;
position: relative;
}
.step-item:not(:last-child)::after {
content: '';
position: absolute;
left: 20px;
top: 45px;
bottom: 0;
width: 2px;
background: linear-gradient(180deg, var(--primary), var(--secondary));
}
.step-dot {
width: 42px;
height: 42px;
background: rgba(99, 102, 241, 0.15);
border: 2px solid var(--primary);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-family: 'JetBrains Mono', monospace;
font-size: 0.9rem;
font-weight: 600;
color: var(--primary-light);
flex-shrink: 0;
margin-top: 2px;
z-index: 1;
}
.step-content {
flex: 1;
padding: 0 0 var(--space-xl) var(--space-lg);
}
.step-title {
font-size: 1rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: var(--space-xs);
}
.step-desc {
font-size: 0.9rem;
color: var(--text-secondary);
margin-bottom: var(--space-md);
line-height: 1.6;
}
/* ═══════════════════════════════════════════════════════════════════════════
DATASET INFO
═══════════════════════════════════════════════════════════════════════════ */
.dataset-info {
display: flex;
align-items: center;
gap: var(--space-md);
padding: var(--space-md) var(--space-lg);
background: rgba(99, 102, 241, 0.05);
border: 1px solid rgba(99, 102, 241, 0.2);
border-radius: var(--radius-md);
margin-bottom: var(--space-lg);
}
.dataset-icon {
font-size: 1.5rem;
}
.dataset-content {
flex: 1;
}
.dataset-name {
font-size: 0.85rem;
font-weight: 600;
color: var(--text-primary);
}
.dataset-link {
font-size: 0.75rem;
color: var(--primary-light);
text-decoration: none;
}
.dataset-link:hover {
text-decoration: underline;
}
.dataset-stats {
display: flex;
gap: var(--space-md);
}
.dataset-stat {
text-align: center;
}
.dataset-stat-value {
font-family: 'JetBrains Mono', monospace;
font-size: 1rem;
font-weight: 700;
color: var(--text-primary);
}
.dataset-stat-label {
font-size: 0.65rem;
color: var(--text-muted);
text-transform: uppercase;
}
/* ═══════════════════════════════════════════════════════════════════════════
EXPECTED OUTPUT
═══════════════════════════════════════════════════════════════════════════ */
.expected-output {
background: rgba(16, 185, 129, 0.08);
border: 1px solid rgba(16, 185, 129, 0.25);
border-radius: var(--radius-md);
padding: var(--space-md) var(--space-lg);
margin-top: var(--space-md);
}
.expected-label {
font-family: 'JetBrains Mono', monospace;
font-size: 0.65rem;
color: var(--success);
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: var(--space-xs);
}
.expected-text {
font-family: 'JetBrains Mono', monospace;
font-size: 0.8rem;
color: var(--text-secondary);
line-height: 1.6;
}
/* ═══════════════════════════════════════════════════════════════════════════
CTA SECTION
═══════════════════════════════════════════════════════════════════════════ */
.tp-cta {
text-align: center;
padding: var(--space-3xl);
background: linear-gradient(135deg, var(--bg-card), var(--bg-tertiary));
border: 1px solid var(--border-color);
border-radius: var(--radius-lg);
margin-top: var(--space-2xl);
}
.tp-cta-icon {
font-size: 3rem;
margin-bottom: var(--space-md);
}
.tp-cta-title {
font-size: 1.5rem;
font-weight: 700;
color: var(--text-primary);
margin-bottom: var(--space-sm);
}
.tp-cta-text {
font-size: 1rem;
color: var(--text-secondary);
margin-bottom: var(--space-xl);
}
/* ═══════════════════════════════════════════════════════════════════════════
RESPONSIVE
═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
.tp-goals {
grid-template-columns: 1fr;
}
.tp-goal-box:first-child {
border-right: none;
border-bottom: 1px solid var(--border-color);
}
.tp-header {
flex-direction: column;
}
.dataset-info {
flex-direction: column;
text-align: center;
}
.dataset-stats {
justify-content: center;
}
}
</style>
</head>
<body>
<!-- Particles Background -->
<div class="particles-container">
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
<div class="particle"></div>
</div>
<!-- Navigation -->
<nav class="navbar">
<a href="index.html" class="navbar-brand">
<div class="brand-logo">🧠</div>
<span>ML Academy</span>
</a>
<div class="navbar-nav">
<a href="index.html" class="nav-link">
<span class="nav-icon"></span>
<span>Accueil</span>
</a>
<a href="cours.html" class="nav-link">
<span class="nav-icon"></span>
<span>Cours</span>
</a>
<a href="tp.html" class="nav-link active">
<span class="nav-icon">💻</span>
<span>TPs</span>
</a>
<a href="feedback.html" class="nav-link">
<span class="nav-icon"></span>
<span>Contact</span>
</a>
</div>
<div class="nav-badge">
<div class="dot"></div>
<span>Google Colab Ready</span>
</div>
</nav>
<!-- Page Wrapper -->
<div class="page-wrapper">
<!-- Hero -->
<section class="tp-hero">
<div class="tp-hero-label">Travaux Pratiques</div>
<h1 class="tp-hero-title">💻 Notebooks Guidés</h1>
<p class="tp-hero-subtitle">
6 TPs complets sur des datasets réels de Kaggle. Exécutez directement sur Google Colab,
aucune installation requise.
</p>
<div class="tp-hero-badges">
<span class="badge badge-primary"> 6 Notebooks</span>
<span class="badge badge-success"> Google Colab</span>
<span class="badge badge-secondary"> Datasets Kaggle</span>
</div>
</section>
<!-- TP Container -->
<div class="tp-container">
<!-- TP 1: Titanic -->
<div class="tp-card scroll-animate">
<div class="tp-header">
<div class="tp-badge titanic">TP-1</div>
<div class="tp-header-content">
<h2 class="tp-title">Survie sur le Titanic — Classification</h2>
<div class="tp-meta">
<span class="badge badge-primary"> 30 min</span>
<span class="badge badge-secondary">Classification</span>
<span class="badge badge-success">Scikit-learn</span>
<span class="badge badge-accent">Pandas</span>
</div>
<p class="tp-description">
Prédire la survie des passagers du Titanic à partir de leurs caractéristiques
(âge, sexe, classe, etc.). Le dataset classique pour débuter en ML.
</p>
</div>
<a href="https://colab.research.google.com/#fileId=https://huggingface.co/spaces/MAALOOUF/Machine_Learning_Training/blob/main/notebooks/TP1_Titanic_Survival.ipynb" target="_blank" class="tp-colab-btn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path d="M16.9 4.8C14.4 2.4 10.7 1.7 7.5 3.1L10 5.6c1.8-.4 3.8 0 5.2 1.4 2.3 2.3 2.3 6 0 8.3-1.4 1.4-3.4 1.9-5.2 1.5L7.5 19.2c3.2 1.3 6.9.6 9.4-1.8 3.4-3.4 3.4-9.2 0-12.6zm-9.8.8L4.8 8c-.8 1.2-1.2 2.6-1.2 4s.4 2.8 1.2 4l2.3-2.3c-.4-.5-.7-1.1-.8-1.7H8V9.9H6.3c.1-.6.4-1.2.8-1.7z"/>
</svg>
Ouvrir dans Colab
</a>
</div>
<div class="tp-body">
<div class="dataset-info">
<div class="dataset-icon">🚢</div>
<div class="dataset-content">
<div class="dataset-name">Dataset : Titanic - Machine Learning from Disaster</div>
<a href="https://www.kaggle.com/competitions/titanic" target="_blank" class="dataset-link">
🔗 kaggle.com/competitions/titanic
</a>
</div>
<div class="dataset-stats">
<div class="dataset-stat">
<div class="dataset-stat-value">891</div>
<div class="dataset-stat-label">Lignes</div>
</div>
<div class="dataset-stat">
<div class="dataset-stat-value">12</div>
<div class="dataset-stat-label">Colonnes</div>
</div>
</div>
</div>
<div class="tp-goals">
<div class="tp-goal-box">
<div class="tp-goal-label"> Objectif</div>
<p class="tp-goal-text">
Construire un modèle de classification binaire pour prédire si un passager
a survécu ou non au naufrage du Titanic.
</p>
</div>
<div class="tp-goal-box">
<div class="tp-goal-label">✅ Résultat attendu</div>
<p class="tp-goal-text">
Accuracy > <strong>80%</strong> sur l'ensemble de test.
Analyse de l'importance des features.
</p>
</div>
</div>
<h3 class="concepts-title"> Concepts utilisés</h3>
<div class="concepts-grid">
<div class="concept-item">
<div class="concept-name">Prétraitement</div>
<div class="concept-desc">Gestion des valeurs manquantes</div>
</div>
<div class="concept-item">
<div class="concept-name">Encodage</div>
<div class="concept-desc">Variables catégorielles</div>
</div>
<div class="concept-item">
<div class="concept-name">Feature Engineering</div>
<div class="concept-desc">Création de nouvelles features</div>
</div>
<div class="concept-item">
<div class="concept-name">Random Forest</div>
<div class="concept-desc">Classification</div>
</div>
<div class="concept-item">
<div class="concept-name">Cross-Validation</div>
<div class="concept-desc">Évaluation robuste</div>
</div>
<div class="concept-item">
<div class="concept-name">Grid Search</div>
<div class="concept-desc">Optimisation hyperparamètres</div>
</div>
</div>
<h3 class="steps-title"> Étapes du TP</h3>
<div class="steps-list">
<div class="step-item">
<div class="step-dot">1</div>
<div class="step-content">
<div class="step-title">Exploration des données</div>
<div class="step-desc">
Charger le dataset, analyser la distribution des variables,
identifier les valeurs manquantes et les outliers.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">2</div>
<div class="step-content">
<div class="step-title">Prétraitement</div>
<div class="step-desc">
Remplir les valeurs manquantes, encoder les variables catégorielles
(Sex, Embarked), créer des features (FamilySize, IsAlone).
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">3</div>
<div class="step-content">
<div class="step-title">Modélisation</div>
<div class="step-desc">
Entraîner plusieurs modèles : Logistic Regression, Random Forest,
Gradient Boosting. Comparer leurs performances.
</div>
<div class="expected-output">
<div class="expected-label">Résultats attendus</div>
<div class="expected-text">
Random Forest: 82% accuracy<br>
Feature importance: Sex > Pclass > Age > Fare
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- TP 2: House Prices -->
<div class="tp-card scroll-animate">
<div class="tp-header">
<div class="tp-badge housing">TP-2</div>
<div class="tp-header-content">
<h2 class="tp-title">Prix des Maisons — Régression Avancée</h2>
<div class="tp-meta">
<span class="badge badge-primary"> 45 min</span>
<span class="badge badge-secondary">Régression</span>
<span class="badge badge-success">XGBoost</span>
<span class="badge badge-accent">Feature Engineering</span>
</div>
<p class="tp-description">
Prédire le prix de vente des maisons à Ames, Iowa. Un problème de régression
riche en features avec beaucoup de prétraitement nécessaire.
</p>
</div>
<a href="https://colab.research.google.com/#fileId=https://huggingface.co/spaces/MAALOOUF/Machine_Learning_Training/blob/main/notebooks/TP2_House_Prices.ipynb" target="_blank" class="tp-colab-btn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path d="M16.9 4.8C14.4 2.4 10.7 1.7 7.5 3.1L10 5.6c1.8-.4 3.8 0 5.2 1.4 2.3 2.3 2.3 6 0 8.3-1.4 1.4-3.4 1.9-5.2 1.5L7.5 19.2c3.2 1.3 6.9.6 9.4-1.8 3.4-3.4 3.4-9.2 0-12.6zm-9.8.8L4.8 8c-.8 1.2-1.2 2.6-1.2 4s.4 2.8 1.2 4l2.3-2.3c-.4-.5-.7-1.1-.8-1.7H8V9.9H6.3c.1-.6.4-1.2.8-1.7z"/>
</svg>
Ouvrir dans Colab
</a>
</div>
<div class="tp-body">
<div class="dataset-info">
<div class="dataset-icon"></div>
<div class="dataset-content">
<div class="dataset-name">Dataset : House Prices - Advanced Regression Techniques</div>
<a href="https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques" target="_blank" class="dataset-link">
🔗 kaggle.com/competitions/house-prices
</a>
</div>
<div class="dataset-stats">
<div class="dataset-stat">
<div class="dataset-stat-value">1460</div>
<div class="dataset-stat-label">Lignes</div>
</div>
<div class="dataset-stat">
<div class="dataset-stat-value">81</div>
<div class="dataset-stat-label">Colonnes</div>
</div>
</div>
</div>
<div class="tp-goals">
<div class="tp-goal-box">
<div class="tp-goal-label"> Objectif</div>
<p class="tp-goal-text">
Prédire le prix de vente des maisons avec le plus faible RMSE possible
en utilisant 79 features explicatives.
</p>
</div>
<div class="tp-goal-box">
<div class="tp-goal-label">✅ Résultat attendu</div>
<p class="tp-goal-text">
RMSE <strong>&lt; 30,000$</strong> sur log-transformed prices.
Top 20% du leaderboard Kaggle.
</p>
</div>
</div>
<h3 class="concepts-title"> Concepts utilisés</h3>
<div class="concepts-grid">
<div class="concept-item">
<div class="concept-name">Outlier Detection</div>
<div class="concept-desc">Détection et traitement</div>
</div>
<div class="concept-item">
<div class="concept-name">Skewness</div>
<div class="concept-desc">Transformation log</div>
</div>
<div class="concept-item">
<div class="concept-name">Correlation Analysis</div>
<div class="concept-desc">Matrice de corrélation</div>
</div>
<div class="concept-item">
<div class="concept-name">XGBoost</div>
<div class="concept-desc">Gradient boosting</div>
</div>
<div class="concept-item">
<div class="concept-name">Stacking</div>
<div class="concept-desc">Ensemble de modèles</div>
</div>
<div class="concept-item">
<div class="concept-name">K-Fold CV</div>
<div class="concept-desc">Validation croisée</div>
</div>
</div>
<h3 class="steps-title"> Étapes du TP</h3>
<div class="steps-list">
<div class="step-item">
<div class="step-dot">1</div>
<div class="step-content">
<div class="step-title">Analyse exploratoire avancée</div>
<div class="step-desc">
Visualiser la distribution des prix, identifier les outliers,
analyser les corrélations entre features et prix.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">2</div>
<div class="step-content">
<div class="step-title">Feature Engineering intensif</div>
<div class="step-desc">
Créer des features composites (TotalSF, HouseAge),
regrouper les catégories rares, transformer les variables skewed.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">3</div>
<div class="step-content">
<div class="step-title">Modélisation avancée</div>
<div class="step-desc">
XGBoost, LightGBM, Random Forest en stacking.
Optimisation des hyperparamètres avec Optuna.
</div>
<div class="expected-output">
<div class="expected-label">Résultats attendus</div>
<div class="expected-text">
XGBoost: RMSE = 0.12 (log scale)<br>
Feature importance: OverallQual > GrLivArea > GarageCars
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- TP 3: Iris -->
<div class="tp-card scroll-animate">
<div class="tp-header">
<div class="tp-badge iris">TP-3</div>
<div class="tp-header-content">
<h2 class="tp-title">Classification Iris — Introduction au ML</h2>
<div class="tp-meta">
<span class="badge badge-primary"> 20 min</span>
<span class="badge badge-secondary">Classification</span>
<span class="badge badge-success">Débutant</span>
<span class="badge badge-accent">Visualisation</span>
</div>
<p class="tp-description">
Le dataset classique pour la classification multi-classe.
Identifier l'espèce d'iris à partir des mesures des pétales et sépales.
</p>
</div>
<a href="https://colab.research.google.com/#fileId=https://huggingface.co/spaces/MAALOOUF/Machine_Learning_Training/blob/main/notebooks/TP3_Iris_Classification.ipynb" target="_blank" class="tp-colab-btn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path d="M16.9 4.8C14.4 2.4 10.7 1.7 7.5 3.1L10 5.6c1.8-.4 3.8 0 5.2 1.4 2.3 2.3 2.3 6 0 8.3-1.4 1.4-3.4 1.9-5.2 1.5L7.5 19.2c3.2 1.3 6.9.6 9.4-1.8 3.4-3.4 3.4-9.2 0-12.6zm-9.8.8L4.8 8c-.8 1.2-1.2 2.6-1.2 4s.4 2.8 1.2 4l2.3-2.3c-.4-.5-.7-1.1-.8-1.7H8V9.9H6.3c.1-.6.4-1.2.8-1.7z"/>
</svg>
Ouvrir dans Colab
</a>
</div>
<div class="tp-body">
<div class="dataset-info">
<div class="dataset-icon"></div>
<div class="dataset-content">
<div class="dataset-name">Dataset : Iris Flower Classification</div>
<a href="https://www.kaggle.com/datasets/uciml/iris" target="_blank" class="dataset-link">
🔗 kaggle.com/datasets/uciml/iris
</a>
</div>
<div class="dataset-stats">
<div class="dataset-stat">
<div class="dataset-stat-value">150</div>
<div class="dataset-stat-label">Lignes</div>
</div>
<div class="dataset-stat">
<div class="dataset-stat-value">5</div>
<div class="dataset-stat-label">Colonnes</div>
</div>
</div>
</div>
<div class="tp-goals">
<div class="tp-goal-box">
<div class="tp-goal-label"> Objectif</div>
<p class="tp-goal-text">
Classifier les iris en 3 espèces (Setosa, Versicolor, Virginica)
à partir de 4 features numériques.
</p>
</div>
<div class="tp-goal-box">
<div class="tp-goal-label">✅ Résultat attendu</div>
<p class="tp-goal-text">
Accuracy de <strong>95%+</strong>. Visualisation des frontières de décision.
</p>
</div>
</div>
<h3 class="concepts-title"> Concepts utilisés</h3>
<div class="concepts-grid">
<div class="concept-item">
<div class="concept-name">KNN</div>
<div class="concept-desc">K-Nearest Neighbors</div>
</div>
<div class="concept-item">
<div class="concept-name">SVM</div>
<div class="concept-desc">Support Vector Machine</div>
</div>
<div class="concept-item">
<div class="concept-name">Decision Boundary</div>
<div class="concept-desc">Visualisation</div>
</div>
<div class="concept-item">
<div class="concept-name">PCA</div>
<div class="concept-desc">Réduction de dimension</div>
</div>
<div class="concept-item">
<div class="concept-name">Pairplot</div>
<div class="concept-desc">Visualisation multi-variables</div>
</div>
<div class="concept-item">
<div class="concept-name">Confusion Matrix</div>
<div class="concept-desc">Évaluation détaillée</div>
</div>
</div>
<h3 class="steps-title">Étapes du TP</h3>
<div class="steps-list">
<div class="step-item">
<div class="step-dot">1</div>
<div class="step-content">
<div class="step-title">Visualisation exploratoire</div>
<div class="step-desc">
Pairplot pour voir les relations entre features,
boxplots par espèce pour identifier les patterns.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">2</div>
<div class="step-content">
<div class="step-title">Comparaison des algorithmes</div>
<div class="step-desc">
KNN, SVM, Decision Tree, Random Forest.
Comparer accuracy et temps d'entraînement.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">3</div>
<div class="step-content">
<div class="step-title">Visualisation des frontières</div>
<div class="step-desc">
Tracer les frontières de décision en 2D après PCA.
Comprendre comment chaque algorithme sépare les classes.
</div>
<div class="expected-output">
<div class="expected-label">Résultats attendus</div>
<div class="expected-text">
SVM: 98% accuracy<br>
Setosa parfaitement séparable, Virginica/Versicolor plus proches
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- TP 4: Energy Consumption -->
<div class="tp-card scroll-animate">
<div class="tp-header">
<div class="tp-badge energy">TP-4</div>
<div class="tp-header-content">
<h2 class="tp-title">Consommation Énergétique — Séries Temporelles</h2>
<div class="tp-meta">
<span class="badge badge-primary"> 40 min</span>
<span class="badge badge-secondary">Time Series</span>
<span class="badge badge-success">LSTM</span>
<span class="badge badge-accent">TensorFlow</span>
</div>
<p class="tp-description">
Prédire la consommation électrique d'un bâtiment à partir de données
temporelles. Introduction aux LSTM et aux prédictions séquentielles.
</p>
</div>
<a href="https://huggingface.co/spaces/MAALOOUF/Machine_Learning_Training/blob/main/notebooks/TP4_LSTM_TimeSeries.ipynb" target="_blank" class="tp-colab-btn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path d="M16.9 4.8C14.4 2.4 10.7 1.7 7.5 3.1L10 5.6c1.8-.4 3.8 0 5.2 1.4 2.3 2.3 2.3 6 0 8.3-1.4 1.4-3.4 1.9-5.2 1.5L7.5 19.2c3.2 1.3 6.9.6 9.4-1.8 3.4-3.4 3.4-9.2 0-12.6zm-9.8.8L4.8 8c-.8 1.2-1.2 2.6-1.2 4s.4 2.8 1.2 4l2.3-2.3c-.4-.5-.7-1.1-.8-1.7H8V9.9H6.3c.1-.6.4-1.2.8-1.7z"/>
</svg>
Ouvrir dans Colab
</a>
</div>
<div class="tp-body">
<div class="dataset-info">
<div class="dataset-icon"></div>
<div class="dataset-content">
<div class="dataset-name">Dataset : ASHRAE - Great Energy Predictor III</div>
<a href="https://www.kaggle.com/c/ashrae-energy-prediction" target="_blank" class="dataset-link">
🔗 kaggle.com/c/ashrae-energy-prediction
</a>
</div>
<div class="dataset-stats">
<div class="dataset-stat">
<div class="dataset-stat-value">20M+</div>
<div class="dataset-stat-label">Lignes</div>
</div>
<div class="dataset-stat">
<div class="dataset-stat-value">1449</div>
<div class="dataset-stat-label">Bâtiments</div>
</div>
</div>
</div>
<div class="tp-goals">
<div class="tp-goal-box">
<div class="tp-goal-label"> Objectif</div>
<p class="tp-goal-text">
Prédire la consommation énergétique horaire de bâtiments
à partir de données météo et historiques.
</p>
</div>
<div class="tp-goal-box">
<div class="tp-goal-label">✅ Résultat attendu</div>
<p class="tp-goal-text">
RMSE <strong>&lt; 100</strong> sur la consommation normalisée.
Capture des patterns journaliers et saisonniers.
</p>
</div>
</div>
<h3 class="concepts-title"> Concepts utilisés</h3>
<div class="concepts-grid">
<div class="concept-item">
<div class="concept-name">Time Series</div>
<div class="concept-desc">Traitement séquentiel</div>
</div>
<div class="concept-item">
<div class="concept-name">LSTM</div>
<div class="concept-desc">Réseaux récurrents</div>
</div>
<div class="concept-item">
<div class="concept-name">Seasonality</div>
<div class="concept-desc">Patterns saisonniers</div>
</div>
<div class="concept-item">
<div class="concept-name">Windowing</div>
<div class="concept-desc">Fenêtres glissantes</div>
</div>
<div class="concept-item">
<div class="concept-name">Early Stopping</div>
<div class="concept-desc">Arrêt automatique</div>
</div>
<div class="concept-item">
<div class="concept-name">TensorBoard</div>
<div class="concept-desc">Visualisation training</div>
</div>
</div>
<h3 class="steps-title"> Étapes du TP</h3>
<div class="steps-list">
<div class="step-item">
<div class="step-dot">1</div>
<div class="step-content">
<div class="step-title">Analyse temporelle</div>
<div class="step-desc">
Visualiser les patterns horaires, journaliers, hebdomadaires.
Identifier la saisonnalité et les tendances.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">2</div>
<div class="step-content">
<div class="step-title">Feature Engineering temporel</div>
<div class="step-desc">
Créer des features temporelles (hour, day_of_week, month),
lags (valeurs précédentes), rolling statistics.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">3</div>
<div class="step-content">
<div class="step-title">Modélisation LSTM</div>
<div class="step-desc">
Construire un modèle LSTM avec Keras.
Entraînement avec early stopping et learning rate scheduling.
</div>
<div class="expected-output">
<div class="expected-label">Résultats attendus</div>
<div class="expected-text">
LSTM: RMSE = 85 sur test set<br>
Capture des pics de consommation matin/soir
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- TP 5: MNIST -->
<div class="tp-card scroll-animate">
<div class="tp-header">
<div class="tp-badge mnist">TP-5</div>
<div class="tp-header-content">
<h2 class="tp-title">Reconnaissance de Chiffres — Deep Learning</h2>
<div class="tp-meta">
<span class="badge badge-primary"> 35 min</span>
<span class="badge badge-secondary">CNN</span>
<span class="badge badge-success">Computer Vision</span>
<span class="badge badge-accent">Keras</span>
</div>
<p class="tp-description">
Classification d'images de chiffres manuscrits (0-9) avec des réseaux de neurones convolutifs (CNN).
Introduction au Computer Vision.
</p>
</div>
<a href="https://colab.research.google.com/drive/1TqBXWkU3XbX7QzvVv9ZqZqZqZqZqZqZq" target="_blank" class="tp-colab-btn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path d="M16.9 4.8C14.4 2.4 10.7 1.7 7.5 3.1L10 5.6c1.8-.4 3.8 0 5.2 1.4 2.3 2.3 2.3 6 0 8.3-1.4 1.4-3.4 1.9-5.2 1.5L7.5 19.2c3.2 1.3 6.9.6 9.4-1.8 3.4-3.4 3.4-9.2 0-12.6zm-9.8.8L4.8 8c-.8 1.2-1.2 2.6-1.2 4s.4 2.8 1.2 4l2.3-2.3c-.4-.5-.7-1.1-.8-1.7H8V9.9H6.3c.1-.6.4-1.2.8-1.7z"/>
</svg>
Ouvrir dans Colab
</a>
</div>
<div class="tp-body">
<div class="dataset-info">
<div class="dataset-icon">🔢</div>
<div class="dataset-content">
<div class="dataset-name">Dataset : MNIST Handwritten Digits</div>
<a href="https://www.kaggle.com/datasets/hojjatk/mnist-dataset" target="_blank" class="dataset-link">
🔗 kaggle.com/datasets/hojjatk/mnist-dataset
</a>
</div>
<div class="dataset-stats">
<div class="dataset-stat">
<div class="dataset-stat-value">70K</div>
<div class="dataset-stat-label">Images</div>
</div>
<div class="dataset-stat">
<div class="dataset-stat-value">28×28</div>
<div class="dataset-stat-label">Pixels</div>
</div>
</div>
</div>
<div class="tp-goals">
<div class="tp-goal-box">
<div class="tp-goal-label"> Objectif</div>
<p class="tp-goal-text">
Classifier les images de chiffres manuscrits (0-9)
avec un CNN et atteindre >99% d'accuracy.
</p>
</div>
<div class="tp-goal-box">
<div class="tp-goal-label">✅ Résultat attendu</div>
<p class="tp-goal-text">
Accuracy de <strong>99%+</strong> sur le test set.
Visualisation des filtres appris par le CNN.
</p>
</div>
</div>
<h3 class="concepts-title"> Concepts utilisés</h3>
<div class="concepts-grid">
<div class="concept-item">
<div class="concept-name">CNN</div>
<div class="concept-desc">Convolutional Neural Network</div>
</div>
<div class="concept-item">
<div class="concept-name">Conv2D</div>
<div class="concept-desc">Couches de convolution</div>
</div>
<div class="concept-item">
<div class="concept-name">MaxPooling</div>
<div class="concept-desc">Réduction spatiale</div>
</div>
<div class="concept-item">
<div class="concept-name">Dropout</div>
<div class="concept-desc">Régularisation</div>
</div>
<div class="concept-item">
<div class="concept-name">BatchNorm</div>
<div class="concept-desc">Normalisation</div>
</div>
<div class="concept-item">
<div class="concept-name">Data Augmentation</div>
<div class="concept-desc">Augmentation données</div>
</div>
</div>
<h3 class="steps-title"> Étapes du TP</h3>
<div class="steps-list">
<div class="step-item">
<div class="step-dot">1</div>
<div class="step-content">
<div class="step-title">Exploration des images</div>
<div class="step-desc">
Visualiser des exemples de chaque chiffre,
analyser la distribution des classes.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">2</div>
<div class="step-content">
<div class="step-title">Construction du CNN</div>
<div class="step-desc">
Architecture: Conv2D → MaxPool → Conv2D → MaxPool →
Flatten → Dense → Dropout → Output (10 classes).
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">3</div>
<div class="step-content">
<div class="step-title">Entraînement et évaluation</div>
<div class="step-desc">
Entraînement avec data augmentation,
visualisation des prédictions erronées.
</div>
<div class="expected-output">
<div class="expected-label">Résultats attendus</div>
<div class="expected-text">
CNN: 99.2% accuracy<br>
Erreurs principalement sur 4/9 et 3/8 similaires
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- TP 6: Sentiment Analysis -->
<div class="tp-card scroll-animate">
<div class="tp-header">
<div class="tp-badge sentiment">TP-6</div>
<div class="tp-header-content">
<h2 class="tp-title">Analyse de Sentiment — NLP</h2>
<div class="tp-meta">
<span class="badge badge-primary"> 40 min</span>
<span class="badge badge-secondary">NLP</span>
<span class="badge badge-success">Embeddings</span>
<span class="badge badge-accent">Transformers</span>
</div>
<p class="tp-description">
Classifier les avis IMDB comme positifs ou négatifs.
Introduction au NLP et aux word embeddings avec les Transformers.
</p>
</div>
<a href="https://colab.research.google.com/drive/1TqBXWkU3XbX7QzvVv9ZqZqZqZqZqZqZq" target="_blank" class="tp-colab-btn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
<path d="M16.9 4.8C14.4 2.4 10.7 1.7 7.5 3.1L10 5.6c1.8-.4 3.8 0 5.2 1.4 2.3 2.3 2.3 6 0 8.3-1.4 1.4-3.4 1.9-5.2 1.5L7.5 19.2c3.2 1.3 6.9.6 9.4-1.8 3.4-3.4 3.4-9.2 0-12.6zm-9.8.8L4.8 8c-.8 1.2-1.2 2.6-1.2 4s.4 2.8 1.2 4l2.3-2.3c-.4-.5-.7-1.1-.8-1.7H8V9.9H6.3c.1-.6.4-1.2.8-1.7z"/>
</svg>
Ouvrir dans Colab
</a>
</div>
<div class="tp-body">
<div class="dataset-info">
<div class="dataset-icon">🎬</div>
<div class="dataset-content">
<div class="dataset-name">Dataset : IMDB Movie Reviews</div>
<a href="https://www.kaggle.com/datasets/lakshmi25npathi/imdb-dataset-of-50k-movie-reviews" target="_blank" class="dataset-link">
🔗 kaggle.com/datasets/lakshmi25npathi/imdb-dataset
</a>
</div>
<div class="dataset-stats">
<div class="dataset-stat">
<div class="dataset-stat-value">50K</div>
<div class="dataset-stat-label">Avis</div>
</div>
<div class="dataset-stat">
<div class="dataset-stat-value">2</div>
<div class="dataset-stat-label">Classes</div>
</div>
</div>
</div>
<div class="tp-goals">
<div class="tp-goal-box">
<div class="tp-goal-label"> Objectif</div>
<p class="tp-goal-text">
Classifier les avis de films comme positifs ou négatifs
en utilisant des embeddings et un LSTM ou BERT.
</p>
</div>
<div class="tp-goal-box">
<div class="tp-goal-label">✅ Résultat attendu</div>
<p class="tp-goal-text">
Accuracy de <strong>90%+</strong> avec LSTM,
<strong>95%+</strong> avec BERT fine-tuning.
</p>
</div>
</div>
<h3 class="concepts-title"> Concepts utilisés</h3>
<div class="concepts-grid">
<div class="concept-item">
<div class="concept-name">Tokenization</div>
<div class="concept-desc">Découpage en tokens</div>
</div>
<div class="concept-item">
<div class="concept-name">Word Embeddings</div>
<div class="concept-desc">Word2Vec, GloVe</div>
</div>
<div class="concept-item">
<div class="concept-name">LSTM pour NLP</div>
<div class="concept-desc">Séquences de texte</div>
</div>
<div class="concept-item">
<div class="concept-name">Attention</div>
<div class="concept-desc">Mécanisme d'attention</div>
</div>
<div class="concept-item">
<div class="concept-name">BERT</div>
<div class="concept-desc">Transformers pré-entraînés</div>
</div>
<div class="concept-item">
<div class="concept-name">Hugging Face</div>
<div class="concept-desc">Bibliothèque transformers</div>
</div>
</div>
<h3 class="steps-title"> Étapes du TP</h3>
<div class="steps-list">
<div class="step-item">
<div class="step-dot">1</div>
<div class="step-content">
<div class="step-title">Prétraitement du texte</div>
<div class="step-desc">
Nettoyage (HTML, ponctuation), tokenization,
padding/truncation pour avoir des séquences de même longueur.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">2</div>
<div class="step-content">
<div class="step-title">Embeddings et LSTM</div>
<div class="step-desc">
Couche d'embedding apprenable + LSTM bidirectionnel
+ couche dense de sortie.
</div>
</div>
</div>
<div class="step-item">
<div class="step-dot">3</div>
<div class="step-content">
<div class="step-title">Fine-tuning BERT (bonus)</div>
<div class="step-desc">
Utiliser un modèle BERT pré-entraîné via Hugging Face,
fine-tuner sur les avis IMDB.
</div>
<div class="expected-output">
<div class="expected-label">Résultats attendus</div>
<div class="expected-text">
LSTM: 88% accuracy<br>
BERT fine-tuned: 94% accuracy
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- CTA -->
<div class="tp-cta scroll-animate">
<div class="tp-cta-icon" style="width: 60px; height: 60px; background: linear-gradient(135deg, var(--success), #059669); border-radius: var(--radius-lg); display: flex; align-items: center; justify-content: center; font-size: 1.5rem; font-weight: 700; color: white; margin: 0 auto var(--space-md);">OK</div>
<h2 class="tp-cta-title">TPs termines ?</h2>
<p class="tp-cta-text">
Felicitations ! Vous avez maintenant une solide experience pratique
en Machine Learning. Continuez avec le cours theorique ou posez vos questions.
</p>
<div class="cta-buttons" style="display: flex; gap: var(--space-md); justify-content: center; flex-wrap: wrap;">
<a href="cours.html" class="btn btn-primary btn-lg">Retour aux cours</a>
<a href="feedback.html" class="btn btn-outline btn-lg">Poser une question</a>
</div>
</div>
</div>
<!-- Author Footer -->
<footer class="footer" style="background: var(--bg-secondary); border-top: 1px solid var(--border-color); padding: var(--space-xl); text-align: center;">
<div style="display: flex; justify-content: center; gap: var(--space-xl); flex-wrap: wrap; margin-bottom: var(--space-md);">
<a href="mailto:imadmaalouf02@gmail.com" style="display: flex; align-items: center; gap: var(--space-sm); color: var(--text-secondary); text-decoration: none; font-size: 0.9rem;">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/></svg>
imadmaalouf02@gmail.com
</a>
<a href="https://github.com/imadmaalouf02" target="_blank" style="display: flex; align-items: center; gap: var(--space-sm); color: var(--text-secondary); text-decoration: none; font-size: 0.9rem;">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
GitHub
</a>
<a href="https://huggingface.co/spaces/MAALOOUF/ML_Training" target="_blank" style="display: flex; align-items: center; gap: var(--space-sm); color: var(--text-secondary); text-decoration: none; font-size: 0.9rem;">
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></svg>
Hugging Face Space
</a>
</div>
</footer>
<!-- Footer -->
<footer class="footer">
<p class="footer-text">
ML Academy — Travaux Pratiques —
<span class="footer-brand">GE-MCI 4A</span> — 2025/2026
</p>
<p class="footer-text" style="margin-top: var(--space-sm);">
Datasets : Kaggle · Execution : Google Colab · Notebooks : Python
</p>
<p class="footer-text" style="margin-top: var(--space-sm); font-size: 0.75rem; color: var(--text-muted);">
Formateur : Imad Maalouf
</p>
</footer>
</div>
<!-- Scripts -->
<script src="js/shared.js"></script>
<script>
// Scroll animations
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, observerOptions);
document.querySelectorAll('.scroll-animate').forEach(el => {
observer.observe(el);
});
// Stagger animation for cards
document.querySelectorAll('.tp-card').forEach((card, index) => {
card.style.animationDelay = `${index * 0.15}s`;
});
</script>
</body>
</html>