1326 lines
427 KiB
Plaintext
1326 lines
427 KiB
Plaintext
|
{
|
||
|
"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
|
||
|
}
|