Validation Croisée, besoin d'aide

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

GC [Compte désactivé]

Validation Croisée, besoin d'aide

Messagepar GC [Compte désactivé] » 23 Avr 2010, 06:55

Bonjour
On utilisera le jeu de données Airquality, et plus précisément les colonnes Ozone et Temp.
Le principe consiste à estimer le modèle ( ici un modèle linéaire) sur une partie de
l'échantillon (dit échantillon d'apprentissage), puis à calculer l'erreur commise sur une autre
partie de l'échantillon( dit échantillon de validation), qui n'a pas participé à l'estimation des
paramètres du modèle.
Différentes façons de constituer les échantillons d'apprentissage et de validation peuvent être
considérées. La méthode envisagée ici consiste à découper l'échantillon de départ en k=10
sous échantillons. Un échantillon, obtenu par réunion de 9 parties sur les dix, sera utilisé pour
estimer le modèle, et on calculera l'erreur commise par ce modèle sur la dixième partie qui
constituera l' échantillon de validation Ei. On calculera alors l'erreur du modèle comme étant
la moyenne quadratique des erreurs commises par le modèle sur chaque valeur de
l'échantillon.
On demande de calculer cette erreur Ei, puis d'itérer ce processus de façon à ce que chacune
des 10 parties de l'échantillon de départ soit utilisée une fois comme échantillon de validation.
On obtient ainsi dix calculs d'erreurs (Ei, i variant de 1 à 10). On donnera la valeur de Q
moyenne des dix Ei.
Commenter.

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 23 Avr 2010, 08:28

L'idée est de construire un modèle et de le tester (valider) sur un jeu de données différent en générant des prédictions. Voir par exemple:
http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2675184/ ou http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.142.9951&rep=rep1&type=pdf

Aurélien

GC [Compte désactivé]

Messagepar GC [Compte désactivé] » 23 Avr 2010, 08:30

Merci de votre réponse
j'ai un peu avancé dans mon travail, mais je butte sur un truc tout bete
en effet, je dois donc découper mon tableau de 2 colonnes en 10 échantillons
c'est donc un data frame, et je ne vois pas du tout comment faire pour le découper en 10 échantillons .
comment faire svp?
merci

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 23 Avr 2010, 08:54

Pour créer les identifiants (k) de tes échantillons, tu peux faire:

Code : Tout sélectionner

tab <- data.frame(id = 1:20,
                  var1 = runif(20, 0, 1))

n <- nrow(tab)

tab$k <- sample(rep(1:10, length=n))


Aurélien

GC [Compte désactivé]

Messagepar GC [Compte désactivé] » 29 Avr 2010, 22:07

merci!
pourrais tu m'expliquer stp ce que signifient les 2 premieres lignes de ton code, je comprend la 3 eme mais je comprend pas a quoi servent les 2 premieres (désolé je suis un vrai débutant)

GC [Compte désactivé]

Messagepar GC [Compte désactivé] » 29 Avr 2010, 22:39

Merci

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 30 Avr 2010, 12:41

pourrais tu m'expliquer stp ce que signifient les 2 premieres lignes de ton code

- data.frame créé un data.frame
- 1:20 génère une séquence allant de 1 à 20, équivalent à seq(1, 20, by = 1)
- runif(20, 0, 1) tire un échantillon de longueur 20 d'une distribution uniform entre 0 et 1.
Voir ?data.frame ?seq ?runif

C'était juste pour créer un exemple reproductible.

Pour ce qui est de la régression linéaire, voir ?lm. Par exemple:

Code : Tout sélectionner

# je créé un data frame avec y = 1.5 x + erreur
tab <- data.frame(x = 1:20, y = 1:20 * 1.5 + rnorm(20, 0, 5))

# modèle linéaire
modL <- lm(y ~ x, data=tab)
summary(modL)

# je trace y ~ x et ajoute la ligne de régression
plot(y ~ x, data=tab)
abline(modL)


En éspérant que ça t'aide. Voir aussi la documentation de base.
http://cran.r-project.org/doc/contrib/Paradis-rdebuts_fr.pdf

Aurélien

GC [Compte désactivé]

Messagepar GC [Compte désactivé] » 04 Mai 2010, 14:04

