Régressions logistiques et classifieur bayésien naïf

en langage python

L'essentiel de cette page

La régression logistique et les classifieurs bayésiens sont des pratiques du machine learning qui aboutissent à des résultats relativement similaires pour une approche basées sur un même raisonnement : définir pour chaque variable une valeur seuil qui nous laisserait plutôt basculer vers la probabilité d'avoir la catégorie 0 ou 1 selon qu'on soit au-dessus ou en au-dessous. Si on a un énorme suffisant de variables, l'ensemble cumulé des probas de chaque variable doit nous permettre de déterminer si l'on a affaire à la catégorie 0 ou la catégorie 1.

0- Prenons un jeu de données à deux catégories

Dans le jeu d'iris, on ne gardera que les catégories versicolor et virginica (valeurs 51 à 150).

import seaborn as sns

iris = sns.load_dataset("iris")

X = iris.iloc[50:,:4]

print(iris.columns.values)

y = iris.species[50:]

1- Régression logistique

1.1- Approche simple

Mise en place du modèle de régression logitique :

from sklearn.linear_model import LogisticRegression

myreg = LogisticRegression(random_state=0)

myreg = myreg.fit(X, y)

Résultats et prédiction

myreg.predict(X.iloc[:20, :]) # Prédiction sur les 20 premières valeurs

myreg.predict_proba(X.iloc[:20, :]) # Probabilité associées aux prédictions qui montrent si on avait une bonne solidité dans la prédiction (1 pour une catégorie, 0 pour l'autre) ou mauvaise (proche de 50%/50%)

myreg.score(X,y) # Score de prédiction sur l'ensemble des données

Remarque importante : on peut aussi mettre des variables de type catégories parmi X, mais attention, les catégories ne peuvent être au formatr str (genre "grand" et "petit") mais au format numérique (0 et 1).

1.2- Validation par bootstrap

Le score (ci-dessus) de la régression est biaisé car établi en réalisant une prédiction avec les même données que celles qui ont permis l'apprentissage. Il est pertinent ainsi de calculer un intervalle de confiance de ce score par bootstrap.

Le principe est de tiré au sort à chaque itération des individus qui serviront à faire le modèle (tirage avec remise) tandis que les autres servent à le tester.

import numpy as np

scores = []

for i in range(500): # 500 itérations

ind_training = np.random.choice(range(len(y)), size=len(y), replace=True)

ind_training_set = set(ind_training)

ind_global = set(range(len(y)))

ind_test_set = ind_global-ind_training_set

ind_test = [i for i in ind_test_set]

if len(ind_test)>0 :

myreg = LogisticRegression()

myreg = myreg.fit(X.iloc[ind_training,:],y.iloc[ind_training])

scores = scores + [myreg.score(X.iloc[ind_test,:],y.iloc[ind_test])]


import matplotlib.pyplot as plt

plt.hist(scores,color="red",edgecolor='black')

On voit ici que tous les scores fluctuent entre 82% et 100% : bonne capacité de prédiction du modèle donc !

np.quantile(scores,[0.05])

Le quantile 5% montre ainsi une capacité inférieure de prédiction à 88,8% avec une confiance de 95%.

np.quantile(scores,[0.05])

2- Classifieur bayésien

Le classifieur bayésien va découper en raisonnant sur les probabilité. Il ne fera donc pas de régression comme la régression logistique. En général, le score obtenu reste proche, ici de 94%.

Il mériterait lui-aussi d'être bootstrapé.

from sklearn.naive_bayes import GaussianNB

classifieur = GaussianNB()

classifieur = classifieur.fit(X,y)

ypred = classifieur.predict(X)

print(ypred)

classifieur.score(X,y)

A tester, en projet : en théorie, le classifieur bayésien peut prédire plusieurs catégories et accepte aussi les variables X catégorielles. A tester donc pour voir si cette version sklearn l'accepte.