Fondamentaux : régression logistique

This commit is contained in:
Philippe Roy 2023-06-20 12:07:47 +02:00
parent b296152628
commit 9fe561e5e3
4 changed files with 97 additions and 1 deletions

View File

@ -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")

View File

@ -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 <philippe.roy@ac-grenoble.fr>
# @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))

View File

@ -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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB