From b994a3f517950e50ac01f99573b64640eda1696a Mon Sep 17 00:00:00 2001
From: "thibault.capt" <thibault.capt@hes-so.ch>
Date: Wed, 15 Nov 2023 18:40:10 +0100
Subject: [PATCH] update code

---
 .idea/misc.xml          |  2 +-
 .idea/tp-clustering.iml |  2 +-
 decisiontree-iris.py    | 41 +++++++++++++++++++++++++++++------------
 decisiontree-student.py | 33 +++++++++++++++++++++++++--------
 perceptron-tp3.py       | 15 +++++++++------
 5 files changed, 65 insertions(+), 28 deletions(-)

diff --git a/.idea/misc.xml b/.idea/misc.xml
index da907c3..1a02e2c 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -6,5 +6,5 @@
   <component name="MarkdownSettingsMigration">
     <option name="stateVersion" value="1" />
   </component>
-  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (tp-clustering)" project-jdk-type="Python SDK" />
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10.12 WSL (Ubuntu-20.04): (/home/thib/.virtualenvs/tp-clustering/bin/python)" project-jdk-type="Python SDK" />
 </project>
\ No newline at end of file
diff --git a/.idea/tp-clustering.iml b/.idea/tp-clustering.iml
index 74d515a..df7c332 100644
--- a/.idea/tp-clustering.iml
+++ b/.idea/tp-clustering.iml
@@ -4,7 +4,7 @@
     <content url="file://$MODULE_DIR$">
       <excludeFolder url="file://$MODULE_DIR$/venv" />
     </content>
-    <orderEntry type="inheritedJdk" />
+    <orderEntry type="jdk" jdkName="Python 3.10.12 WSL (Ubuntu-20.04): (/home/thib/.virtualenvs/tp-clustering/bin/python)" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
 </module>
\ No newline at end of file
diff --git a/decisiontree-iris.py b/decisiontree-iris.py
index c69fd0a..21e292b 100644
--- a/decisiontree-iris.py
+++ b/decisiontree-iris.py
@@ -1,6 +1,6 @@
 # Import des bibliothèques nécessaires
 import pandas as pd
-from sklearn.model_selection import train_test_split
+from sklearn.model_selection import train_test_split, GridSearchCV
 from sklearn.tree import DecisionTreeClassifier
 from sklearn.metrics import accuracy_score
 from sklearn.tree import plot_tree
@@ -15,24 +15,41 @@ X_iris = df_iris.drop('class', axis=1)
 y_iris = df_iris['class']
 
 # Division des données en ensembles d'entraînement et de test
-X_train_iris, X_test_iris, y_train_iris, y_test_iris = train_test_split(X_iris, y_iris, test_size=0.2, random_state=42)
+X_train, X_test, y_train, y_test = train_test_split(X_iris, y_iris, test_size=0.2, random_state=42)
 
-# Construction de l'arbre de décision avec des paramètres spécifiques
-clf_iris = DecisionTreeClassifier(min_samples_leaf=5, max_depth=3)
-clf_iris.fit(X_train_iris, y_train_iris)
+# Définition de la grille des hyperparamètres à explorer
+param_grid = {
+    'min_samples_leaf': [1, 3, 5, 7],
+    'max_depth': [5, 8, 10, 12, 15]
+}
+
+# Création de l'objet DecisionTreeClassifier
+dt = DecisionTreeClassifier()
+
+# Recherche par grille
+grid_search = GridSearchCV(dt, param_grid, cv=5)
+grid_search.fit(X_train, y_train)
+
+# Affichage des meilleurs paramètres
+best_params = grid_search.best_params_
+print(f"Meilleurs paramètres: {best_params}")
+
+# Utilisation des meilleurs paramètres pour créer le modèle final
+best_clf = DecisionTreeClassifier(min_samples_leaf=best_params['min_samples_leaf'], max_depth=best_params['max_depth'])
+best_clf.fit(X_train, y_train)
 
 # Prédictions sur les ensembles d'entraînement et de test
-y_train_pred_iris = clf_iris.predict(X_train_iris)
-y_test_pred_iris = clf_iris.predict(X_test_iris)
+y_train_pred = best_clf.predict(X_train)
+y_test_pred = best_clf.predict(X_test)
 
 # Mesure du taux de classification correcte
-train_accuracy_iris = accuracy_score(y_train_iris, y_train_pred_iris)
-test_accuracy_iris = accuracy_score(y_test_iris, y_test_pred_iris)
+train_accuracy = accuracy_score(y_train, y_train_pred)
+test_accuracy = accuracy_score(y_test, y_test_pred)
 
-print(f'Taux de classification correcte (Entraînement): {train_accuracy_iris:.2f}')
-print(f'Taux de classification correcte (Test): {test_accuracy_iris:.2f}')
+print(f'Taux de classification correcte (Entraînement): {train_accuracy:.2f}')
+print(f'Taux de classification correcte (Test): {test_accuracy:.2f}')
 
 # Visualisation de l'arbre de décision
 plt.figure(figsize=(12, 8))
-plot_tree(clf_iris, filled=True, feature_names=X_iris.columns, class_names=df_iris['class'].unique(), rounded=True)
+plot_tree(best_clf, filled=True, feature_names=X_iris.columns, class_names=df_iris['class'].unique(), rounded=True)
 plt.show()
