spham 8dfd897cac Ajout du lab de workflows reproductibles avec documentation complète
- Implémentation du notebook lab.ipynb avec code complet pour créer des workflows d'IA reproductibles
- Ajout d'un README.md pédagogique de 600+ lignes en français
- Configuration des graines aléatoires pour la reproductibilité
- Implémentation de la génération, division, normalisation et sauvegarde des données
- Création et entraînement d'un réseau de neurones avec TensorFlow/Keras
- Démonstration du rechargement et de la vérification de la reproductibilité

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2025-11-14 12:13:54 +01:00

166 lines
5.9 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import tensorflow as tf\n",
"from tensorflow import keras\n",
"from sklearn.datasets import make_classification\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import StandardScaler\n",
"import random\n",
"import joblib"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Creating Reproducible Datasets"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": "# 1. Set random seeds for reproducibility\n# Définir les graines aléatoires pour la reproductibilité\nrandom.seed(42) # Pour le module random\nnp.random.seed(42) # Pour NumPy\ntf.random.set_seed(42) # Pour TensorFlow\n\nprint(\"✓ Graines aléatoires définies avec succès !\")"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": "# 2. Generate synthetic data\n# Générer des données synthétiques pour la classification\nX, y = make_classification(\n n_samples=1000, # 1000 exemples\n n_features=20, # 20 caractéristiques\n n_informative=15, # 15 caractéristiques utiles\n n_redundant=5, # 5 caractéristiques redondantes\n n_classes=2, # 2 classes (classification binaire)\n random_state=42 # Graine aléatoire pour reproductibilité\n)\n\nprint(f\"✓ Données générées : {X.shape[0]} exemples, {X.shape[1]} caractéristiques\")"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Training Reproducible Model"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": "# 3. Split and scale the data\n# Diviser les données en ensembles d'entraînement (80%) et de test (20%)\nX_train, X_test, y_train, y_test = train_test_split(\n X, y, \n test_size=0.2, # 20% pour le test\n random_state=42 # Important pour la reproductibilité !\n)\n\n# Normaliser les données (StandardScaler centre les données autour de 0)\nscaler = StandardScaler()\nX_train = scaler.fit_transform(X_train) # Apprendre et transformer les données d'entraînement\nX_test = scaler.transform(X_test) # Transformer les données de test\n\nprint(f\"✓ Données divisées :\")\nprint(f\" - Entraînement : {X_train.shape[0]} exemples\")\nprint(f\" - Test : {X_test.shape[0]} exemples\")"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": "# Sauvegarder les données d'entraînement et de test pour la reproductibilité\njoblib.dump((X_train, y_train), 'train_data.pkl')\njoblib.dump((X_test, y_test), 'test_data.pkl')\n\nprint(\"✓ Données sauvegardées :\")\nprint(\" - train_data.pkl\")\nprint(\" - test_data.pkl\")"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Model Initalization and Training"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 4. Build a neural network\n",
"model = keras.Sequential([\n",
" keras.layers.Dense(32, activation='relu', input_shape=(X_train.shape[1],)),\n",
" keras.layers.Dense(16, activation='relu'),\n",
" keras.layers.Dense(1, activation='sigmoid')\n",
"])\n",
"\n",
"model.compile(\n",
" optimizer='adam',\n",
" loss='binary_crossentropy',\n",
" metrics=['accuracy']\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 5. Train the model\n",
"model.fit(X_train, y_train, epochs=20, batch_size=32, validation_split=0.1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 6. Evaluate the model\n",
"loss, accuracy = model.evaluate(X_test, y_test)\n",
"print(f\"Test accuracy: {accuracy:.2f}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Saving Models"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": "# 7. Save the model and scaler\n# Sauvegarder le modèle entraîné\nmodel.save('my_model.keras')\n\nprint(\"✓ Modèle sauvegardé : my_model.keras\")"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Reproducing Models"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": "#8. Reloading model later\n# Recharger le modèle et les données sauvegardées\nfrom tensorflow.keras.models import load_model\n\nmodelReloaded = load_model('my_model.keras')\nX_train_reloaded, y_train_reloaded = joblib.load('train_data.pkl')\nX_test_reloaded, y_test_reloaded = joblib.load('test_data.pkl')\n\nprint(\"✓ Modèle et données rechargés avec succès !\")"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": "# Vérifier que le modèle rechargé donne les mêmes résultats\nloss_reloaded, accuracy_reloaded = modelReloaded.evaluate(X_test_reloaded, y_test_reloaded)\nprint(f\"\\n🎯 Précision du modèle rechargé : {accuracy_reloaded:.2f}\")\nprint(\"\\n💡 Si la précision est identique à celle obtenue plus haut,\")\nprint(\" votre workflow est reproductible ! ✓\")"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.11"
}
},
"nbformat": 4,
"nbformat_minor": 2
}