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.