diff --git a/decisiontree-student.py b/decisiontree-student.py
index 17afbba..d99db01 100644
--- a/decisiontree-student.py
+++ b/decisiontree-student.py
@@ -1,6 +1,6 @@
 # Import des bibliothèques nécessaires
 import pandas as pd
-from sklearn.model_selection import train_test_split
+from sklearn.model_selection import train_test_split, GridSearchCV
 from sklearn.tree import DecisionTreeClassifier
 from sklearn.metrics import accuracy_score
 from sklearn.tree import plot_tree
@@ -15,15 +15,32 @@ X = df.drop('success', axis=1)
 y = df['success']
 
 # Division des données en ensembles d'entraînement et de test
-X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # Vous pouvez ajuster la taille du test si nécessaire
+X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
 
-# Construction de l'arbre de décision avec des paramètres spécifiques
-clf = DecisionTreeClassifier(min_samples_leaf=5, max_depth=3)
-clf.fit(X_train, y_train)
+# Définition de la grille des hyperparamètres à explorer
+param_grid = {
+    'min_samples_leaf': [1, 3, 5, 7],
+    'max_depth': [5, 8, 10]
+}
+
+# Création de l'objet DecisionTreeClassifier
+dt = DecisionTreeClassifier()
+
+# Recherche par grille
+grid_search = GridSearchCV(dt, param_grid, cv=5)
+grid_search.fit(X_train, y_train)
+
+# Affichage des meilleurs paramètres
+best_params = grid_search.best_params_
+print(f"Meilleurs paramètres: {best_params}")
+
+# Utilisation des meilleurs paramètres pour créer le modèle final
+best_clf = DecisionTreeClassifier(min_samples_leaf=best_params['min_samples_leaf'], max_depth=best_params['max_depth'])
+best_clf.fit(X_train, y_train)
 
 # Prédictions sur les ensembles d'entraînement et de test
-y_train_pred = clf.predict(X_train)
-y_test_pred = clf.predict(X_test)
+y_train_pred = best_clf.predict(X_train)
+y_test_pred = best_clf.predict(X_test)
 
 # Mesure du taux de classification correcte
 train_accuracy = accuracy_score(y_train, y_train_pred)
@@ -34,5 +51,5 @@ print(f'Taux de classification correcte (Test): {test_accuracy:.2f}')
 
 # Visualisation de l'arbre de décision
 plt.figure(figsize=(12, 8))
-plot_tree(clf, filled=True, feature_names=X.columns, class_names=['0', '1'], rounded=True)
+plot_tree(best_clf, filled=True, feature_names=X.columns, class_names=['0', '1'], rounded=True)
 plt.show()
diff --git a/perceptron-tp3.py b/perceptron-tp3.py
index 97c970a..eeb7303 100644
--- a/perceptron-tp3.py
+++ b/perceptron-tp3.py
@@ -6,7 +6,6 @@ import numpy as np
 import pandas as pd
 from matplotlib import pyplot as plt
 
-
 def upd_weights_hidden(wi_old, learning, delta, xi):
     return wi_old + learning * np.outer(xi, delta)
 
@@ -39,7 +38,7 @@ if __name__ == '__main__':
     max_iterations = 2000
     num_hidden = 10
 
-    # Initialize weights for input to hidden layer and hidden to output layer
+    # Initialiser les poids pour l'entrée dans la couche cachée et masqués dans la couche de sortie
     weights_input_hidden = np.random.rand(num_features + 1, num_hidden) - 0.5
     weights_hidden_output = np.random.rand(num_hidden + 1) - 0.5
 
@@ -53,10 +52,10 @@ if __name__ == '__main__':
             input_data = np.insert(X[i], 0, 1)
             target = y[i]
 
-            # Forward pass
+            # Passe avant
             output, hidden_output = predict(weights_input_hidden, weights_hidden_output, input_data)
 
-            # Backpropagation
+            # Rétro propagation
             delta_output = output * (1 - output) * (target - output)
             weights_hidden_output = upd_weights_output(weights_hidden_output, learning_rate, delta_output,
                                                        np.insert(hidden_output, 0, 1))
@@ -66,7 +65,8 @@ if __name__ == '__main__':
 
             total_error += (target - output) ** 2 / 2
 
-        print(f"Iteration {iteration + 1}: Error = {total_error}")
+        if (iteration % 10 == 0) or iteration == 0: # print tous les 5 iterations
+            print(f"Iteration {iteration + 1}: Error = {total_error}")
 
     # Calcul du taux de classification correcte
     correct_classifications = 0
@@ -81,10 +81,13 @@ if __name__ == '__main__':
     accuracy = correct_classifications / len(X)
     print(f"Taux de classifications correctes: {accuracy * 100}%")
 
-    # Affichage de la droite de séparation des classes
+    # Extraction des poids de la couche cachée vers la couche d'entrée
     w1, w2, b = weights_input_hidden[1, 1], weights_input_hidden[2, 1], weights_input_hidden[0, 1]
+
+    # Calcul de la pente et de l'ordonnée à l'origine de la droite de séparation
     pente = -w1 / w2
     intercept = -b / w2
+
     print(f"Droite de séparation: y = {pente}x + {intercept}")
 
     # Tracer la droite de séparation
-- 
GitLab