Edit: c'est bon j'ai trouvé!
merci

[/list]

GC [Compte désactivé]

Messagepar GC [Compte désactivé] » 06 Mai 2010, 14:50

Bonjour, je suis confronté a de nouveaux problemes (décidément :oops: )
voici ce que j'ai codé jusqu'a maintenant je sais, pour un initié c'est maigre

Code : Tout sélectionner

> library(cluster)
> data(airquality)
> attach(airquality)
> A=data.frame(Temp,Ozone) #création d’un data frame de 2 colonnes avec Temp et Ozone#
> B=na.omit(A)    #suppression des NA#
> dim(B)
[1] 116   2 #116 valeurs, impossible pour transformer en matrice#
> vec=c(1:6)
> C=B[-vec,] #on supprime 6 lignes du data frame B qu’on renomme en C#
> dim(C)
[1] 110   2 #on va pouvoir avoir une matrice de dimension 11x10 le 10 représentant les 10 échantillons#
> o=C$Ozone
> t=C$Temp
> L=lm(o~t)
> L

Call:
lm(formula = o ~ t)

Coefficients:
(Intercept)            t 
   -154.289        2.515  #on obtient les données de la droite des moindres carrés en effectuant une régression linéaire#
> a=c(2.515)
> b=c(-154.289)
> y=a*x+b #on définit la formule de la droite des moindres carrés #
> mat1=matrix(C$Ozone,11,10)
> mat1
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   19   11   39   40   79   39   65   76   23    24
 [2,]    8    1   23   77   63    9   22  118   21    16
 [3,]    7   11   21   97   16   16   59   84   24    13
 [4,]   16    4   37   97   80   78   23   85   44    23
 [5,]   11   32   20   85  108   35   31   96   21    36
 [6,]   14   23   12   10   20   66   44   78   28     7
 [7,]   18   45   13   27   52  122   21   73    9    14
 [8,]   14  115  135    7   82   89    9   91   13    30
 [9,]   34   37   49   48   50  110   45   47   46    14
[10,]    6   29   32   35   64   44  168   32   18    18
[11,]   30   71   64   61   59   28   73   20   13    20
> mat2=matrix(C$Temp,11,10)
> mat2
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   59   62   87   83   87   81   80   97   78    68
 [2,]   61   59   82   88   85   81   77   94   75    82
 [3,]   74   73   77   92   74   82   79   96   73    64
 [4,]   69   61   72   92   86   86   76   94   81    71
 [5,]   66   61   65   89   85   85   78   91   76    81
 [6,]   68   67   73   73   82   87   78   92   77    69
 [7,]   58   81   76   81   86   89   77   93   71    63
 [8,]   64   79   84   80   88   90   72   93   71    70
 [9,]   66   76   85   81   86   90   79   87   78    75
[10,]   57   82   81   82   83   86   81   84   67    76
[11,]   68   90   83   84   81   82   86   80   76    68
#on crée 2 matrices, une pour temp et une pour ozone, qui vont permettre de découper en 10 échantillons de 11  valeurs le data frame#


