Skip to content

Commit c18cc90

Browse files
committed
C02La_cv revised for 2023-2024
1 parent e950214 commit c18cc90

File tree

3 files changed

+37
-36
lines changed

3 files changed

+37
-36
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Package: BioDataScience3
2-
Version: 2023.1.1
2+
Version: 2023.2.0
33
Title: A Series of Learnr Documents for Biological Data Science 3
44
Description: Interactive documents using learnr for studying biological data science (second course).
55
Authors@R: c(

NEWS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# BioDataScience3 2023.2.0
2+
3+
- Revision of **C02La_cv**.
4+
15
# BioDataScience3 2023.1.1
26

37
- Correction in **C00La_refresh** relative to the interpretation of the ACP.

inst/tutorials/C02La_cv/C02La_cv.Rmd.inactive renamed to inst/tutorials/C02La_cv/C02La_cv.Rmd

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,18 @@ runtime: shiny_prerendered
1616
BioDataScience3::learnr_setup()
1717
SciViews::R("explore", "ml", lang = "fr")
1818
19-
# Import dataset ----
19+
# Import dataset
2020
rice <- read("rice", package = "BioDataScience3", lang = "fr")
21-
# générateur de nombre pseudo aléatoire
21+
# Training and test set
2222
set.seed(8888)
23-
# Training and test set ----
2423
rice_split <- rsample::initial_split(rice, 0.8, strata = class)
2524
rice_train <- rsample::training(rice_split)
2625
rice_test <- rsample::testing(rice_split)
27-
# mlda
26+
# mlLda
2827
rice_lda <- mlLda(data = rice_train, class ~ .)
2928
rice_conf <- confusion(predict(rice_lda, rice_test), rice_test$class)
3029
rice_tab <- summary(rice_conf)
31-
# mlda avec cv 10 fois
30+
# mlda with 10-fold CV
3231
rice_lda_cv <- mlLda(data = rice, class ~ .)
3332
rice_conf_cv <- confusion(cvpredict(rice_lda_cv, cv.k = 10), rice$class)
3433
rice_tab_cv <- summary(rice_conf_cv)
@@ -46,32 +45,34 @@ BioDataScience3::learnr_server(input, output, session)
4645

4746
## Objectifs
4847

49-
Lors de la création d'un classifieur, on va définir un set d'apprentissage et un set de test. Il est évident qu'il ne faut jamais employer les mêmes individus en apprentissage et en test. Cela aurait pour conséquence de surévaluer la capacité d'un classifieur à reconnaître les niveaux de la variable facteur d'intérêt.
48+
Lors de la création d'un classifieur, nous allons définir un set d'apprentissage et un set de test. Il ne faut jamais employer les mêmes individus en apprentissage et en test. Cela aurait pour conséquence de surévaluer la capacité d'un classifieur à reconnaître les niveaux de la variable facteur d'intérêt.
5049

51-
La validation croisée est une méthode particulière qui permet d'employer tous les objets, à la fois dans le set d'apprentissage et dans le set de test, mais jamais simultanément.
50+
La validation croisée est une méthode particulière qui permet d'utiliser tous les items, à la fois dans le set d'apprentissage et dans le set de test, mais jamais simultanément. Elle permet donc d'évaluer les performances d'un classifieur de manière non biaisée, tout en utilisant un maximum d'items à la fois en apprentissage et en test.
5251

5352
L'objectif de ce tutoriel est de comprendre la validation croisée et de l'appliquer en pratique dans le cas d'une analyse discriminante linéaire.
5453

5554
## Exploration des données
5655

57-
Les données employées dans cette séance d'exercice proviennent de l'article : ["Classification of Rice Varieties Using Artificial Intelligence Methods"](https://doi.org/10.18201/ijisae.2019355381). N'hésitez pas à consulter cet article pour en apprendre davantage sur ces données.
56+
Les données employées dans cette séance d'exercices proviennent de l'article ["Classification of Rice Varieties Using Artificial Intelligence Methods"](https://doi.org/10.18201/ijisae.2019355381). N'hésitez pas à consulter cet article pour en apprendre davantage sur les données.
5857

5958
```{r, echo=TRUE}
6059
rice <- read("rice", package = "BioDataScience3")
6160
```
6261

63-
Le tableau `rice` a `r nrow(rice)` observations. Deux variétés de riz sont étudiées : `Cammeo` et `Osmancik`. Sur base d'analyse d'image, sept variables morphologiques sont extraites comme le périmètre, l'aire ou encore la longueur de l'axe majeur de l'ellipsoïde qui entoure la silhouette du grain de riz sur une image numérique.
62+
Le tableau `rice` a `r nrow(rice)` items. Deux variétés de riz sont étudiées : `Cammeo` et `Osmancik`. Sur base d'analyse d'image, sept variables morphométriques sont calculées sur base d'images numériques des grains de riz comme le périmètre, l'aire ou encore la longueur de l'axe majeur de l'ellipsoïde qui entoure la silhouette du grain de riz sur l'image.
6463

65-
Les résultats ci-dessous vous renseignent sur les variables.
64+
Les tableaux ci-dessous résument les variables de notre jeu de données.
6665

6766
```{r, echo = TRUE}
6867
skimr::skim(rice)
6968
```
7069

71-
Vous allez employer l'analyse discriminante linéaire afin d'entraîner vos classifieurs. Vous pouvez décrire vos données à l'aide de tableaux ou de graphiques. Vous pouvez aussi réaliser une ACP pour avoir une vue d'ensemble sur les données avant de vous lancer dans la classification. Voici ce que cela donne :
70+
Nous avons une variable qualitative `class` à deux niveaux avec des effectifs relativement bien balancés entre les deux classes. Nous avons aussi sept variables numériques qui peuvent servir d'attributs dans une classification supervisée. Il n'y a aucune donnée manquante.
71+
72+
Vous utiliserez l'analyse discriminante linéaire pour entraîner vos classifieurs. Vous pouvez décrire vos données à l'aide de tableaux ou de graphiques supplémentaires. Vous pouvez aussi réaliser une ACP pour avoir une vue d'ensemble sur les données avant de vous lancer dans la classification ADL. Voici ce que cela donne :
7273

7374
```{r, echo=TRUE}
74-
rice_pca <- pca(data = sselect(rice, -class), ~., scale = TRUE)
75+
rice_pca <- pca(data = sselect(rice, -class), ~ ., scale = TRUE)
7576
summary(rice_pca)
7677
```
7778

@@ -81,23 +82,23 @@ Le graphique des éboulis est présenté ci-dessous.
8182
chart$scree(rice_pca)
8283
```
8384

84-
Voici la représentation dans l'espace des variables pour le premier plan de l'ACP :
85+
Voici la représentation dans l'espace des variables dans le premier plan de l'ACP :
8586

8687
```{r, echo=TRUE}
8788
chart$loadings(rice_pca)
8889
```
8990

90-
... et la représentation dans l'espace des individuspour le premier plan de l'ACP :
91+
... et la représentation dans l'espace des individus, toujours dans le premier plan de l'ACP :
9192

9293
```{r, echo=TRUE}
9394
chart$scores(rice_pca, labels = rice$class)
9495
```
9596

96-
Analysez par vous-même les résultats de l'ACP et estimez si vous penser que l'ADL fonctionnera sur cette base. Ensuite, passez à la section suivante.
97+
Notez bien qu'au niveau de l'ACP, la séparation entre les deux variétés de riz n'apparaît que très partielle.
9798

98-
## Préparation du set d'apprentissage et de test
99+
## Préparation des sets d'apprentissage et de test
99100

100-
Utilisez les fonctions `initial_split()`, `training()` et `testing()` afin de définir votre set d'apprentissage et votre set de test. Votre set d'apprentissage se nommera `rice_train` et votre set de test se nommera `rice_test`. Il vous est demandé de réaliser un set d'entraînement contenant 80% des observations. Cet échantillonnage doit être stratifié pour la variable `class`.
101+
Utilisez les fonctions `initial_split()`, `training()` et `testing()` pour définir votre set d'apprentissage et votre set de test. Votre set d'apprentissage se nommera `rice_train` et votre set de test se nommera `rice_test`. Il vous est demandé de réaliser un set d'apprentissage contenant 80% des observations. Cet échantillonnage doit être stratifié pour la variable `class`.
101102

102103
```{r rice_split_h2, exercise=TRUE}
103104
set.seed(8888) # Fixer le début du générateur de nombres pseudo-aléatoires
@@ -129,18 +130,14 @@ rice_test <- testing(rice_split)
129130
```
130131

131132
```{r rice_split_h2-check}
132-
grade_code("Vous avez réalisé votre set d'apprentissage et votre set de test avec les proportions demandées.", "Avez-vous bien respectée les consignes ? Il ne faut compléter que les champs signalés par ___.")
133+
grade_code("Vous avez réalisé votre set d'apprentissage et votre set de test avec les proportions demandées.", "Avez-vous bien respectée les consignes ? Il ne faut compléter que les champs ___.")
133134
```
134135

135-
## Création des classifieurs
136-
137-
### Analyse discriminante linéaire
138-
139-
Il vous est demandé de réaliser un classifieur utilisant l'analyse discriminante linéaire. C'est à vous de définir le tableau de données à employer entre `rice`, `rice_train` et `rice_test`.
136+
## Analyse discriminante linéaire
140137

141-
Entraînez un modèle de type analyse discriminant linéaire avec le set d'apprentissage (utilisez la formule condensée). Votre objectif est de prédire la variable `class` à l'aide des sept autres variables. Assignez le classifieur n'utilisant pas la validation croisée à `rice_lda` et assignez le classifieur utilisant la validation croisée à `rice_lda_cv`.
138+
Entraînez un premier classifieur `rice_lda` avec l'analyse discriminante linéaire (formule condensée) pour prédire `class` à l'aide des sept autres variables **sans utiliser la validation croisée** ensuite. Quel jeu de données devez-vous utiliser ? `rice`, `rice_train` ou `rice_test` ?
142139

143-
```{r lda_h2, exercise = TRUE}
140+
```{r lda_h2, exercise=TRUE}
144141
rice_lda <- mlLda(data = ___, ___ ~ ___)
145142
summary(rice_lda)
146143
```
@@ -159,10 +156,10 @@ summary(rice_lda)
159156
```
160157

161158
```{r lda_h2-check}
162-
grade_code("Votre classifieur LDA est entrainé. Il faut encore en mesurer les performances.", "Avez-vous bien proposé la formule écrite sous sa forme condensée ? ")
159+
grade_code("Votre classifieur LDA est entrainé. Il faut encore en mesurer les performances.", "Avez-vous bien écrit la formule sous sa forme condensée ? Avez-vous choisi le bon jeu de données ?")
163160
```
164161

165-
Calculez maintenant votre classifieur afin d'en étudier les performances à l'aide de la validation croisée (toujours en utilisant la formule condensée).
162+
Entraînez maintenant un second classifieur `rice_lda_cv`, mais cette fois dans le but d'en étudier les performances par validation croisée (toujours en utilisant la formule condensée).
166163

167164
```{r lda_cv_h2, exercise=TRUE}
168165
rice_lda_cv <- mlLda(data = ___, ___ ~ ___)
@@ -183,14 +180,14 @@ summary(rice_lda_cv)
183180
```
184181

185182
```{r lda_cv_h2-check}
186-
grade_code("Si vous souhaitez utiliser la validation croisée pour le test, vous pouvez entraîner votre modèle sur l'ensemble des données dans un premier temps avec {mlearning} que nous utilisons ici. Il faut bien sûr encore mesurer ses performances.", "Avez-vous bien écrit la formule sous sa forme condensée ?")
183+
grade_code("Si vous souhaitez utiliser la validation croisée pour le test, vous pouvez entraîner votre modèle sur l'ensemble des données dans un premier temps avec {mlearning} que nous utilisons ici. Il faut bien sûr encore étudier ses performances ensuite.", "Avez-vous bien écrit la formule sous sa forme condensée ?")
187184
```
188185

189186
## Évaluation des performances des classifieurs
190187

191188
Évaluez les performances du premier classifieur `rice_lda` sans validation croisée. Pour rappel, les jeux de données disponibles sont les suivants : `rice`, `rice_train` et `rice_test`
192189

193-
```{r pred_lda_h2, exercise = TRUE}
190+
```{r pred_lda_h2, exercise=TRUE}
194191
# prédiction
195192
rice_pred <- ___(___, ___)
196193
# matrice de confusion
@@ -222,7 +219,7 @@ grade_code("Vous venez de calculer les métriques de performances du premier cla
222219

223220
Évaluez les performances du second classifieur `rice_lda_cv`, cette fois-ci, à l'aide d'une validation croisée dix fois.
224221

225-
```{r lda_pred_cv_h2, exercise = TRUE}
222+
```{r lda_pred_cv_h2, exercise=TRUE}
226223
set.seed(76456)
227224
# prédiction
228225
rice_pred_cv <- ___(___, cv.k = ___)
@@ -252,7 +249,7 @@ summary(rice_conf_cv)
252249
```
253250

254251
```{r lda_pred_cv_h2-check}
255-
grade_code("Toute la mécanique de la validation croisée est \"déployée\" à l'intérieur de `cvpredict()`. En réalité, les données sont divisées en 10 sous-unités et 10 classifieurs différents sont entraînées et testés successivement. Aucun n'est identique à `rice_lda_cv`, mais ils en sont tous relativement proches. Prenez un peu de temps pour analyser votre matrice de confusion et les métriques qui en découlent. Combien de données sont utilisées ici ?")
252+
grade_code("Toute la mécanique de la validation croisée est déployée à l'intérieur de `cvpredict()`. En réalité, les données sont divisées en dix sous-tableaux et dix classifieurs différents sont entraînées et testés successivement. Aucun n'est identique à `rice_lda_cv`, mais ils en sont tous relativement proches. Prenez un peu de temps pour analyser votre matrice de confusion et les métriques qui en découlent. Combien de données sont utilisées ici ?")
256253
```
257254

258255
Répondez aux questions ci-dessous relatives aux deux classifieurs `rice_lda` et `rice_lda_cv`.
@@ -267,7 +264,7 @@ quiz(
267264
try_again_button = "Resoumettre une réponse",
268265
incorrect = "Mauvaise réponse. Recommencez afin de trouver la bonne réponse",
269266
correct = "C'est le nombre d'observations utilisées en apprentissage qui sont déterminantes ici (plus d'observations mènent potentiellement à un meilleur classifieur)."),
270-
question("Combien d'items sont employé afin de déterminer les performances du classifieur avec validation croisée ?",
267+
question("Combien d'items sont employé pour déterminer les performances du classifieur avec validation croisée ?",
271268
answer(sprintf("%1.f", nrow(rice)), correct = TRUE),
272269
answer(sprintf("%1.f", nrow(rice_train))),
273270
answer(sprintf("%1.f", nrow(rice_test))),
@@ -276,8 +273,8 @@ quiz(
276273
submit_button = "Soumettre une réponse",
277274
try_again_button = "Resoumettre une réponse",
278275
incorrect = "Mauvaise réponse. Recommencez afin de trouver la bonne réponse",
279-
correct = "On utilise effectivement l'ensemble des données disponibles."),
280-
question("Quel est le taux de vrai positif pour la classe `Osmancik` avec le classifieurs `rice_lda_cv` ?",
276+
correct = "L'ensemble des données disponibles est en effet utilisé pour le test en validation croisée."),
277+
question("Quel est le taux de vrais positifs pour la classe `Osmancik` avec le classifieurs `rice_lda_cv` ?",
281278
answer(sprintf("%.3f", rice_tab_cv[row.names(rice_tab_cv) == "Osmancik", ]$Recall), correct = TRUE),
282279
answer(sprintf("%.3f", rice_tab_cv[row.names(rice_tab_cv) == "Osmancik", ]$Fscore)),
283280
answer(sprintf("%3.f", sum(rice_tab_cv$Auto) - sum(rice_tab_cv$TP))),
@@ -293,7 +290,7 @@ quiz(
293290

294291
## Conclusion
295292

296-
Ce tutoriel vous a permis de découvrir la validation croisée appliquée sur une analyse discriminante linéaire. L'avantage de la validation croisée est de pouvoir employer plus de données pour entraîner votre classifieur. Il n'est pas nécessaire de séparer les groupes à la main et de calculer *n* fois les performances avant de sommer les *n* matrices de confusion en une seule. La fonction `cvpredict()` se charge de faire tout cela pour vous automatiquement.
293+
Ce tutoriel vous a permis de découvrir la validation croisée appliquée sur une analyse discriminante linéaire. L'avantage de la validation croisée est de pouvoir utiliser plus de données pour entraîner votre classifieur et également pour son test. Il n'est pas nécessaire de séparer les groupes à la main et de calculer *k* fois les performances avant de sommer les *k* matrices de confusion en une seule. La fonction `cvpredict()` se charge de faire tout cela pour vous automatiquement.
297294

298295
```{r comm_noscore, echo=FALSE}
299296
question_text(

0 commit comments

Comments
 (0)