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