mon premier probleme est le suivant
il faut que j'estime la droite des moindres carrés, non pas avec toutes les valeurs mais avec 9/10 du total des valleurs (neufs echantillons quoi), seulement je ne vois pas comment faire pour n'avoir que 9/10 du tableau, en utilisant les matrices ou une fonction (le professeur ne veut pas que je le fasse "a la main"
ensuite, j'ai voulu essayer (avant de me rendre compte de mon erreur sur les 9 echantillons), de faire ceci:

Code : Tout sélectionner

y=a*x+b
avec
 a=c(2.515)
b=c(-154.289)

mat3=a*mat2+b
> mat3
         [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]  [,10]
 [1,]  -5.904  1.641 64.516 54.456 64.516 49.426 46.911 89.666 41.881 16.731
 [2,]  -0.874 -5.904 51.941 67.031 59.486 49.426 39.366 82.121 34.336 51.941
 [3,]  31.821 29.306 39.366 77.091 31.821 51.941 44.396 87.151 29.306  6.671
 [4,]  19.246 -0.874 26.791 77.091 62.001 62.001 36.851 82.121 49.426 24.276
 [5,]  11.701 -0.874  9.186 69.546 59.486 59.486 41.881 74.576 36.851 49.426
 [6,]  16.731 14.216 29.306 29.306 51.941 64.516 41.881 77.091 39.366 19.246
 [7,]  -8.419 49.426 36.851 49.426 62.001 69.546 39.366 79.606 24.276  4.156
 [8,]   6.671 44.396 56.971 46.911 67.031 72.061 26.791 79.606 24.276 21.761
 [9,]  11.701 36.851 59.486 49.426 62.001 72.061 44.396 64.516 41.881 34.336
[10,] -10.934 51.941 49.426 51.941 54.456 62.001 49.426 56.971 14.216 36.851
[11,]  16.731 72.061 54.456 56.971 49.426 51.941 62.001 46.911 36.851 16.731



j'obtien quand meme une erreur trop grande, j'ai moi meme du faire une erreur.
pourriez vous m'éclairer svp?
merci d'avance

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 06 Mai 2010, 15:32

Pas sûr de comprendre ce que tu veux faire. Tu te compliques sans doute un peu la vie.

Code : Tout sélectionner

data(airquality)
AirQ <- na.omit(airquality[,c("Ozone", "Temp")])
nrow(AirQ)


En faisant ça on obtient directement B. Il est préférable d'utiliser <- pour l'affectation. '=' s'utilise en général à l'intérieur des fonctions. attach est à utiliser avec précaution. Il ne faut pas oublier de 'détacher', sous peine de mauvaise surprises.

Je ne comprends pas pourquoi tu supprimes 6 lignes. Est-ce que tu as besoin d'avoir exactement le même nombre d'observations dans chaque jeu de données? Je privilégierais une autre approche. Tu pourrais par exemple affecter chaque observation à un jeu de donnée comme indiqué plus haut.

Code : Tout sélectionner

AirQ$k <- sample(1:10, nrow(AirQ), replace = TRUE)
table(AirQ$k)


Ensuite tu utilise lm:

Code : Tout sélectionner

modl <- lm(Ozone ~ Temp, data = AirQ, ...


Dans l'aide lm, tu vas trouver une option te permettant de choisir les k que tu veux inclure et ainsi avoir en gros 9/10 des données.

Plutôt que d'entrer les coefficients à la main utilise:

Code : Tout sélectionner

coef(modl)


Il existe aussi une fonction ?predict qui va t'aider.

Aurélien

GC [Compte désactivé]

Messagepar GC [Compte désactivé] » 06 Mai 2010, 15:52

Merci beaucoup Aurélien , tu m'es d'une grande aide
je suis passé par les matrices car on m'a conseillé de faire ca, mais j'avoue que je trouve pas ca tres pratique car il faut 2 matrices en fin de compte
merci en tout cas je vais suivre tes conseils et essayer d'arriver au bout!

GC [Compte désactivé]

Messagepar GC [Compte désactivé] » 06 Mai 2010, 20:48

pour en revenir a l'histoire du sample, je sais pas s'il faudrait pas plutot le faire sans remise le tirage non?
pétard ca commence a me rendre fou cette validation croisée, je pédale dans la semoule


Code : Tout sélectionner

> L

Call:
lm(formula = Airq$Ozone ~ Airq$Temp, data = Airq, subset = 1:9)

Coefficients:
(Intercept)    Airq$Temp 
   17.89418      0.05159 > newdata=subset(Airq,k=="10")
> predict(L,newdata)
       1        2        3        4        5        6        7        8        9       10
21.35053 21.60847 21.71164 21.09259 21.29894 21.24735 20.93783 21.04101 21.71164 21.45370
      11       12       13       14       15       16       17       18       19       20
21.29894 21.40212 20.88624 21.19577 21.29894 20.83466 21.40212 21.09259 20.93783 21.66005
      21       22       23       24       25       26       27       28       29       30
21.04101 21.04101 21.35053 22.07275 21.96958 21.81481 22.12434 22.53704 22.38228 22.12434
      31       32       33       34       35       36       37       38       39       40
21.86640 21.60847 21.24735 21.66005 21.81481 22.22751 22.27910 22.07275 22.17593 22.17593
      41       42       43       44       45       46       47       48       49       50
22.43386 22.64021 22.64021 22.48545 21.66005 22.07275 22.02116 22.07275 22.12434 22.22751
      51       52       53       54       55       56       57       58       59       60
22.38228 22.27910 21.71164 22.33069 22.27910 22.12434 22.33069 22.43386 22.33069 22.17593
      61       62       63       64       65       66       67       68       69       70
22.07275 22.07275 22.07275 22.12434 22.33069 22.27910 22.38228 22.48545 22.53704 22.53704
      71       72       73       74       75       76       77       78       79       80
22.33069 22.12434 22.02116 21.86640 21.96958 21.81481 21.91799 21.91799 21.86640 21.60847
      81       82       83       84       85       86       87       88       89       90
21.96958 22.07275 22.33069 22.89815 22.74339 22.84656 22.74339 22.58862 22.64021 22.69180
      91       92       93       94       95       96       97       98       99      100
22.69180 22.38228 22.22751 22.02116 21.91799 21.76323 21.66005 22.07275 21.81481 21.86640
     101      102      103      104      105      106      107      108      109      110
21.55688 21.55688 21.91799 21.35053 21.81481 21.40212 22.12434 21.19577 21.55688 22.07275
     111      112      113      114      115      116
21.45370 21.14418 21.50529 21.76323 21.81481 21.40212
Message d'avis :
'newdata' avait 13 lignes mais les variables trouvées ont 116 lignes


:cry: :cry: :cry:

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 07 Mai 2010, 10:40

pour en revenir a l'histoire du sample, je sais pas s'il faudrait pas plutot le faire sans remise le tirage non?


Pourquoi? C'est du vecteur 1:10 que tu tires ton échantillon. Tu auras toutes les lignes et pas la même ligne 2 fois. Il y a une différence entre:

Code : Tout sélectionner

AirQ$k <- sample(rep(1:10, length=nrow(AirQ)))
et

Code : Tout sélectionner

AirQ$k <- sample(1:10, nrow(AirQ), replace = TRUE)

La première solution me semble plus adaptée car elle produit un nombre d'observations par catégorie plus homogène, bien que l'assignement soit aléatoire.

A ta place, j'essaierais de prédire toutes tes données. Attention à la syntaxe. Si tu spécifies data = AirQ, il ne faut pas utiliser AirQ$. Regarde aussi la synyaxe pour subset. Regarde dans l'aide des fonctions ou sur le forum.

Code : Tout sélectionner

modl <- lm(Ozone ~ Temp, data = AirQ, subset = k %in% 1:9)

AirQ$pred <- predict(modl, newdata=AirQ)

xmax <- max(AirQ$Ozone)

plot(pred ~ Ozone, data=AirQ, subset = k < 10,
      col = "blue", pch = 20,
      xlim = c(0, xmax), ylim=c(0, xmax))
par(new=TRUE)
plot(pred ~ Ozone, data=AirQ, subset = k == 10,
      col = "red", pch = 20,
      xlim = c(0, xmax), ylim=c(0, xmax))


Regarde du côté de tes résidus. Il y sans doute des améliorations à apporter à ton modèle.

Bon courage,

Aurélien

GC [Compte désactivé]

Messagepar GC [Compte désactivé] » 07 Mai 2010, 11:14

merci, je crois que j'ai bien compris cette fois, j'ai reussi a calculer mon erreur et mon résidu; il n'y a plus q'a mettre en valeur les échantillons et faire les moyennes.
tu m'as vraiment beaucoup aidé; je ne peux que te remercier!

Aurélien Madouasse
Messages : 352
Enregistré le : 26 Fév 2007, 11:23

Messagepar Aurélien Madouasse » 07 Mai 2010, 11:42

il n'y a plus q'a mettre en valeur les échantillons et faire les moyennes.


Pas sûr! Dans régression linéaire, il y a 'linéaire' et aussi un certain nombre de postulats quant à la distribution des résidus.

Code : Tout sélectionner

plot(Ozone ~ Temp, data=AirQ)
abline(lm(Ozone ~ Temp, data = AirQ))


Aurélien


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron