diff --git a/fondamentaux/01-regression_lineaire.py b/fondamentaux/01-regression_lineaire.py index d09ad01..14a5a4a 100644 --- a/fondamentaux/01-regression_lineaire.py +++ b/fondamentaux/01-regression_lineaire.py @@ -87,7 +87,7 @@ y_predict_skl=model_skl.predict(x1_new) # Prédiction # Résultats ############################################################################### -# Plot +# Plot des données donnees_ax.set_title("Données") donnees_ax.plot(x1_new, y_predict, 'r-', label="Prédictions") donnees_ax.plot(x1_new, y_predict_skl, 'y-', label="Prédictions - Scikit-Learn") diff --git a/fondamentaux/06-regression_logistique.py b/fondamentaux/06-regression_logistique.py new file mode 100644 index 0000000..9d04a62 --- /dev/null +++ b/fondamentaux/06-regression_logistique.py @@ -0,0 +1,91 @@ +import time +import numpy as np +import sklearn +import matplotlib.pyplot as plt + +############################################################################### +# 06-regression_logistique.py +# @title: Apprentissage par régression logistique +# @project: Mes scripts de ML +# @lang: fr +# @authors: Philippe Roy +# @copyright: Copyright (C) 2023 Philippe Roy +# @license: GNU GPL +############################################################################### + +### +# Commandes NumPy : +# - np.array : créer un tableau à partir d'une liste de listes +# - np.linspace : créer un tableau 1D de la valeur de début à la valeur de fin avec n valeurs +# - .reshape : reformater la tableau avec le nombre de lignes et le nombre de colonnes +### + +### +# Commandes Scikit-Learn : +# - sklearn.linear_model.LogisticRegression : créer un modèle de régression logistique (méthode des moindres carrés) +# - .fit : entrainement du modèle +# - .predict : prédiction du modèle +### + +############################################################################### +# Initialisation +############################################################################### + +# Init du temps +t_debut = time.time() + +# Init des plots +fig = plt.figure(figsize=(15, 5)) +fig.suptitle("Régression logistique") +donnees_ax = fig.add_subplot(111) # Observations : x1 et cibles : y +# donnees_ax = fig.add_subplot(141) # Observations : x1 et cibles : y +# model_ax = fig.add_subplot(142) # Modèle : theta0, theta1 +# couts_ax = fig.add_subplot(143) # Coûts : RMSE, MSE, ... +# app_ax = fig.add_subplot(144) # Taux d'apprentissage : eta + +############################################################################### +# Observations +############################################################################### + +# Observations d'apprentisage +iris = sklearn.datasets.load_iris() # Jeu de données Iris +x1 = iris['data'][:, 3].reshape(-1, 1) # Largeur de pétale, reshape : -1 -> nb de ligne automatique +y = (iris["target"] == 2).astype(np.int32) # Si Iris virginica -> 1 sinon -> 0 +donnees_ax.plot(x1[y==0], y[y==0], "bs", label="Observations - Iris non-virginica") +donnees_ax.plot(x1[y==1], y[y==1], "g^" , label="Observations - Iris virginica") + +# Nouvelles observations +x1_new=np.linspace(0, 3, 1000).reshape(-1, 1) # reshape : -1 -> nb de ligne automatique + +############################################################################### +# Phase d'apprentissage +############################################################################### + +model = sklearn.linear_model.LogisticRegression() # Modèle régression logistique +model.fit(x1, y) # Entrainement + +############################################################################### +# Phase d'inférence +############################################################################### + +y_predict=model.predict(x1_new) # Prédiction +y_proba = model.predict_proba(x1_new) # Probabilité +frontiere_decision = x1_new[y_proba[:, 1] >= 0.5][0][0] + +############################################################################### +# Résultats +############################################################################### + +# Plot des données +donnees_ax.set_title("Frontière de décision") +# donnees_ax.plot(x1_new, y_predict, 'r-', label="Prédictions") +donnees_ax.plot(x1_new, y_proba[:,1], 'b:', label="Probabilité - Scikit-Learn") +donnees_ax.plot(x1_new, y_predict, 'y-', label="Prédictions - Scikit-Learn") +donnees_ax.set_xlabel(r'$x_1$'+" - Largeur de pétale") +donnees_ax.set_ylabel(r'$y$'+" - Probabilité d'être Iris virginica") +donnees_ax.legend() +plt.show() + +# Performances +print ("Frontière de décision : "+str(round(frontiere_decision, 6))) +print ("Temps : "+str(time.time()-t_debut)) diff --git a/fondamentaux/README.md b/fondamentaux/README.md index 31366c7..7a335c7 100644 --- a/fondamentaux/README.md +++ b/fondamentaux/README.md @@ -20,5 +20,10 @@ ![capture d'écran](img/05-regression_polynomiale.png) +### Classificateur par régression logistique + +![capture d'écran](img/06-regression_logistique.png) + + diff --git a/fondamentaux/img/06-regression_logistique.png b/fondamentaux/img/06-regression_logistique.png new file mode 100644 index 0000000..feb0bc8 Binary files /dev/null and b/fondamentaux/img/06-regression_logistique.png differ