• 10 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 31/05/2019

TP - Entraînez une régression logistique et une SVM linéaire

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans ce chapitre, nous allons comparer les performances des deux modèles de classification binaire étudiés précédemment : la régression logistique et le SVM Linéaire. 

Chargeons le jeu de données

C'est encore un jeu de données assez utilisé comme exemple, qui contient des entrées correspondants à des caractéristiques de champignons (surface, couleur, etc), ainsi qu'un indicateur 'class' de comestibilité ('p' pour poisonous, 'e' pour edible).

import pandas as pd
raw_data = pd.read_csv('mushrooms.csv')

Première chose, encoder nos données en données chiffres plutôt que des lettres

from sklearn.preprocessing import LabelEncoder
labelencoder=LabelEncoder()
for col in raw_data.columns:
    raw_data[col] = labelencoder.fit_transform(raw_data[col])
 data.head()

 
On sépare notre jeu de donnée de manière classique entre données d'entraînement et données de test.  

from sklearn.model_selection import train_test_split

# On récupère les features d'un côté...
X = raw_data.iloc[:,1:23]

# et les labels de l'autre
y = raw_data.iloc[:,0] 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

 Maintenant qu'on a préparé notre jeu de données, on peut tester les modèles de classification !

Appliquez la régression logistique

Pour rappel, la régression logistique peut avoir un paramètre de régularisation de la même manière que la régression linéaire, de norme 1 ou 2.

Observons dans un premier temps la performance de la régression logistique classique 

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc

lr = LogisticRegression()

lr.fit(X_train,y_train)

# On récupère la prédiction de la valeur positive
y_prob = lr.predict_proba(X_test)[:,1] 

# On créé un vecteur de prédiction à partir du vecteur de probabilités
y_pred = np.where(y_prob > 0.5, 1, 0) 

false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(false_positive_rate, true_positive_rate)
print roc_auc

La sortie donne un aire sous la courbe de 0.982 (pas forcément exactement la même pour vous). Ce qui est déjà correct.

On peut afficher cette courbe

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
plt.title('Receiver Operating Characteristic')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()

On peut maintenant essayer de tuner cette régression logistique en testant plusieurs paramètres, à l'aide de la fonctionGridSearchCV qui effectue aussi en passant une validation croisée.

from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV

lr = LogisticRegression()
params = {'C': np.logspace(-3, 3, 7) , 'penalty':['l1','l2'] }

lr_gs = GridSearchCV(lr, params, cv=10)
lr_gs.fit(X_train, y_train)

print(lr_gs.best_params_)
{'penalty': 'l2', 'C': 1000.0}

Comme pour la régression linéaire, la différences entre un paramètre de régularisation de norme 1 ou 2 est que celui de norme 1 effectue en même temps une sélection des variables (parmi celles qui sont corrélées) en mettant leur poids à zéro.

On peut évaluer notre modèle de la même manière que pour la régression logistique classique, avec une AUC : 

# On récupère la prédiction de la valeur positive
y_prob = lr.predict_proba(X_test)[:,1] 

# On créé un vecteur de prédiction à partir du vecteur de probabilités
y_pred = np.where(y_prob > 0.5, 1, 0) 

false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(false_positive_rate, true_positive_rate)
print roc_auc
0.9824

 On est déjà sur une classification très efficace

Appliquez une SVM Linéaire 

On peut maintenant tester les performance du SVM Linéaire. 

from sklearn.svm import LinearSVC
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_curve, auc

svm = LinearSVC()

params = { 'C': np.logspace(-3, 3, 7) }

gs_svm = GridSearchCV(lr, params, cv=10)
gs_svm.fit(X_train, y_train)

print(gs_svm.best_params_)

On peut maintenant passer à l'évaluation

from sklearn.metrics import roc_curve, auc
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(false_positive_rate, true_positive_rate)
print roc_auc

Le SVM Linéaire possède des performances similaires à la régression logistique. Comme on le verra dans un autre cours, son intérêt réside surtout dans l'usage de kernels qui permet de passer dans des espaces non-linéaires à l'aide de la forme duale. 

Conclusion 

Les données sont relativement simples à 

Exemple de certificat de réussite
Exemple de certificat de réussite