Files
DEV5.2/TP05/Untitled.ipynb

1326 lines
427 KiB
Plaintext
Raw Normal View History

2025-01-28 15:54:25 +01:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"id": "ae8de2f8-124f-4b64-ab28-b862a5c15242",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading data...\n",
"Téléchargement des données...\n",
"Data shape: (297, 14)\n",
"\n",
"Preprocessing data...\n",
"\n",
"Training Model 1...\n",
"Epoch 1/50\n",
"6/6 [==============================] - 2s 118ms/step - loss: 0.6855 - accuracy: 0.5450 - val_loss: 0.6612 - val_accuracy: 0.6875\n",
"Epoch 2/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.6296 - accuracy: 0.6825 - val_loss: 0.6479 - val_accuracy: 0.7083\n",
"Epoch 3/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.5430 - accuracy: 0.7619 - val_loss: 0.6314 - val_accuracy: 0.7292\n",
"Epoch 4/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.5014 - accuracy: 0.7831 - val_loss: 0.6138 - val_accuracy: 0.7708\n",
"Epoch 5/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.4822 - accuracy: 0.7884 - val_loss: 0.5954 - val_accuracy: 0.7708\n",
"Epoch 6/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.4436 - accuracy: 0.8042 - val_loss: 0.5778 - val_accuracy: 0.7708\n",
"Epoch 7/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.4270 - accuracy: 0.8148 - val_loss: 0.5608 - val_accuracy: 0.7500\n",
"Epoch 8/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.4405 - accuracy: 0.8201 - val_loss: 0.5414 - val_accuracy: 0.7500\n",
"Epoch 9/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.3840 - accuracy: 0.8413 - val_loss: 0.5271 - val_accuracy: 0.7500\n",
"Epoch 10/50\n",
"6/6 [==============================] - 0s 18ms/step - loss: 0.3704 - accuracy: 0.8413 - val_loss: 0.5168 - val_accuracy: 0.7500\n",
"Epoch 11/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3865 - accuracy: 0.8307 - val_loss: 0.5075 - val_accuracy: 0.7708\n",
"Epoch 12/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3560 - accuracy: 0.8466 - val_loss: 0.5013 - val_accuracy: 0.7708\n",
"Epoch 13/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3422 - accuracy: 0.8466 - val_loss: 0.4952 - val_accuracy: 0.7708\n",
"Epoch 14/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3238 - accuracy: 0.8624 - val_loss: 0.4893 - val_accuracy: 0.7708\n",
"Epoch 15/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.3038 - accuracy: 0.8836 - val_loss: 0.4846 - val_accuracy: 0.7708\n",
"Epoch 16/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3116 - accuracy: 0.8677 - val_loss: 0.4787 - val_accuracy: 0.7917\n",
"Epoch 17/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.3145 - accuracy: 0.8624 - val_loss: 0.4771 - val_accuracy: 0.7917\n",
"Epoch 18/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3088 - accuracy: 0.8836 - val_loss: 0.4765 - val_accuracy: 0.7917\n",
"Epoch 19/50\n",
"6/6 [==============================] - 0s 19ms/step - loss: 0.3098 - accuracy: 0.8730 - val_loss: 0.4775 - val_accuracy: 0.7917\n",
"Epoch 20/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.2802 - accuracy: 0.8995 - val_loss: 0.4742 - val_accuracy: 0.7917\n",
"Epoch 21/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.2991 - accuracy: 0.8783 - val_loss: 0.4721 - val_accuracy: 0.7917\n",
"Epoch 22/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2697 - accuracy: 0.8836 - val_loss: 0.4724 - val_accuracy: 0.7917\n",
"Epoch 23/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2678 - accuracy: 0.9153 - val_loss: 0.4709 - val_accuracy: 0.7708\n",
"Epoch 24/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3058 - accuracy: 0.8677 - val_loss: 0.4699 - val_accuracy: 0.7708\n",
"Epoch 25/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2338 - accuracy: 0.9101 - val_loss: 0.4730 - val_accuracy: 0.7500\n",
"Epoch 26/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2420 - accuracy: 0.9048 - val_loss: 0.4731 - val_accuracy: 0.7500\n",
"Epoch 27/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2506 - accuracy: 0.8836 - val_loss: 0.4737 - val_accuracy: 0.7500\n",
"Epoch 28/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2331 - accuracy: 0.9259 - val_loss: 0.4732 - val_accuracy: 0.7500\n",
"Epoch 29/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2395 - accuracy: 0.9048 - val_loss: 0.4753 - val_accuracy: 0.7500\n",
"Epoch 30/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2838 - accuracy: 0.8730 - val_loss: 0.4808 - val_accuracy: 0.7292\n",
"Epoch 31/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2263 - accuracy: 0.9153 - val_loss: 0.4850 - val_accuracy: 0.7292\n",
"Epoch 32/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.2270 - accuracy: 0.9153 - val_loss: 0.4917 - val_accuracy: 0.7292\n",
"Epoch 33/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.2288 - accuracy: 0.9101 - val_loss: 0.4948 - val_accuracy: 0.7292\n",
"Epoch 34/50\n",
"1/6 [====>.........................] - ETA: 0s - loss: 0.1590 - accuracy: 0.9688Restoring model weights from the end of the best epoch: 24.\n",
"6/6 [==============================] - 0s 19ms/step - loss: 0.2019 - accuracy: 0.9206 - val_loss: 0.4963 - val_accuracy: 0.7292\n",
"Epoch 34: early stopping\n",
"\n",
"Model 1 - Test Accuracy: 0.9333\n",
"\n",
"Training Model 2...\n",
"Epoch 1/50\n",
"6/6 [==============================] - 3s 105ms/step - loss: 0.6759 - accuracy: 0.5767 - val_loss: 0.6780 - val_accuracy: 0.6042\n",
"Epoch 2/50\n",
"6/6 [==============================] - 0s 18ms/step - loss: 0.6347 - accuracy: 0.6349 - val_loss: 0.6638 - val_accuracy: 0.6667\n",
"Epoch 3/50\n",
"6/6 [==============================] - 0s 18ms/step - loss: 0.5800 - accuracy: 0.6772 - val_loss: 0.6402 - val_accuracy: 0.7292\n",
"Epoch 4/50\n",
"6/6 [==============================] - 0s 18ms/step - loss: 0.5013 - accuracy: 0.7725 - val_loss: 0.6169 - val_accuracy: 0.7500\n",
"Epoch 5/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.4566 - accuracy: 0.7937 - val_loss: 0.5964 - val_accuracy: 0.7917\n",
"Epoch 6/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.4297 - accuracy: 0.8201 - val_loss: 0.5788 - val_accuracy: 0.8125\n",
"Epoch 7/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3851 - accuracy: 0.8254 - val_loss: 0.5624 - val_accuracy: 0.7917\n",
"Epoch 8/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.4309 - accuracy: 0.8148 - val_loss: 0.5463 - val_accuracy: 0.7917\n",
"Epoch 9/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3926 - accuracy: 0.8360 - val_loss: 0.5362 - val_accuracy: 0.8125\n",
"Epoch 10/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3602 - accuracy: 0.8519 - val_loss: 0.5278 - val_accuracy: 0.8125\n",
"Epoch 11/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3761 - accuracy: 0.8042 - val_loss: 0.5178 - val_accuracy: 0.8125\n",
"Epoch 12/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3413 - accuracy: 0.8624 - val_loss: 0.5081 - val_accuracy: 0.8125\n",
"Epoch 13/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3255 - accuracy: 0.8624 - val_loss: 0.4994 - val_accuracy: 0.8125\n",
"Epoch 14/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3181 - accuracy: 0.8942 - val_loss: 0.4877 - val_accuracy: 0.8125\n",
"Epoch 15/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3330 - accuracy: 0.8519 - val_loss: 0.4778 - val_accuracy: 0.8125\n",
"Epoch 16/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3159 - accuracy: 0.8730 - val_loss: 0.4703 - val_accuracy: 0.8125\n",
"Epoch 17/50\n",
"6/6 [==============================] - 0s 18ms/step - loss: 0.3236 - accuracy: 0.8677 - val_loss: 0.4637 - val_accuracy: 0.8333\n",
"Epoch 18/50\n",
"6/6 [==============================] - 0s 23ms/step - loss: 0.3000 - accuracy: 0.8624 - val_loss: 0.4583 - val_accuracy: 0.8333\n",
"Epoch 19/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2777 - accuracy: 0.8624 - val_loss: 0.4540 - val_accuracy: 0.8333\n",
"Epoch 20/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2938 - accuracy: 0.8783 - val_loss: 0.4512 - val_accuracy: 0.8333\n",
"Epoch 21/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2958 - accuracy: 0.8624 - val_loss: 0.4482 - val_accuracy: 0.8125\n",
"Epoch 22/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2643 - accuracy: 0.9259 - val_loss: 0.4420 - val_accuracy: 0.8125\n",
"Epoch 23/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2544 - accuracy: 0.9153 - val_loss: 0.4378 - val_accuracy: 0.8125\n",
"Epoch 24/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.2371 - accuracy: 0.8942 - val_loss: 0.4343 - val_accuracy: 0.8333\n",
"Epoch 25/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2255 - accuracy: 0.8942 - val_loss: 0.4308 - val_accuracy: 0.8125\n",
"Epoch 26/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.2518 - accuracy: 0.8571 - val_loss: 0.4260 - val_accuracy: 0.8125\n",
"Epoch 27/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2424 - accuracy: 0.8942 - val_loss: 0.4233 - val_accuracy: 0.8125\n",
"Epoch 28/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2345 - accuracy: 0.8995 - val_loss: 0.4240 - val_accuracy: 0.7917\n",
"Epoch 29/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2326 - accuracy: 0.8836 - val_loss: 0.4254 - val_accuracy: 0.7708\n",
"Epoch 30/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2498 - accuracy: 0.8836 - val_loss: 0.4285 - val_accuracy: 0.7708\n",
"Epoch 31/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2155 - accuracy: 0.8995 - val_loss: 0.4297 - val_accuracy: 0.7500\n",
"Epoch 32/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2161 - accuracy: 0.9153 - val_loss: 0.4323 - val_accuracy: 0.7500\n",
"Epoch 33/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2137 - accuracy: 0.9101 - val_loss: 0.4345 - val_accuracy: 0.7500\n",
"Epoch 34/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.1759 - accuracy: 0.9365 - val_loss: 0.4328 - val_accuracy: 0.7708\n",
"Epoch 35/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.2121 - accuracy: 0.9101 - val_loss: 0.4295 - val_accuracy: 0.7917\n",
"Epoch 36/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.1779 - accuracy: 0.9153 - val_loss: 0.4326 - val_accuracy: 0.7917\n",
"Epoch 37/50\n",
"1/6 [====>.........................] - ETA: 0s - loss: 0.2512 - accuracy: 0.8438Restoring model weights from the end of the best epoch: 27.\n",
"6/6 [==============================] - 0s 18ms/step - loss: 0.2044 - accuracy: 0.9048 - val_loss: 0.4354 - val_accuracy: 0.7708\n",
"Epoch 37: early stopping\n",
"\n",
"Model 2 - Test Accuracy: 0.8667\n",
"\n",
"Plotting results...\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1200x400 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"\"\\n## Exercice 1 : \\nadapter le programme sur les données suivantes : \\nhttps://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data\\n\\n\\n## Exercice 2 : \\nOn vous demande d'implémenter 2 autres modèles en suivant le schéma du programme donné. Sur les 2 data-set. \\n\\nL'objectif est de rendre un rapport explicatif complet sur au moins un des modèles ; le code doit être commenté et des tests (changement de paramètres : itération, taux, couches réseaux) doivent être fait.\\n\\n### Premier Modèle : Random Forest Classifier\\n\\nCe modèle est particulièrement intéressant car il offre :\\n- Une excellente performance sur les données médicales\\n- Une interprétabilité des résultats\\n- Une facilité relative d'implémentation\\n\\nVoici un exemple de structure pour l'implémentation :\\n\\n```python\\nfrom sklearn.ensemble import RandomForestClassifier\\nfrom sklearn.model_selection import GridSearchCV\\n\\ndef create_model_rf(X_train, y_train):\\n # Création du modèle avec des hyperparamètres de base\\n rf_model = RandomForestClassifier(\\n n_estimators=100,\\n max_depth=10,\\n random_state=42\\n )\\n \\n # Définition des paramètres à optimiser\\n param_grid = {\\n 'n_estimators': [50, 100, 200],\\n 'max_depth': [5, 10, 15],\\n 'min_samples_split': [2, 5, 10]\\n }\\n \\n # Recherche des meilleurs paramètres\\n grid_search = GridSearchCV(\\n rf_model,\\n param_grid,\\n cv=5,\\n scoring='accuracy',\\n n_jobs=-1\\n )\\n \\n # Entraînement avec recherche des meilleurs paramètres\\n grid_search.fit(X_train, y_train)\\n \\n return grid_search.best_estimator_\\n```\\n\\n### Deuxième Modèle : XGBoost\\n\\nXGBoost est un algorithme de boosting très performant qui permet souvent d'obtenir d'excellents résultats. Voici une structure d'implémentation :\\n\\n```python\\nimport xgboost as xgb\\nfrom sklearn.model_selection import cross_val_score\\n\\ndef create_model_xgb(X_train, y_train):\\n # Création du modèle avec des paramètres de base\\n xgb_model = xgb.XGBClassifier(\\n learning_rate=0.1,\\n n_estimators=100,\\n max_depth=5,\\n random_state=42\\n )\\n \\n # Paramètres à optimiser\\n param_grid = {\\n 'learning_rate': [0.01, 0.1, 0.3],\\n 'n_estimators': [50, 100, 200],\\n 'max_depth': [3, 5, 7]\\n }\\n \\n # Optimisation des hyperparamètres\\n grid_search = GridSearchCV(\\n xgb_model,\\n param_grid,\\n cv=5,\\n scoring='accuracy',\\n n_jobs=-1\\n )\\n \\n grid_search.fit(X_train, y_train)\\n \\n return grid_search.best_estimator_\\n```\\n\\nPour faciliter l'implémentation, voici les points essentiels à comprendre :\\n\\nPour le Random Forest :\\n- C'est un ensemble d'arbres de décision\\n- Chaque arbre est entraîné sur un sous-ensemble aléatoire des données\\n- La prédiction finale est obtenue par vote majoritaire des arbres\\n- Les paramètres clés sont le nombre d'arbres (n_estimators) et la profondeur maximale (max_depth)\\n\\nPour XGBoost :\\n- C'est un algorithme de boosting qui construit les arbres séquentiellement\\n- Chaque nouvel arbre corrige les erreurs des arbres précédents\\n- Le learning_rate contrôle la contribution de chaque arbre\\n- La profondeur des arbres (max_depth) limite la complexité du modèle\\n\\nPour l'évaluation des modèles, on peut réutiliser les fonctions de visualisation existantes en les adaptant légèrement. Par exemple :\\n\\n```python\\ndef plot_model_comparison(models_results):\\n plt.figure(figsize=(10, 6))\\n \\n for model_name, scores in models_results.items():\\n plt.plot(scores['val_accuracy'], label=f'{model_name} validation accuracy')\\n \\n plt.title('Model Comparison')\\n plt.xlabel('Iteration')\\n plt.ylabel('Accuracy')\\n plt.legend()\\n plt.show()\\n```\\n\\n\""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"\n",
"Projet de Machine Learning : Prédiction de Maladies Cardiaques (Version corrigée)\n",
"Dataset : UCI Heart Disease Dataset\n",
"Objectif : Comparer deux architectures de réseaux de neurones pour la prédiction de maladies cardiaques\n",
"\"\"\"\n",
"\n",
"import pandas as pd\n",
"import numpy as np\n",
"import urllib.request\n",
"import ssl\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import StandardScaler\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense, Dropout, BatchNormalization\n",
"from tensorflow.keras.optimizers import Adam\n",
"from tensorflow.keras.callbacks import EarlyStopping\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 1. Chargement des données avec gestion du SSL\n",
"def load_data():\n",
" try:\n",
" # Créer un contexte SSL non-vérifié (à utiliser avec précaution)\n",
" ssl._create_default_https_context = ssl._create_unverified_context\n",
" \n",
" # URL du dataset\n",
" url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data\"\n",
" \n",
" # Définir les noms des colonnes\n",
" columns = ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach',\n",
" 'exang', 'oldpeak', 'slope', 'ca', 'thal', 'target']\n",
" \n",
" print(\"Téléchargement des données...\")\n",
" \n",
" # Télécharger directement dans un DataFrame\n",
" data = pd.read_csv(url, names=columns)\n",
" \n",
" # En cas d'erreur, utiliser un dataset de démonstration\n",
" if data.empty:\n",
" raise Exception(\"Le dataset est vide\")\n",
" \n",
" except Exception as e:\n",
" print(f\"Erreur lors du téléchargement des données: {e}\")\n",
" print(\"Utilisation d'un dataset de démonstration...\")\n",
" \n",
" # Créer un petit dataset de démonstration\n",
" np.random.seed(42)\n",
" n_samples = 300\n",
" \n",
" data = pd.DataFrame({\n",
" 'age': np.random.normal(55, 10, n_samples),\n",
" 'sex': np.random.binomial(1, 0.5, n_samples),\n",
" 'cp': np.random.randint(0, 4, n_samples),\n",
" 'trestbps': np.random.normal(130, 20, n_samples),\n",
" 'chol': np.random.normal(240, 40, n_samples),\n",
" 'fbs': np.random.binomial(1, 0.2, n_samples),\n",
" 'restecg': np.random.randint(0, 3, n_samples),\n",
" 'thalach': np.random.normal(150, 20, n_samples),\n",
" 'exang': np.random.binomial(1, 0.3, n_samples),\n",
" 'oldpeak': np.random.normal(1, 1, n_samples),\n",
" 'slope': np.random.randint(0, 3, n_samples),\n",
" 'ca': np.random.randint(0, 4, n_samples),\n",
" 'thal': np.random.randint(0, 3, n_samples),\n",
" 'target': np.random.binomial(1, 0.4, n_samples)\n",
" })\n",
" \n",
" # Nettoyer les données\n",
" data = data.replace('?', np.nan)\n",
" data = data.dropna()\n",
" \n",
" # Convertir les colonnes en nombres\n",
" for column in data.columns:\n",
" data[column] = pd.to_numeric(data[column])\n",
" \n",
" # Binariser la target (0 pour pas de maladie, 1 pour maladie)\n",
" data['target'] = (data['target'] > 0).astype(int)\n",
" \n",
" return data\n",
"\n",
"# 2. Prétraitement des données\n",
"def preprocess_data(data):\n",
" # Séparer features et target\n",
" X = data.drop('target', axis=1)\n",
" y = data['target']\n",
" \n",
" # Split train/test\n",
" X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
" \n",
" # Standardisation\n",
" scaler = StandardScaler()\n",
" X_train_scaled = scaler.fit_transform(X_train)\n",
" X_test_scaled = scaler.transform(X_test)\n",
" \n",
" return X_train_scaled, X_test_scaled, y_train, y_test\n",
"\n",
"# 3. Premier modèle : Réseau dense classique\n",
"def create_model_1(input_shape):\n",
" model = Sequential([\n",
" Dense(64, activation='relu', input_shape=input_shape),\n",
" BatchNormalization(),\n",
" Dense(32, activation='relu'),\n",
" Dropout(0.3),\n",
" Dense(16, activation='relu'),\n",
" Dense(1, activation='sigmoid')\n",
" ])\n",
" \n",
" model.compile(optimizer=Adam(learning_rate=0.001),\n",
" loss='binary_crossentropy',\n",
" metrics=['accuracy'])\n",
" \n",
" return model\n",
"\n",
"# 4. Second modèle : Réseau plus profond avec régularisation plus forte\n",
"def create_model_2(input_shape):\n",
" model = Sequential([\n",
" Dense(128, activation='relu', input_shape=input_shape),\n",
" BatchNormalization(),\n",
" Dropout(0.3),\n",
" Dense(64, activation='relu'),\n",
" BatchNormalization(),\n",
" Dropout(0.3),\n",
" Dense(32, activation='relu'),\n",
" BatchNormalization(),\n",
" Dense(16, activation='relu'),\n",
" Dense(1, activation='sigmoid')\n",
" ])\n",
" \n",
" model.compile(optimizer=Adam(learning_rate=0.001),\n",
" loss='binary_crossentropy',\n",
" metrics=['accuracy'])\n",
" \n",
" return model\n",
"\n",
"# 5. Fonction d'entraînement et d'évaluation\n",
"def train_and_evaluate(model, X_train, X_test, y_train, y_test, model_name):\n",
" # Early stopping pour éviter le surapprentissage\n",
" early_stopping = EarlyStopping(\n",
" monitor='val_loss',\n",
" patience=10,\n",
" restore_best_weights=True,\n",
" verbose=1\n",
" )\n",
" \n",
" # Entraînement\n",
" history = model.fit(\n",
" X_train, y_train,\n",
" validation_split=0.2,\n",
" epochs=50, # Réduit pour la démonstration\n",
" batch_size=32,\n",
" callbacks=[early_stopping],\n",
" verbose=1\n",
" )\n",
" \n",
" # Évaluation\n",
" test_loss, test_accuracy = model.evaluate(X_test, y_test, verbose=0)\n",
" print(f\"\\n{model_name} - Test Accuracy: {test_accuracy:.4f}\")\n",
" \n",
" return history\n",
"\n",
"# 6. Visualisation des résultats\n",
"def plot_training_history(history1, history2):\n",
" plt.figure(figsize=(12, 4))\n",
" \n",
" # Plot accuracy\n",
" plt.subplot(1, 2, 1)\n",
" plt.plot(history1.history['accuracy'], label='Model 1 accuracy')\n",
" plt.plot(history1.history['val_accuracy'], label='Model 1 val accuracy')\n",
" plt.plot(history2.history['accuracy'], label='Model 2 accuracy')\n",
" plt.plot(history2.history['val_accuracy'], label='Model 2 val accuracy')\n",
" plt.title('Model Accuracy')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Accuracy')\n",
" plt.legend()\n",
" \n",
" # Plot loss\n",
" plt.subplot(1, 2, 2)\n",
" plt.plot(history1.history['loss'], label='Model 1 loss')\n",
" plt.plot(history1.history['val_loss'], label='Model 1 val loss')\n",
" plt.plot(history2.history['loss'], label='Model 2 loss')\n",
" plt.plot(history2.history['val_loss'], label='Model 2 val loss')\n",
" plt.title('Model Loss')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Loss')\n",
" plt.legend()\n",
" \n",
" plt.tight_layout()\n",
" plt.show()\n",
"\n",
"# 7. Programme principal\n",
"def main():\n",
" print(\"Loading data...\")\n",
" data = load_data()\n",
" print(\"Data shape:\", data.shape)\n",
" \n",
" print(\"\\nPreprocessing data...\")\n",
" X_train, X_test, y_train, y_test = preprocess_data(data)\n",
" input_shape = (X_train.shape[1],)\n",
" \n",
" print(\"\\nTraining Model 1...\")\n",
" model1 = create_model_1(input_shape)\n",
" history1 = train_and_evaluate(model1, X_train, X_test, y_train, y_test, \"Model 1\")\n",
" \n",
" print(\"\\nTraining Model 2...\")\n",
" model2 = create_model_2(input_shape)\n",
" history2 = train_and_evaluate(model2, X_train, X_test, y_train, y_test, \"Model 2\")\n",
" \n",
" print(\"\\nPlotting results...\")\n",
" plot_training_history(history1, history2)\n",
"\n",
"if __name__ == \"__main__\":\n",
" main()\n",
" \n",
"\n",
" \n",
"'''\n",
"Modèle 1 : Réseau Dense Classique\n",
"- C'est une architecture relativement simple et légère avec 4 couches :\n",
"1. Première couche : 64 neurones avec activation ReLU\n",
" - Cette couche initiale capture les patterns de base dans les données\n",
" - Suivie d'une normalisation par lots (BatchNormalization) pour stabiliser l'apprentissage\n",
"2. Deuxième couche : 32 neurones avec activation ReLU\n",
" - Suivie d'un Dropout de 30% pour éviter le surapprentissage\n",
"3. Troisième couche : 16 neurones avec activation ReLU\n",
" - Réduit progressivement la dimensionnalité\n",
"4. Couche de sortie : 1 neurone avec activation sigmoid\n",
" - Pour la prédiction binaire (malade/non malade)\n",
" \n",
"Modèle 2 : Réseau Plus Profond\n",
"- C'est une architecture plus complexe avec 5 couches et plus de régularisation :\n",
"1. Première couche : 128 neurones avec activation ReLU\n",
" - Commence avec plus de neurones pour capturer des patterns plus complexes\n",
" - Suivie de BatchNormalization et Dropout 30%\n",
"2. Deuxième couche : 64 neurones avec activation ReLU\n",
" - Également suivie de BatchNormalization et Dropout\n",
"3. Troisième couche : 32 neurones avec activation ReLU\n",
" - Avec BatchNormalization\n",
"4. Quatrième couche : 16 neurones avec activation ReLU\n",
"5. Couche de sortie : 1 neurone avec activation sigmoid\n",
"\n",
"Les principales différences sont :\n",
"1. Complexité : Le modèle 2 a plus de paramètres et de couches\n",
"2. Régularisation : Le modèle 2 utilise plus de BatchNormalization et de Dropout\n",
"3. Capacité d'apprentissage : Le modèle 2 peut capturer des relations plus complexes dans les données\n",
"\n",
"L'idée est de comparer :\n",
"- Une approche simple qui pourrait suffire pour ce problème médical relativement simple\n",
"- Une approche plus complexe qui pourrait potentiellement capturer des patterns plus subtils\n",
"\n",
"Les deux modèles utilisent le même optimiseur (Adam) avec le même learning rate (0.001) pour une comparaison équitable.\n",
"\n",
"Cette configuration permet d'observer si la complexité supplémentaire du deuxième modèle apporte réellement un avantage en termes de performances, ou si le modèle plus simple est suffisant.\n",
"\n",
"- ReLU (Rectified Linear Unit) est une fonction d'activation très populaire en deep learning : ReLu (x) = max (0,x)\n",
"\n",
"- Le Dropout est une technique de régularisation cruciale en deep learning. Voici une explication détaillée :\n",
"Principe de base :\n",
"Pendant l'entraînement, à chaque itération\n",
"Désactive aléatoirement un certain pourcentage de neurones\n",
"Ces neurones sont temporairement \"éteints\" avec toutes leurs connexions\n",
"Le pourcentage est défini par le paramètre de dropout (ex: 0.3 = 30% des neurones)\n",
"\n",
"- La BatchNormalization (ou normalisation par lots) est une technique très importante en deep learning. Voici une explication détaillée :\n",
"Principe fondamental :\n",
"Normalise les activations d'une couche pour chaque batch\n",
"Maintient la moyenne proche de 0 et l'écart-type proche de 1\n",
"S'applique avant la fonction d'activation\n",
"'''\n",
" \n",
"'''\n",
"## Exercice 1 : \n",
"adapter le programme sur les données suivantes : \n",
"https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data\n",
"\n",
"\n",
"## Exercice 2 : \n",
"On vous demande d'implémenter 2 autres modèles en suivant le schéma du programme donné. Sur les 2 data-set. \n",
"\n",
"L'objectif est de rendre un rapport explicatif complet sur au moins un des modèles ; le code doit être commenté et des tests (changement de paramètres : itération, taux, couches réseaux) doivent être fait.\n",
"\n",
"### Premier Modèle : Random Forest Classifier\n",
"\n",
"Ce modèle est particulièrement intéressant car il offre :\n",
"- Une excellente performance sur les données médicales\n",
"- Une interprétabilité des résultats\n",
"- Une facilité relative d'implémentation\n",
"\n",
"Voici un exemple de structure pour l'implémentation :\n",
"\n",
"```python\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"def create_model_rf(X_train, y_train):\n",
" # Création du modèle avec des hyperparamètres de base\n",
" rf_model = RandomForestClassifier(\n",
" n_estimators=100,\n",
" max_depth=10,\n",
" random_state=42\n",
" )\n",
" \n",
" # Définition des paramètres à optimiser\n",
" param_grid = {\n",
" 'n_estimators': [50, 100, 200],\n",
" 'max_depth': [5, 10, 15],\n",
" 'min_samples_split': [2, 5, 10]\n",
" }\n",
" \n",
" # Recherche des meilleurs paramètres\n",
" grid_search = GridSearchCV(\n",
" rf_model,\n",
" param_grid,\n",
" cv=5,\n",
" scoring='accuracy',\n",
" n_jobs=-1\n",
" )\n",
" \n",
" # Entraînement avec recherche des meilleurs paramètres\n",
" grid_search.fit(X_train, y_train)\n",
" \n",
" return grid_search.best_estimator_\n",
"```\n",
"\n",
"### Deuxième Modèle : XGBoost\n",
"\n",
"XGBoost est un algorithme de boosting très performant qui permet souvent d'obtenir d'excellents résultats. Voici une structure d'implémentation :\n",
"\n",
"```python\n",
"import xgboost as xgb\n",
"from sklearn.model_selection import cross_val_score\n",
"\n",
"def create_model_xgb(X_train, y_train):\n",
" # Création du modèle avec des paramètres de base\n",
" xgb_model = xgb.XGBClassifier(\n",
" learning_rate=0.1,\n",
" n_estimators=100,\n",
" max_depth=5,\n",
" random_state=42\n",
" )\n",
" \n",
" # Paramètres à optimiser\n",
" param_grid = {\n",
" 'learning_rate': [0.01, 0.1, 0.3],\n",
" 'n_estimators': [50, 100, 200],\n",
" 'max_depth': [3, 5, 7]\n",
" }\n",
" \n",
" # Optimisation des hyperparamètres\n",
" grid_search = GridSearchCV(\n",
" xgb_model,\n",
" param_grid,\n",
" cv=5,\n",
" scoring='accuracy',\n",
" n_jobs=-1\n",
" )\n",
" \n",
" grid_search.fit(X_train, y_train)\n",
" \n",
" return grid_search.best_estimator_\n",
"```\n",
"\n",
"Pour faciliter l'implémentation, voici les points essentiels à comprendre :\n",
"\n",
"Pour le Random Forest :\n",
"- C'est un ensemble d'arbres de décision\n",
"- Chaque arbre est entraîné sur un sous-ensemble aléatoire des données\n",
"- La prédiction finale est obtenue par vote majoritaire des arbres\n",
"- Les paramètres clés sont le nombre d'arbres (n_estimators) et la profondeur maximale (max_depth)\n",
"\n",
"Pour XGBoost :\n",
"- C'est un algorithme de boosting qui construit les arbres séquentiellement\n",
"- Chaque nouvel arbre corrige les erreurs des arbres précédents\n",
"- Le learning_rate contrôle la contribution de chaque arbre\n",
"- La profondeur des arbres (max_depth) limite la complexité du modèle\n",
"\n",
"Pour l'évaluation des modèles, on peut réutiliser les fonctions de visualisation existantes en les adaptant légèrement. Par exemple :\n",
"\n",
"```python\n",
"def plot_model_comparison(models_results):\n",
" plt.figure(figsize=(10, 6))\n",
" \n",
" for model_name, scores in models_results.items():\n",
" plt.plot(scores['val_accuracy'], label=f'{model_name} validation accuracy')\n",
" \n",
" plt.title('Model Comparison')\n",
" plt.xlabel('Iteration')\n",
" plt.ylabel('Accuracy')\n",
" plt.legend()\n",
" plt.show()\n",
"```\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "2a0e5d3c-a532-4d08-84b9-40e9a8fc8db3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Chargement des données...\n",
"Téléchargement des données...\n",
"Dimension des données: (569, 31)\n",
"\n",
"Prétraitement des données...\n",
"\n",
"Entraînement du Modèle 1...\n",
"Epoch 1/50\n",
"12/12 [==============================] - 2s 38ms/step - loss: 0.5129 - accuracy: 0.7995 - val_loss: 0.5310 - val_accuracy: 0.8901\n",
"Epoch 2/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.3201 - accuracy: 0.9203 - val_loss: 0.4203 - val_accuracy: 0.9341\n",
"Epoch 3/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.2287 - accuracy: 0.9505 - val_loss: 0.3310 - val_accuracy: 0.9231\n",
"Epoch 4/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.1699 - accuracy: 0.9615 - val_loss: 0.2650 - val_accuracy: 0.9451\n",
"Epoch 5/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.1497 - accuracy: 0.9533 - val_loss: 0.2195 - val_accuracy: 0.9451\n",
"Epoch 6/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.1279 - accuracy: 0.9698 - val_loss: 0.1896 - val_accuracy: 0.9560\n",
"Epoch 7/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0874 - accuracy: 0.9890 - val_loss: 0.1657 - val_accuracy: 0.9560\n",
"Epoch 8/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0948 - accuracy: 0.9698 - val_loss: 0.1493 - val_accuracy: 0.9670\n",
"Epoch 9/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0878 - accuracy: 0.9725 - val_loss: 0.1399 - val_accuracy: 0.9560\n",
"Epoch 10/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0675 - accuracy: 0.9780 - val_loss: 0.1285 - val_accuracy: 0.9560\n",
"Epoch 11/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0668 - accuracy: 0.9890 - val_loss: 0.1198 - val_accuracy: 0.9560\n",
"Epoch 12/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0584 - accuracy: 0.9918 - val_loss: 0.1134 - val_accuracy: 0.9670\n",
"Epoch 13/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0701 - accuracy: 0.9753 - val_loss: 0.1099 - val_accuracy: 0.9670\n",
"Epoch 14/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0639 - accuracy: 0.9808 - val_loss: 0.1070 - val_accuracy: 0.9670\n",
"Epoch 15/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0494 - accuracy: 0.9808 - val_loss: 0.1042 - val_accuracy: 0.9670\n",
"Epoch 16/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0662 - accuracy: 0.9780 - val_loss: 0.0980 - val_accuracy: 0.9670\n",
"Epoch 17/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0422 - accuracy: 0.9890 - val_loss: 0.0939 - val_accuracy: 0.9670\n",
"Epoch 18/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0375 - accuracy: 0.9890 - val_loss: 0.0903 - val_accuracy: 0.9560\n",
"Epoch 19/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0431 - accuracy: 0.9863 - val_loss: 0.0889 - val_accuracy: 0.9780\n",
"Epoch 20/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0518 - accuracy: 0.9863 - val_loss: 0.0891 - val_accuracy: 0.9670\n",
"Epoch 21/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0540 - accuracy: 0.9863 - val_loss: 0.0949 - val_accuracy: 0.9670\n",
"Epoch 22/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0441 - accuracy: 0.9835 - val_loss: 0.0992 - val_accuracy: 0.9670\n",
"Epoch 23/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0323 - accuracy: 0.9890 - val_loss: 0.0922 - val_accuracy: 0.9670\n",
"Epoch 24/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0661 - accuracy: 0.9835 - val_loss: 0.0836 - val_accuracy: 0.9780\n",
"Epoch 25/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0613 - accuracy: 0.9863 - val_loss: 0.0873 - val_accuracy: 0.9670\n",
"Epoch 26/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0342 - accuracy: 0.9863 - val_loss: 0.0932 - val_accuracy: 0.9560\n",
"Epoch 27/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0552 - accuracy: 0.9808 - val_loss: 0.1022 - val_accuracy: 0.9560\n",
"Epoch 28/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0242 - accuracy: 0.9918 - val_loss: 0.0961 - val_accuracy: 0.9670\n",
"Epoch 29/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0522 - accuracy: 0.9780 - val_loss: 0.0930 - val_accuracy: 0.9670\n",
"Epoch 30/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0543 - accuracy: 0.9808 - val_loss: 0.0868 - val_accuracy: 0.9670\n",
"Epoch 31/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0216 - accuracy: 0.9945 - val_loss: 0.0919 - val_accuracy: 0.9670\n",
"Epoch 32/50\n",
"12/12 [==============================] - 0s 16ms/step - loss: 0.0465 - accuracy: 0.9863 - val_loss: 0.0962 - val_accuracy: 0.9670\n",
"Epoch 33/50\n",
"12/12 [==============================] - 0s 8ms/step - loss: 0.0227 - accuracy: 0.9918 - val_loss: 0.0994 - val_accuracy: 0.9670\n",
"Epoch 34/50\n",
" 1/12 [=>............................] - ETA: 0s - loss: 0.0190 - accuracy: 1.0000Restoring model weights from the end of the best epoch: 24.\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0455 - accuracy: 0.9918 - val_loss: 0.0943 - val_accuracy: 0.9780\n",
"Epoch 34: early stopping\n",
"\n",
"Model 1 - Test Accuracy: 0.9561\n",
"\n",
"Entraînement du Modèle 2...\n",
"Epoch 1/50\n",
"12/12 [==============================] - 3s 47ms/step - loss: 0.5959 - accuracy: 0.7005 - val_loss: 0.5395 - val_accuracy: 0.9451\n",
"Epoch 2/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.3752 - accuracy: 0.8599 - val_loss: 0.4585 - val_accuracy: 0.9341\n",
"Epoch 3/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.2824 - accuracy: 0.9203 - val_loss: 0.3877 - val_accuracy: 0.9341\n",
"Epoch 4/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.2312 - accuracy: 0.9368 - val_loss: 0.3325 - val_accuracy: 0.9341\n",
"Epoch 5/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.1754 - accuracy: 0.9505 - val_loss: 0.2880 - val_accuracy: 0.9341\n",
"Epoch 6/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.1667 - accuracy: 0.9560 - val_loss: 0.2487 - val_accuracy: 0.9451\n",
"Epoch 7/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.1353 - accuracy: 0.9560 - val_loss: 0.2176 - val_accuracy: 0.9451\n",
"Epoch 8/50\n",
"12/12 [==============================] - 0s 18ms/step - loss: 0.1445 - accuracy: 0.9505 - val_loss: 0.1950 - val_accuracy: 0.9560\n",
"Epoch 9/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.1151 - accuracy: 0.9670 - val_loss: 0.1781 - val_accuracy: 0.9560\n",
"Epoch 10/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0926 - accuracy: 0.9753 - val_loss: 0.1631 - val_accuracy: 0.9560\n",
"Epoch 11/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0940 - accuracy: 0.9698 - val_loss: 0.1501 - val_accuracy: 0.9560\n",
"Epoch 12/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0928 - accuracy: 0.9725 - val_loss: 0.1382 - val_accuracy: 0.9560\n",
"Epoch 13/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0958 - accuracy: 0.9670 - val_loss: 0.1255 - val_accuracy: 0.9560\n",
"Epoch 14/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0690 - accuracy: 0.9808 - val_loss: 0.1299 - val_accuracy: 0.9560\n",
"Epoch 15/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0840 - accuracy: 0.9698 - val_loss: 0.1176 - val_accuracy: 0.9560\n",
"Epoch 16/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0628 - accuracy: 0.9753 - val_loss: 0.1157 - val_accuracy: 0.9560\n",
"Epoch 17/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0584 - accuracy: 0.9808 - val_loss: 0.1213 - val_accuracy: 0.9560\n",
"Epoch 18/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0611 - accuracy: 0.9863 - val_loss: 0.1150 - val_accuracy: 0.9560\n",
"Epoch 19/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0505 - accuracy: 0.9918 - val_loss: 0.1111 - val_accuracy: 0.9560\n",
"Epoch 20/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0411 - accuracy: 0.9863 - val_loss: 0.1211 - val_accuracy: 0.9451\n",
"Epoch 21/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0469 - accuracy: 0.9863 - val_loss: 0.1150 - val_accuracy: 0.9451\n",
"Epoch 22/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0388 - accuracy: 0.9863 - val_loss: 0.1176 - val_accuracy: 0.9451\n",
"Epoch 23/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0691 - accuracy: 0.9780 - val_loss: 0.1092 - val_accuracy: 0.9341\n",
"Epoch 24/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0645 - accuracy: 0.9780 - val_loss: 0.1223 - val_accuracy: 0.9451\n",
"Epoch 25/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0582 - accuracy: 0.9808 - val_loss: 0.1338 - val_accuracy: 0.9451\n",
"Epoch 26/50\n",
"12/12 [==============================] - 0s 9ms/step - loss: 0.0433 - accuracy: 0.9835 - val_loss: 0.1201 - val_accuracy: 0.9560\n",
"Epoch 27/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0469 - accuracy: 0.9808 - val_loss: 0.1089 - val_accuracy: 0.9451\n",
"Epoch 28/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0349 - accuracy: 0.9890 - val_loss: 0.1112 - val_accuracy: 0.9451\n",
"Epoch 29/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0393 - accuracy: 0.9890 - val_loss: 0.1391 - val_accuracy: 0.9451\n",
"Epoch 30/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0459 - accuracy: 0.9808 - val_loss: 0.1096 - val_accuracy: 0.9451\n",
"Epoch 31/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0322 - accuracy: 0.9890 - val_loss: 0.1250 - val_accuracy: 0.9451\n",
"Epoch 32/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0371 - accuracy: 0.9890 - val_loss: 0.1146 - val_accuracy: 0.9451\n",
"Epoch 33/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0637 - accuracy: 0.9753 - val_loss: 0.1191 - val_accuracy: 0.9560\n",
"Epoch 34/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0440 - accuracy: 0.9863 - val_loss: 0.1113 - val_accuracy: 0.9560\n",
"Epoch 35/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0233 - accuracy: 0.9973 - val_loss: 0.1071 - val_accuracy: 0.9560\n",
"Epoch 36/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0873 - accuracy: 0.9753 - val_loss: 0.0946 - val_accuracy: 0.9670\n",
"Epoch 37/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0640 - accuracy: 0.9725 - val_loss: 0.0857 - val_accuracy: 0.9670\n",
"Epoch 38/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0478 - accuracy: 0.9835 - val_loss: 0.0810 - val_accuracy: 0.9670\n",
"Epoch 39/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0414 - accuracy: 0.9808 - val_loss: 0.0805 - val_accuracy: 0.9780\n",
"Epoch 40/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0238 - accuracy: 0.9890 - val_loss: 0.0967 - val_accuracy: 0.9670\n",
"Epoch 41/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0419 - accuracy: 0.9918 - val_loss: 0.0902 - val_accuracy: 0.9670\n",
"Epoch 42/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0290 - accuracy: 0.9890 - val_loss: 0.0686 - val_accuracy: 0.9780\n",
"Epoch 43/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0216 - accuracy: 0.9973 - val_loss: 0.0676 - val_accuracy: 0.9890\n",
"Epoch 44/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0170 - accuracy: 0.9973 - val_loss: 0.0766 - val_accuracy: 0.9780\n",
"Epoch 45/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0211 - accuracy: 0.9918 - val_loss: 0.0742 - val_accuracy: 0.9780\n",
"Epoch 46/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0349 - accuracy: 0.9863 - val_loss: 0.0739 - val_accuracy: 0.9780\n",
"Epoch 47/50\n",
"12/12 [==============================] - 0s 18ms/step - loss: 0.0548 - accuracy: 0.9808 - val_loss: 0.0623 - val_accuracy: 0.9780\n",
"Epoch 48/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0352 - accuracy: 0.9863 - val_loss: 0.0686 - val_accuracy: 0.9670\n",
"Epoch 49/50\n",
"12/12 [==============================] - 0s 10ms/step - loss: 0.0255 - accuracy: 0.9945 - val_loss: 0.0751 - val_accuracy: 0.9780\n",
"Epoch 50/50\n",
"12/12 [==============================] - 0s 11ms/step - loss: 0.0308 - accuracy: 0.9945 - val_loss: 0.0704 - val_accuracy: 0.9780\n",
"\n",
"Model 2 - Test Accuracy: 0.9649\n",
"\n",
"Visualisation des résultats...\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1200x400 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import urllib.request\n",
"import ssl\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import StandardScaler\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense, Dropout, BatchNormalization\n",
"from tensorflow.keras.optimizers import Adam\n",
"from tensorflow.keras.callbacks import EarlyStopping\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 1. Chargement des données\n",
"# Cette fonction télécharge le dataset depuis l'URL et le nettoie\n",
"# Elle gère également les valeurs manquantes et convertit les types de données\n",
"def load_data():\n",
" try:\n",
" ssl._create_default_https_context = ssl._create_unverified_context\n",
" url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data\"\n",
" columns = ['id', 'diagnosis'] + [f'feature_{i}' for i in range(30)]\n",
" print(\"Téléchargement des données...\")\n",
" data = pd.read_csv(url, names=columns)\n",
" if data.empty:\n",
" raise Exception(\"Le dataset est vide\")\n",
" except Exception as e:\n",
" print(f\"Erreur lors du téléchargement des données: {e}\")\n",
" raise\n",
" \n",
" # Convertir 'diagnosis' en variable binaire (M = 1, B = 0)\n",
" data['diagnosis'] = data['diagnosis'].map({'M': 1, 'B': 0})\n",
" \n",
" # Supprimer la colonne ID car elle n'est pas utile pour l'apprentissage\n",
" data = data.drop(columns=['id'])\n",
" \n",
" return data\n",
"\n",
"# 2. Prétraitement des données\n",
"# Sépare les features (X) et la target (y), puis effectue une standardisation des données\n",
"def preprocess_data(data):\n",
" X = data.drop('diagnosis', axis=1)\n",
" y = data['diagnosis']\n",
" X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
" scaler = StandardScaler()\n",
" X_train_scaled = scaler.fit_transform(X_train)\n",
" X_test_scaled = scaler.transform(X_test)\n",
" return X_train_scaled, X_test_scaled, y_train, y_test\n",
"\n",
"# 3. Modèle de réseau de neurones classique\n",
"# Un modèle simple avec quelques couches cachées\n",
"def create_model_1(input_shape):\n",
" model = Sequential([\n",
" Dense(64, activation='relu', input_shape=input_shape),\n",
" BatchNormalization(),\n",
" Dense(32, activation='relu'),\n",
" Dropout(0.3),\n",
" Dense(16, activation='relu'),\n",
" Dense(1, activation='sigmoid')\n",
" ])\n",
" model.compile(optimizer=Adam(learning_rate=0.001),\n",
" loss='binary_crossentropy',\n",
" metrics=['accuracy'])\n",
" return model\n",
"\n",
"# 4. Modèle plus profond avec régularisation plus forte\n",
"# Ajoute plus de couches et de Dropout pour éviter l'overfitting\n",
"def create_model_2(input_shape):\n",
" model = Sequential([\n",
" Dense(128, activation='relu', input_shape=input_shape),\n",
" BatchNormalization(),\n",
" Dropout(0.3),\n",
" Dense(64, activation='relu'),\n",
" BatchNormalization(),\n",
" Dropout(0.3),\n",
" Dense(32, activation='relu'),\n",
" BatchNormalization(),\n",
" Dense(16, activation='relu'),\n",
" Dense(1, activation='sigmoid')\n",
" ])\n",
" model.compile(optimizer=Adam(learning_rate=0.001),\n",
" loss='binary_crossentropy',\n",
" metrics=['accuracy'])\n",
" return model\n",
"\n",
"def train_and_evaluate(model, X_train, X_test, y_train, y_test, model_name):\n",
" early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True, verbose=1)\n",
" history = model.fit(X_train, y_train, validation_split=0.2, epochs=50, batch_size=32, callbacks=[early_stopping], verbose=1)\n",
" test_loss, test_accuracy = model.evaluate(X_test, y_test, verbose=0)\n",
" print(f\"\\n{model_name} - Test Accuracy: {test_accuracy:.4f}\")\n",
" return history\n",
"\n",
"def plot_training_history(history1, history2):\n",
" plt.figure(figsize=(12, 4))\n",
" plt.subplot(1, 2, 1)\n",
" plt.plot(history1.history['accuracy'], label='Model 1 accuracy')\n",
" plt.plot(history1.history['val_accuracy'], label='Model 1 val accuracy')\n",
" plt.plot(history2.history['accuracy'], label='Model 2 accuracy')\n",
" plt.plot(history2.history['val_accuracy'], label='Model 2 val accuracy')\n",
" plt.title('Model Accuracy')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Accuracy')\n",
" plt.legend()\n",
" plt.subplot(1, 2, 2)\n",
" plt.plot(history1.history['loss'], label='Model 1 loss')\n",
" plt.plot(history1.history['val_loss'], label='Model 1 val loss')\n",
" plt.plot(history2.history['loss'], label='Model 2 loss')\n",
" plt.plot(history2.history['val_loss'], label='Model 2 val loss')\n",
" plt.title('Model Loss')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Loss')\n",
" plt.legend()\n",
" plt.tight_layout()\n",
" plt.show()\n",
"\n",
"def main():\n",
" print(\"Chargement des données...\")\n",
" data = load_data()\n",
" print(\"Dimension des données:\", data.shape)\n",
" print(\"\\nPrétraitement des données...\")\n",
" X_train, X_test, y_train, y_test = preprocess_data(data)\n",
" input_shape = (X_train.shape[1],)\n",
" print(\"\\nEntraînement du Modèle 1...\")\n",
" model1 = create_model_1(input_shape)\n",
" history1 = train_and_evaluate(model1, X_train, X_test, y_train, y_test, \"Model 1\")\n",
" print(\"\\nEntraînement du Modèle 2...\")\n",
" model2 = create_model_2(input_shape)\n",
" history2 = train_and_evaluate(model2, X_train, X_test, y_train, y_test, \"Model 2\")\n",
" print(\"\\nVisualisation des résultats...\")\n",
" plot_training_history(history1, history2)\n",
"\n",
"if __name__ == \"__main__\":\n",
" main()\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "1cf760cd-464b-485a-808b-5d0213629b6b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Chargement des données...\n",
"Téléchargement des données...\n",
"Dimension des données: (297, 14)\n",
"\n",
"Prétraitement des données...\n",
"\n",
"Entraînement du Modèle 1...\n",
"Epoch 1/50\n",
"6/6 [==============================] - 2s 128ms/step - loss: 0.6726 - accuracy: 0.5714 - val_loss: 0.6936 - val_accuracy: 0.4375\n",
"Epoch 2/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.6053 - accuracy: 0.6508 - val_loss: 0.6665 - val_accuracy: 0.5833\n",
"Epoch 3/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.5555 - accuracy: 0.7037 - val_loss: 0.6432 - val_accuracy: 0.7292\n",
"Epoch 4/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.5297 - accuracy: 0.7407 - val_loss: 0.6233 - val_accuracy: 0.7292\n",
"Epoch 5/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.5108 - accuracy: 0.7725 - val_loss: 0.6030 - val_accuracy: 0.7500\n",
"Epoch 6/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.4443 - accuracy: 0.8095 - val_loss: 0.5857 - val_accuracy: 0.7500\n",
"Epoch 7/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.4542 - accuracy: 0.8360 - val_loss: 0.5711 - val_accuracy: 0.7500\n",
"Epoch 8/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.4128 - accuracy: 0.8307 - val_loss: 0.5559 - val_accuracy: 0.7708\n",
"Epoch 9/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.4183 - accuracy: 0.8095 - val_loss: 0.5407 - val_accuracy: 0.7708\n",
"Epoch 10/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.3841 - accuracy: 0.8360 - val_loss: 0.5273 - val_accuracy: 0.7708\n",
"Epoch 11/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.3808 - accuracy: 0.8413 - val_loss: 0.5168 - val_accuracy: 0.7708\n",
"Epoch 12/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.3372 - accuracy: 0.8730 - val_loss: 0.5076 - val_accuracy: 0.7917\n",
"Epoch 13/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.3501 - accuracy: 0.8413 - val_loss: 0.4959 - val_accuracy: 0.7917\n",
"Epoch 14/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.3666 - accuracy: 0.8519 - val_loss: 0.4896 - val_accuracy: 0.7708\n",
"Epoch 15/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.3219 - accuracy: 0.8624 - val_loss: 0.4819 - val_accuracy: 0.7708\n",
"Epoch 16/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.3346 - accuracy: 0.8783 - val_loss: 0.4751 - val_accuracy: 0.7708\n",
"Epoch 17/50\n",
"6/6 [==============================] - 0s 13ms/step - loss: 0.2917 - accuracy: 0.9048 - val_loss: 0.4702 - val_accuracy: 0.7708\n",
"Epoch 18/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.3021 - accuracy: 0.8783 - val_loss: 0.4684 - val_accuracy: 0.7708\n",
"Epoch 19/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.2949 - accuracy: 0.8730 - val_loss: 0.4693 - val_accuracy: 0.7708\n",
"Epoch 20/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.3028 - accuracy: 0.8624 - val_loss: 0.4744 - val_accuracy: 0.7917\n",
"Epoch 21/50\n",
"6/6 [==============================] - 0s 13ms/step - loss: 0.2837 - accuracy: 0.8995 - val_loss: 0.4743 - val_accuracy: 0.7917\n",
"Epoch 22/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2644 - accuracy: 0.8942 - val_loss: 0.4703 - val_accuracy: 0.7917\n",
"Epoch 23/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.2787 - accuracy: 0.8783 - val_loss: 0.4687 - val_accuracy: 0.7917\n",
"Epoch 24/50\n",
"6/6 [==============================] - 0s 13ms/step - loss: 0.2607 - accuracy: 0.8942 - val_loss: 0.4725 - val_accuracy: 0.7708\n",
"Epoch 25/50\n",
"6/6 [==============================] - 0s 22ms/step - loss: 0.2635 - accuracy: 0.9101 - val_loss: 0.4762 - val_accuracy: 0.7708\n",
"Epoch 26/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.2532 - accuracy: 0.8942 - val_loss: 0.4795 - val_accuracy: 0.7708\n",
"Epoch 27/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2781 - accuracy: 0.8836 - val_loss: 0.4803 - val_accuracy: 0.7917\n",
"Epoch 28/50\n",
"1/6 [====>.........................] - ETA: 0s - loss: 0.2628 - accuracy: 0.8438Restoring model weights from the end of the best epoch: 18.\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2181 - accuracy: 0.9153 - val_loss: 0.4796 - val_accuracy: 0.7917\n",
"Epoch 28: early stopping\n",
"\n",
"Model 1 - Test Accuracy: 0.9000\n",
"\n",
"Entraînement du Modèle 2...\n",
"Epoch 1/50\n",
"6/6 [==============================] - 3s 99ms/step - loss: 0.7850 - accuracy: 0.5556 - val_loss: 0.6804 - val_accuracy: 0.6458\n",
"Epoch 2/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.6244 - accuracy: 0.6984 - val_loss: 0.6675 - val_accuracy: 0.6250\n",
"Epoch 3/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.5951 - accuracy: 0.7037 - val_loss: 0.6540 - val_accuracy: 0.6667\n",
"Epoch 4/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.5336 - accuracy: 0.7407 - val_loss: 0.6397 - val_accuracy: 0.7083\n",
"Epoch 5/50\n",
"6/6 [==============================] - 0s 18ms/step - loss: 0.4938 - accuracy: 0.7672 - val_loss: 0.6284 - val_accuracy: 0.6875\n",
"Epoch 6/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.4418 - accuracy: 0.7884 - val_loss: 0.6183 - val_accuracy: 0.7292\n",
"Epoch 7/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.4246 - accuracy: 0.8360 - val_loss: 0.6073 - val_accuracy: 0.7292\n",
"Epoch 8/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.4053 - accuracy: 0.8360 - val_loss: 0.5955 - val_accuracy: 0.7500\n",
"Epoch 9/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3941 - accuracy: 0.8254 - val_loss: 0.5831 - val_accuracy: 0.7500\n",
"Epoch 10/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3762 - accuracy: 0.8571 - val_loss: 0.5713 - val_accuracy: 0.7500\n",
"Epoch 11/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3831 - accuracy: 0.8095 - val_loss: 0.5591 - val_accuracy: 0.7708\n",
"Epoch 12/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3737 - accuracy: 0.8254 - val_loss: 0.5458 - val_accuracy: 0.7500\n",
"Epoch 13/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3206 - accuracy: 0.8519 - val_loss: 0.5351 - val_accuracy: 0.7292\n",
"Epoch 14/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3356 - accuracy: 0.8413 - val_loss: 0.5237 - val_accuracy: 0.7500\n",
"Epoch 15/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.2974 - accuracy: 0.8624 - val_loss: 0.5149 - val_accuracy: 0.7500\n",
"Epoch 16/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3358 - accuracy: 0.8466 - val_loss: 0.5082 - val_accuracy: 0.7500\n",
"Epoch 17/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.3013 - accuracy: 0.8677 - val_loss: 0.5025 - val_accuracy: 0.7708\n",
"Epoch 18/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.3208 - accuracy: 0.8783 - val_loss: 0.4991 - val_accuracy: 0.7708\n",
"Epoch 19/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2584 - accuracy: 0.8942 - val_loss: 0.5003 - val_accuracy: 0.7708\n",
"Epoch 20/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3307 - accuracy: 0.8624 - val_loss: 0.4953 - val_accuracy: 0.7708\n",
"Epoch 21/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.3249 - accuracy: 0.8624 - val_loss: 0.4936 - val_accuracy: 0.7708\n",
"Epoch 22/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.2679 - accuracy: 0.8836 - val_loss: 0.4936 - val_accuracy: 0.7708\n",
"Epoch 23/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.2829 - accuracy: 0.8995 - val_loss: 0.4963 - val_accuracy: 0.7708\n",
"Epoch 24/50\n",
"6/6 [==============================] - 0s 14ms/step - loss: 0.3027 - accuracy: 0.8836 - val_loss: 0.4958 - val_accuracy: 0.7708\n",
"Epoch 25/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2284 - accuracy: 0.8889 - val_loss: 0.4924 - val_accuracy: 0.7708\n",
"Epoch 26/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2505 - accuracy: 0.8942 - val_loss: 0.4890 - val_accuracy: 0.7708\n",
"Epoch 27/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.2924 - accuracy: 0.8889 - val_loss: 0.4864 - val_accuracy: 0.7708\n",
"Epoch 28/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2524 - accuracy: 0.9153 - val_loss: 0.4880 - val_accuracy: 0.7708\n",
"Epoch 29/50\n",
"6/6 [==============================] - 0s 15ms/step - loss: 0.2920 - accuracy: 0.8889 - val_loss: 0.4899 - val_accuracy: 0.7708\n",
"Epoch 30/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2480 - accuracy: 0.8677 - val_loss: 0.4903 - val_accuracy: 0.7708\n",
"Epoch 31/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2126 - accuracy: 0.9153 - val_loss: 0.4957 - val_accuracy: 0.7500\n",
"Epoch 32/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2365 - accuracy: 0.9048 - val_loss: 0.5023 - val_accuracy: 0.7500\n",
"Epoch 33/50\n",
"6/6 [==============================] - 0s 17ms/step - loss: 0.2467 - accuracy: 0.8942 - val_loss: 0.5030 - val_accuracy: 0.7500\n",
"Epoch 34/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2289 - accuracy: 0.9101 - val_loss: 0.5044 - val_accuracy: 0.7500\n",
"Epoch 35/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2143 - accuracy: 0.8889 - val_loss: 0.5049 - val_accuracy: 0.7500\n",
"Epoch 36/50\n",
"6/6 [==============================] - 0s 16ms/step - loss: 0.2786 - accuracy: 0.8783 - val_loss: 0.5102 - val_accuracy: 0.7500\n",
"Epoch 37/50\n",
"1/6 [====>.........................] - ETA: 0s - loss: 0.2511 - accuracy: 0.8750Restoring model weights from the end of the best epoch: 27.\n",
"6/6 [==============================] - 0s 18ms/step - loss: 0.1923 - accuracy: 0.9365 - val_loss: 0.5136 - val_accuracy: 0.7500\n",
"Epoch 37: early stopping\n",
"\n",
"Model 2 - Test Accuracy: 0.8833\n",
"\n",
"Entraînement du Random Forest...\n",
"\n",
"Random Forest - Test Accuracy: 0.8833\n",
"\n",
"Entraînement de XGBoost...\n",
"\n",
"XGBoost - Test Accuracy: 0.8167\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1200x400 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import urllib.request\n",
"import ssl\n",
"from sklearn.model_selection import train_test_split, GridSearchCV\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"import xgboost as xgb\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense, Dropout, BatchNormalization\n",
"from tensorflow.keras.optimizers import Adam\n",
"from tensorflow.keras.callbacks import EarlyStopping\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 1. Chargement des données\n",
"# Cette fonction télécharge le dataset depuis l'URL et le nettoie\n",
"# Elle gère également les valeurs manquantes et convertit les types de données\n",
"def load_data():\n",
" try:\n",
" ssl._create_default_https_context = ssl._create_unverified_context\n",
" url = \"https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data\"\n",
" columns = ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach',\n",
" 'exang', 'oldpeak', 'slope', 'ca', 'thal', 'target']\n",
" print(\"Téléchargement des données...\")\n",
" data = pd.read_csv(url, names=columns)\n",
" if data.empty:\n",
" raise Exception(\"Le dataset est vide\")\n",
" except Exception as e:\n",
" print(f\"Erreur lors du téléchargement des données: {e}\")\n",
" raise\n",
" \n",
" data = data.replace('?', np.nan)\n",
" data = data.dropna()\n",
" for column in data.columns:\n",
" data[column] = pd.to_numeric(data[column])\n",
" data['target'] = (data['target'] > 0).astype(int)\n",
" return data\n",
"\n",
"# 2. Prétraitement des données\n",
"# Sépare les features (X) et la target (y), puis effectue une standardisation des données\n",
"def preprocess_data(data):\n",
" X = data.drop('target', axis=1)\n",
" y = data['target']\n",
" X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
" scaler = StandardScaler()\n",
" X_train_scaled = scaler.fit_transform(X_train)\n",
" X_test_scaled = scaler.transform(X_test)\n",
" return X_train_scaled, X_test_scaled, y_train, y_test\n",
"\n",
"\n",
"# 3. Modèle de réseau de neurones classique\n",
"# Un modèle simple avec quelques couches cachées\n",
"def create_model_1(input_shape):\n",
" model = Sequential([\n",
" Dense(64, activation='relu', input_shape=input_shape),\n",
" BatchNormalization(),\n",
" Dense(32, activation='relu'),\n",
" Dropout(0.3),\n",
" Dense(16, activation='relu'),\n",
" Dense(1, activation='sigmoid')\n",
" ])\n",
" model.compile(optimizer=Adam(learning_rate=0.001),\n",
" loss='binary_crossentropy',\n",
" metrics=['accuracy'])\n",
" return model\n",
"\n",
"# 4. Modèle plus profond avec régularisation plus forte\n",
"# Ajoute plus de couches et de Dropout pour éviter l'overfitting\n",
"def create_model_2(input_shape):\n",
" model = Sequential([\n",
" Dense(128, activation='relu', input_shape=input_shape),\n",
" BatchNormalization(),\n",
" Dropout(0.3),\n",
" Dense(64, activation='relu'),\n",
" BatchNormalization(),\n",
" Dropout(0.3),\n",
" Dense(32, activation='relu'),\n",
" BatchNormalization(),\n",
" Dense(16, activation='relu'),\n",
" Dense(1, activation='sigmoid')\n",
" ])\n",
" model.compile(optimizer=Adam(learning_rate=0.001),\n",
" loss='binary_crossentropy',\n",
" metrics=['accuracy'])\n",
" return model\n",
"\n",
"# 5. Modèle Random Forest avec recherche d'hyperparamètres\n",
"def create_model_rf(X_train, y_train):\n",
" rf_model = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42)\n",
" param_grid = {'n_estimators': [50, 100, 200], 'max_depth': [5, 10, 15], 'min_samples_split': [2, 5, 10]}\n",
" grid_search = GridSearchCV(rf_model, param_grid, cv=5, scoring='accuracy', n_jobs=-1)\n",
" grid_search.fit(X_train, y_train)\n",
" return grid_search.best_estimator_\n",
"\n",
"# 6. Modèle XGBoost avec GridSearchCV pour optimiser les hyperparamètres\n",
"def create_model_xgb(X_train, y_train):\n",
" xgb_model = xgb.XGBClassifier(learning_rate=0.1, n_estimators=100, max_depth=5, random_state=42)\n",
" \n",
" param_grid = {\n",
" 'learning_rate': [0.01, 0.1, 0.3],\n",
" 'n_estimators': [50, 100, 200],\n",
" 'max_depth': [3, 5, 7]\n",
" }\n",
" \n",
" grid_search = GridSearchCV(estimator=xgb_model, param_grid=param_grid, cv=5, scoring='accuracy', n_jobs=1)\n",
" grid_search.fit(X_train, y_train)\n",
" \n",
" return grid_search.best_estimator_\n",
"\n",
"# 7. Fonction d'entraînement et d'évaluation pour les réseaux de neurones\n",
"def train_and_evaluate(model, X_train, X_test, y_train, y_test, model_name):\n",
" early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True, verbose=1)\n",
" history = model.fit(X_train, y_train, validation_split=0.2, epochs=50, batch_size=32, callbacks=[early_stopping], verbose=1)\n",
" test_loss, test_accuracy = model.evaluate(X_test, y_test, verbose=0)\n",
" print(f\"\\n{model_name} - Test Accuracy: {test_accuracy:.4f}\")\n",
" return history\n",
"\n",
"# 8. Fonction pour Random Forest et XGBoost\n",
"def train_and_evaluate_rf_xgb(model, X_train, X_test, y_train, y_test, model_name):\n",
" model.fit(X_train, y_train)\n",
" test_accuracy = model.score(X_test, y_test)\n",
" print(f\"\\n{model_name} - Test Accuracy: {test_accuracy:.4f}\")\n",
" return test_accuracy\n",
"\n",
"# 9. Visualisation des performances de tous les modèles\n",
"def plot_training_history(history1, history2, rf_accuracy, xgb_accuracy):\n",
" plt.figure(figsize=(12, 4))\n",
" \n",
" # Graphique de l'accuracy\n",
" plt.subplot(1, 2, 1)\n",
" plt.plot(history1.history['accuracy'], label='Model 1 accuracy')\n",
" plt.plot(history1.history['val_accuracy'], label='Model 1 val accuracy')\n",
" plt.plot(history2.history['accuracy'], label='Model 2 accuracy')\n",
" plt.plot(history2.history['val_accuracy'], label='Model 2 val accuracy')\n",
" plt.axhline(y=rf_accuracy, color='g', linestyle='--', label='Random Forest accuracy')\n",
" plt.axhline(y=xgb_accuracy, color='r', linestyle='--', label='XGBoost accuracy')\n",
" plt.title('Model Accuracy')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Accuracy')\n",
" plt.legend()\n",
"\n",
" # Graphique de la loss\n",
" plt.subplot(1, 2, 2)\n",
" plt.plot(history1.history['loss'], label='Model 1 loss')\n",
" plt.plot(history1.history['val_loss'], label='Model 1 val loss')\n",
" plt.plot(history2.history['loss'], label='Model 2 loss')\n",
" plt.plot(history2.history['val_loss'], label='Model 2 val loss')\n",
" plt.title('Model Loss')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Loss')\n",
" plt.legend()\n",
"\n",
" plt.tight_layout()\n",
" plt.show()\n",
"\n",
"# 10. Programme principal\n",
"def main():\n",
" print(\"Chargement des données...\")\n",
" data = load_data()\n",
" print(\"Dimension des données:\", data.shape)\n",
" print(\"\\nPrétraitement des données...\")\n",
" X_train, X_test, y_train, y_test = preprocess_data(data)\n",
" \n",
" # Réseaux de neurones\n",
" print(\"\\nEntraînement du Modèle 1...\")\n",
" model1 = create_model_1((X_train.shape[1],))\n",
" history1 = train_and_evaluate(model1, X_train, X_test, y_train, y_test, \"Model 1\")\n",
"\n",
" print(\"\\nEntraînement du Modèle 2...\")\n",
" model2 = create_model_2((X_train.shape[1],))\n",
" history2 = train_and_evaluate(model2, X_train, X_test, y_train, y_test, \"Model 2\")\n",
"\n",
" print(\"\\nEntraînement du Random Forest...\")\n",
" rf_model = create_model_rf(X_train, y_train)\n",
" rf_accuracy = train_and_evaluate_rf_xgb(rf_model, X_train, X_test, y_train, y_test, \"Random Forest\")\n",
"\n",
" print(\"\\nEntraînement de XGBoost...\")\n",
" xgb_model = create_model_xgb(X_train, y_train)\n",
" xgb_accuracy = train_and_evaluate_rf_xgb(xgb_model, X_train, X_test, y_train, y_test, \"XGBoost\")\n",
"\n",
" plot_training_history(history1, history2, rf_accuracy, xgb_accuracy)\n",
"\n",
"if __name__ == \"__main__\":\n",
" main()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a8371c4d-21a1-48a4-bbba-2c1857feac9a",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python (tensorflow_env)",
"language": "python",
"name": "tensorflow_env"
},
"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.9.15"
}
},
"nbformat": 4,
"nbformat_minor": 5
}