- Population
- taux de chômage
- Etudiants
- CSP
- etc...
On va tester deux méthodes ici :
- L'analyse discriminante
- La régression logistique multinomiale
# Etape 1 : Réduction de la dimension par une ACP pour diminuer le nombre de variables
# Etape 2 : CAH sur les facteurs de l'ACP --> Définition des classes
# Etape 3: Analyse discriminante pour trouver les règles d'affectation aux classes
# Etape 4: Reg. log. pour trouver les mêmes règles d'affectation
# Etape 5: Comparaison des résultats des méthodes sur un échantillon test et mesure du taux de mal classés
1. Réduction de la dimension
# Etape 1 : Réduction de la dimension
require(ade4)
Vm.acp <-dudi.pca(df=Vm,center=TRUE,scale=TRUE,scan=FALSE)
# Eboulis des valeurs propres
screeplot(Vm.acp,type ="l", main = 'choix du nombre d axes')
nbaxes =3;
Vm.acp <-dudi.pca(df=Vm,center=T,scale=T,nf=nbaxes,scannf=FALSE)
s.corcircle(Vm.acp$co,xax=1,yax=3,clabel=0.7,sub="C. de corr des variables",possub="topright")
summary(Vm.acp)
New.vm<-Vm.acp$li
2. CAH sur les facteurs de l'ACP
# CAH sur les facteurs de l'ACP
preclus<-dist(New.vm)**2 # La CAH op?re sur les distances
cah.vm<-hclust(d=preclus,method="ward")
# Visualisation de la CAH
par(mfrow=c(1,1))
nbclasses.fi =3
groups<-cutree(cah.vm,k=nbclasses.fi)
plot(cah.vm)
rect.hclust(cah.vm,k=nbclasses.fi,border="blue")
Les résultats de la classif
# Rattachement des groupes pour chacun des iris > discrim.vm<-cbind(Vm,cluster=as.factor(groups)) > table(discrim.vm$cluster) 1 2 3 180 483 250
3. Analyse discriminante pour affectation dans les classes
> index <- sample(nrow(discrim.vm), nrow(discrim.vm)*.70)
> #Echantillon d'apprentissage
> appren <- discrim.vm[index, ]
> #Echantillon de test
> test <- discrim.vm[-index, ]
> vm.disc= f.lda(appren[,-29],groups=appren$cluster)
> # Matrice de confusion
> pred.vm <-predict(vm.disc,newdata=test)
> # Taux d'erreur
> Tx_err <- function(y,ypred){
+ mc <- table(y,ypred)
+ error <- 100*(mc[1,2]+mc[2,1])/sum(mc)
+ print(mc)
+ print(paste(round(error,2),"%",sep =""))
+ }
> Tx_err(test$cluster,pred.vm$class)
ypred
y 1 2 3
1 47 4 1
2 3 142 2
3 0 11 64
[1] "2.55%"
Une erreur de prévision de 2% avec une analyse discriminante
4. Avec une régression logistique multinomiale
# Avec une régression logistique multinomiale:
> # Avec une régression logistique multinomiale:
> library(nnet)
> logi=multinom(cluster~., data = appren)
# weights: 90 (58 variable)
initial value 702.013252
iter 10 value 113.648468
iter 20 value 75.506364
iter 30 value 69.704088
iter 40 value 65.256664
iter 50 value 62.358589
iter 60 value 61.152375
iter 70 value 60.246843
iter 80 value 59.528363
iter 90 value 58.957304
iter 100 value 58.452446
final value 58.452446
stopped after 100 iterations
> pp = predict(logi,newdata=test)
> Tx_err(test$cluster,pp)
ypred
y 1 2 3
1 51 0 1
2 1 140 6
3 1 12 62
[1] "0.36%"
Verdict : La reg. log. fait beaucoup mieux que l'analyse discriminante.
Certains auteurs avaient déjà commencé à traiter la question. Ils voyaient l'analyse discriminante linéaire comme un cas particulier de la régression logistique (ce avec quoi je ne suis pas totalement d'accord, car aucune de ces deux méthodes ne s'affranchit de l'hypothèse forte de normalité et utilise les moments d'ordre deux à chaque fois)
Quelques conclusions néanmoins intéressantes :
1. Lorsque le nombre de paramètre à estimer est important, le temps que met une reg log peut être 1,5 fois plus important que l'ADL du fait de l'algo itératif
2. La rég. log. peut être plus précise sur de petits échantillons, car du fait des modalités de référence, le nombre de paramètres à estimer est plus faible que si l'on utilise une ADL
GT
No comments:
Post a Comment