Créaction d'une classe complète¶
L'objectif ici est d'illustrer les avantages de la programmation orientée objet sur l'exemple de la régression logistique.
Nous allons faire appel à numpy pour le calcul matricielle et créer une classe LogisticRegression. Fixons l'architecture de notre classe comme suit
In [12]:
import numpy as np
class LogisticRegression:
def __init__(self, learning_rate=0.01, num_iter=100, fit_intercept=True, verbose=False): ## constructeur
self.learning_rate = learning_rate # le pas de la descente du gradient
self.num_iter = num_iter # nombre iterations de la descente du gradient
self.fit_intercept = fit_intercept # boolean qui indique si on ajoute la colonne de 1 aux variables explicatives
self.verbose = verbose # affichage ou pas de la perte durant l'entrainement
def _add_intercept(self, X): ## ajouter une colonne de 1 a X.
pass
def _logit(self, z): ## calcul de 1/(1+e^(-z)) pour tout un vecteur z
'''
ecrire une description de la fonction ici
'''
pass
def _loss(self, g, y): ## calcul de la perte à partir de la fonction g evaluee sur X et y
'''
ecrire une description de la fonction ici
'''
pass
def train(self, X, y): ## fonction entrainement
'''
ecrire une description de la fonction ici
'''
# 1. tester si on doit ajouter ou pas la colonner de 1 (si oui appeler la methode _add_intercept(X))
# 2. initialiser weights (les coefficients de regression) a 0
# 3 boucle for sur iterations
# 3.1 calculer le vecteur z des produits scalaires <beta, x> sur toutes les lignes de x, utiliser np.dot
# 3.2 calculer le vecteur g correspondant a la fonction logit appliquee a z
# 3.3 calculer le gradient
# 3.4 mettre a jour les coefficients de regression via une descente du gradient
# 3.5 affichage : si verbose est oui et chaque 100 iteration : afficher la perte
pass
def predict_prob(self, X): ## calcul des probabilites predites pour un jeu de donnees test
# Attention tester s'il faut ajouter une colonne de 1
# retourner les logit calcules
pass
def predict(self, X, threshold): ## prediction de la classe 0 ou 1
# tester si les proba predites depassent le seuil threshold ou pas
pass
Test sur un jeu de données réel¶
In [ ]:
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_breast_cancer
help(load_breast_cancer)
In [14]:
X, y = load_breast_cancer(return_X_y=True) # load the dataset
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 42) # split the dataset
X_train_scaled = (X_train - np.average(X_train, 0))/np.std(X_train)
X_test_scaled = (X_test - np.average(X_test, 0))/np.std(X_test)
- Créer un objet LogisticRegression avec learning_rate = 0.01, num_iter = 10000 et verbose = True.
- Estimation des paramètres sur le jeu de données X_train_scaled et y_train.
- Calculer le taux de bon classement du jeu de données test X_test_scaled et y_test.