Master 2 MIMSE 2015-2016
Apprentissage automatique
TP2 : analyse discriminante et régression logistique
1 Données synthétiques
Récupérer les jeux de données synth_train.txt et synth_test.txt. On a Y∈ {1,2}et XR2.On
dispose de 100 données d’apprentissage et 200 données test.
1. Charger le jeu de données d’apprentissage dans R (soit avec la commande read.table, soit avec
l’outil d’importation de Rstudio : Tools > Import Dataset). Afficher les données d’apprentissage.
2. Représenter graphiquement les observations à l’aide de la fonction plot. On pourra colorier les
points en fonction de leur classe à l’aide du paramètre col et modifier le symbole avec le paramètre
pch (=point character) et rajouter une légende à l’aide de la fonction legend.
3. On s’intéresse d’abord au classifieur QDA (quadratic discriminant analysis)
(a) Constuire le classifieur QDA à partir des données d’apprentissage et de la fonction qda du
package MASS .
(b) Prédire les classes et les probabilités à posteriori des deux points de coordonnées (0,0) et (-2,2).
newdata <- data.frame(x1=c(0,-2),x2=c(0,2))
(c) Représenter graphiquement la frontière de décision : commencer par construire une grille de
points, prédire ces points, puis ajouter ces points sur le graphique en les coloriant en fonction
de leur prédiction.
(d) Charger le jeu de données test dans R. Prédire les données de l’ensemble test avec ce classifieur
et comparer avec les vraies classes. Calculer le taux d’erreur empirique (nombre de fausses
prédictions sur l’échantillon d’apprentissage divisé par taille de cet échantillon).
4. On s’intéresse maintenant au classifieur LDA (linear discriminant analysis).
(a) Reprendre les questions précédentes (contruction du classifieur, prédiction des deux points,
frontière de décision et taux d’erreur test) avec la fonction lda du package MASS.
(b) Dans le cas particulier de la classification binaire, on peut écrire que la probabilité à posteriori
P(Y= 2|X=x)est une fonction logistique d’un score linéaire :
P(Y= 2|X=x) = exp(α0+xTα)
1 + exp(α0+xTα)
et que ce score linéaire est une fonction logit de la probabilité à posteriori :
log P(Y= 2|X=x)
P(Y= 1|X=x)=α0+xTα.
Le score linéaire α0+xTαest le logarithme de l’odd ratio P(Y= 2|X=x)
P(Y= 1|X=x), aussi appelé log-
odds ou encore la probabilité à posteriori sur l’échelle logit.
Trouver l’expression de α0et αdans le cours (p. 40 des diapos du chapitre 2).
1
A quelle valeur se compare α0+xTαpour classer x?
Calculer les log-odds (probabilités à posteriori sur l’échelle logit) des deux points de coor-
données (0,0) et (-2,2).
5. On s’intéresse maintenant à la régression logistique qui fournit un fonction de classification binaire
et estime directement les probabilités à posteriori.
(a) Reprendre les questions précédentes (contruction du classifieur, prédiction des deux points,
frontière de décision et taux d’erreur test) avec la fonction glm et en vous aidant du code
suivant :
#regression logistique sur donnees d'apprentissage
?glm
g<- glm(as.factor(y)~x1+x2,data=train,family=binomial)
#proba a posteriori P(Y=2|X=x) pour x=(0,0),x=(-2,2)
predict(g, newdata, type="response")
## 1 2
## 9.999998e-01 1.061813e-06
#P(Y=2|X=(0,0))=0.99
#P(Y=2|X=(-2,2))=0.00000106
#fontieres de decision
prob_grille <- predict(g,data.frame(grille),type="response")
pred_grille <- 2*I(prob_grille>0.5)+1*I(prob_grille<=0.5)
(b) En régression logistique, on définit le modèle suivant :
P(Y= 2|X=x) = exp(β0+xTβ)
1 + exp(β0+xTβ)
et les paramètres β0et βsont estimés par maximum de vraisemblance sur les données d’appren-
tissage. On a donc comme en LDA un score linéaire qui est une fonction logit de la probabilité
à posteriori :
log P(Y= 2|X=x)
P(Y= 1|X=x)=β0+xTβ,
aussi appellé log-odds ou encore la probabilité à posteriori sur l’échelle logit.
Quelles sont les valeurs des paramètres β0et βestimés sur les données d’apprentissage ?
Quel test est utilisé pour tester la nullité de ces coefficients ?
Calculer le log-odd (probabilités à posteriori sur l’échelle logit) du points de coordonnées
(-2,2) de 3 manières différents.
6. Pour les trois méthodes considérées ici, un seuil a été fixé pour constuire les fonctions de classifi-
cation g. Ce seuil vaut 0.5si on regarde les probabilités à posteriori p=P(Y= 2|X=x)et 0si
on regarde les log-odds p
1p. On va faire varier ce seuil en LDA et regarder comment le taux de
bons classements varie.
(a) Faire varier le seuil de 0 à 1 par pas de 0.1 et représenter sur un graphique le taux de bons
classement en fonction du seuil.
(b) Recommencer mais en faisant varier cette fois le seuil des log-odds par pas de 0.1.
(c) Calculer les taux de vrais positis (T V P ) et de vrais négatifs (T V N) lorsque le seuil varie sur
l’échelle des log-odds par pas de 0.1. Ici positif = 2. Tracer ensuite la courbes ROC des points
(1 T V N(s); T V P (s)).
7. On peut retrouver ces graphiques avec le package ROCR et le code suivant :
library(ROCR) # 3 fonctions : prediction, performance, plot
#label.ordering pour le label de la classe negative puis positive
pred <- prediction(prob_test, Ytest,label.ordering=c("1","2"))
perf <- performance(pred, "acc")
plot(perf)
2
Cutoff
Accuracy
0.0 0.2 0.4 0.6 0.8 1.0
0.3 0.4 0.5 0.6 0.7 0.8 0.9
pred <- prediction(odds_test, Ytest,label.ordering=c("1","2"))
perf <- performance(pred, "acc")
plot(perf)
Cutoff
Accuracy
−10 −5 0 5 10
0.3 0.4 0.5 0.6 0.7 0.8 0.9
pred <- prediction(prob_test, Ytest,label.ordering=c("1","2"))
perf <- performance(pred, "tpr","fpr")
plot(perf,colorize=TRUE)#courbe ROC avec couleur selon les seuils
3
False positive rate
True positive rate
0.0 0.2 0.4 0.6 0.8 1.0
0.0 0.2 0.4 0.6 0.8 1.0
0 0.2 0.4 0.6 0.8 1.01
auc <- performance(pred, "auc")@y.values[[1]]
auc
## [1] 0.9893642
pred <- prediction(odds_test, Ytest,label.ordering=c("1","2"))
perf <- performance(pred, "tpr","fpr")
plot(perf,colorize=TRUE)#courbe ROC avec couleur selon les seuils
False positive rate
True positive rate
0.0 0.2 0.4 0.6 0.8 1.0
0.0 0.2 0.4 0.6 0.8 1.0
−9.56 −5.08 −0.61 3.87 8.35 12.83
8. On souhaite maintenant associer un coût 3 fois plus important aux faux positifs.
4
Le coût moyen est mesuré par la fonction average_cost.
average_cost <- function(Y_pred,Y_test)
{
FP =(Y_pred == "2")&(Y_test == "1")
FN =(Y_pred == "1")&(Y_test == "2")
return(sum(3*FP+1*FN)/length(Y_test))
}
Proposez un seuil pour le classifieur LDA qui minimise ce coût moyen sur les données d’apprentis-
sage. Calculer alors le T V P et le T V N sur les données tests.
g<- lda(y~x1+x2,data=train)
prob_test <- predict(g,Xtest)$posterior[,2]
odds_test <- log(prob_test/(1-prob_test))
s<- seq(min(odds_test),max(odds_test),by=0.1)
cout_moy <- rep(NA,length(s))
for (i in 1:length(s))
{
pred_test <- 2*I(odds_test>s[i])+1*I(odds_test<=s[i])
cout_moy[i] <- average_cost(pred_test,Ytest)
}
plot(s,cout_moy,type="l",col=2,xlab="seuil",
ylab="Cout moyen",main="Seuil sur les log-odds")
−10 −5 0 5 10
0.2 0.4 0.6 0.8
Seuil sur les log−odds
seuil
Cout moyen
#seuil optimal
s[which.min(cout_moy)]
## [1] 2.04147
s<- seq(0,1,by=0.01)
cout_moy <- rep(NA,length(s))
for (i in 1:length(s))
{
pred_test <- 2*I(prob_test>s[i])+1*I(prob_test<=s[i])
cout_moy[i] <- average_cost(pred_test,Ytest)
}
5
1 / 11 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !