Bonjour à tous,

Toujours sur mes analyses discriminantes.

Je trouve des résultats contradictoires sur le jeu de données bien connu de tous Iris. Je cherche à faire une boucle qui prend toutes les combinaisons de traits pour déterminer l'erreur minimale de la lda. Voici donc mon script :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
test_data=iris
 
elmt = colnames(test_data[,-5])
nbelmt = length(elmt)
combelmt = lapply(seq(1:nbelmt),function(index) combinations(nbelmt,index,elmt))
 
## jeu d'entrainement
summary(test_data$Species)
data.strata<-strata(test_data,stratanames=c("Species"),size=c(9,4,2),method="srswor")
levels(test_data$Species)
names(data.strata)
data.training<-test_data[rownames(test_data) %in% data.strata$ID_unit,]
data.test<-test_data[!rownames(test_data) %in% data.strata$ID_unit,]
nrow(data.test)
 
## modèle 
liste=list()
for(i in 1:nbelmt){
  res_error=vector(length=250)
  for(j in 1:((dim(combelmt[[i]])[1]))){
    print(paste("get('",combelmt[[i]][j,],"')",collapse="+",sep=""))
    fit.1<-lda(Species~eval(parse(text=paste("get('",combelmt[[i]][j,],"')",collapse="+",sep=""))), data= data.training)
    pred<-predict(fit.1,data.test)$class
    confusion(pred,data.test$Species)
    print(attributes(confusion(pred,data.test$Species))$error)
    res_error[j]=attributes(confusion(pred,data.test$Species))$error
 
  }
  liste[[i]]=res_error
}
Jusque-là tout marche bien. Regardons alors les résultats :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[1] "get('Petal.Length')"
[1] 0.04444444
[1] "get('Petal.Width')"
[1] 0.02962963
[1] "get('Sepal.Length')"
[1] 0.5259259
[1] "get('Sepal.Width')"
[1] 0.4666667
[1] "get('Petal.Length')+get('Petal.Width')"
[1] 0.03703704
[1] "get('Petal.Length')+get('Sepal.Length')"
[1] 0.1333333
[1] "get('Petal.Length')+get('Sepal.Width')"
[1] 0.1555556
[1] "get('Petal.Width')+get('Sepal.Length')"
[1] 0.1777778
[1] "get('Petal.Width')+get('Sepal.Width')"
[1] 0.6962963
[1] "get('Sepal.Length')+get('Sepal.Width')"
[1] 0.6962963
[1] "get('Petal.Length')+get('Petal.Width')+get('Sepal.Length')"
[1] 0.0962963
[1] "get('Petal.Length')+get('Petal.Width')+get('Sepal.Width')"
[1] 0.06666667
[1] "get('Petal.Length')+get('Sepal.Length')+get('Sepal.Width')"
[1] 0.2740741
[1] "get('Petal.Width')+get('Sepal.Length')+get('Sepal.Width')"
[1] 0.5777778
[1] "get('Petal.Length')+get('Petal.Width')+get('Sepal.Length')+get('Sepal.Width')"
[1] 0.1481481
Donc pour vérifier mes résultats, je fais :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
fit.1<-lda(Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, data= data.training)
>     pred<-predict(fit.1,data.test)$class
>     confusion(pred,data.test$Species)
            true
predicted    setosa versicolor virginica
  setosa         41          0         0
  versicolor      0         42         2
  virginica       0          4        46
attr(,"error")
[1] 0.04444444
>     print(attributes(confusion(pred,data.test$Species))$error)
[1] 0.04444444
or jusqu' présent 0.14 différent 0.04

Je ne vois pas où est mon erreur ??
Avez vous une idée ?

Merci d'avance,
Charlotte