Skip to content

Commit b2fdea6

Browse files
committed
Learnrs of modules 2 & 3 ready for 2024-2025
1 parent 92ffc44 commit b2fdea6

File tree

6 files changed

+75
-53
lines changed

6 files changed

+75
-53
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: 2024.1.0
2+
Version: 2024.3.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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
# BioDataScience3 2024.3.0
2+
3+
- Learnrs **C03La_roc** and **C03Lb_ml3** revised.
4+
5+
# BioDataScience3 2024.2.0
6+
7+
- Learnrs **C02La_cv** and **C02Lb_ml2** revised.
8+
19
# BioDataScience3 2024.1.0
210

311
- Inactivation of all learnrs except those of module 1.

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -130,28 +130,28 @@ rice_test <- testing(rice_split)
130130
```
131131

132132
```{r rice_split_h2-check}
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 ___.")
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é les consignes ? Il ne faut compléter que les champs ___.")
134134
```
135135

136136
## Analyse discriminante linéaire
137137

138138
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` ?
139139

140140
```{r lda_h2, exercise=TRUE}
141-
rice_lda <- mlLda(data = ___, ___ ~ ___)
141+
rice_lda <- ml_lda(data = ___, ___ ~ ___)
142142
summary(rice_lda)
143143
```
144144

145145
```{r lda_h2-hint-1}
146-
rice_lda <- mlLda(data = rice_train, ___ ~ ___)
146+
rice_lda <- ml_lda(data = rice_train, ___ ~ ___)
147147
summary(rice_lda)
148148
149149
## Attention, le prochain indice est la solution ##
150150
```
151151

152152
```{r lda_h2-solution}
153153
## Solution ##
154-
rice_lda <- mlLda(data = rice_train, class ~ .)
154+
rice_lda <- ml_lda(data = rice_train, class ~ .)
155155
summary(rice_lda)
156156
```
157157

@@ -162,20 +162,20 @@ grade_code("Votre classifieur LDA est entrainé. Il faut encore en mesurer les p
162162
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).
163163

164164
```{r lda_cv_h2, exercise=TRUE}
165-
rice_lda_cv <- mlLda(data = ___, ___ ~ ___)
165+
rice_lda_cv <- ml_lda(data = ___, ___ ~ ___)
166166
summary(rice_lda_cv)
167167
```
168168

169169
```{r lda_cv_h2-hint-1}
170-
rice_lda_cv <- mlLda(data = rice, ___ ~ ___)
170+
rice_lda_cv <- ml_lda(data = rice, ___ ~ ___)
171171
summary(rice_lda_cv)
172172
173173
## Attention, le prochain indice est la solution ##
174174
```
175175

176176
```{r lda_cv_h2-solution}
177177
## Solution ##
178-
rice_lda_cv <- mlLda(data = rice, class ~ .)
178+
rice_lda_cv <- ml_lda(data = rice, class ~ .)
179179
summary(rice_lda_cv)
180180
```
181181

@@ -249,7 +249,7 @@ summary(rice_conf_cv)
249249
```
250250

251251
```{r lda_pred_cv_h2-check}
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 ?")
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és 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 ?")
253253
```
254254

255255
Répondez aux questions ci-dessous relatives aux deux classifieurs `rice_lda` et `rice_lda_cv`.
@@ -264,7 +264,7 @@ quiz(
264264
try_again_button = "Resoumettre une réponse",
265265
incorrect = "Mauvaise réponse. Recommencez afin de trouver la bonne réponse",
266266
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)."),
267-
question("Combien d'items sont employé pour déterminer les performances du classifieur avec validation croisée ?",
267+
question("Combien d'items sont employés pour déterminer les performances du classifieur avec validation croisée ?",
268268
answer(sprintf("%1.f", nrow(rice)), correct = TRUE),
269269
answer(sprintf("%1.f", nrow(rice_train))),
270270
answer(sprintf("%1.f", nrow(rice_test))),

inst/tutorials/C02Lb_ml2/C02Lb_ml2.Rmd.inactivated renamed to inst/tutorials/C02Lb_ml2/C02Lb_ml2.Rmd

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,14 @@ Ce tutoriel a pour objectif de vous permettre de découvrir de nouveaux algorith
6262

6363
Toutes ces méthodes font partie de votre boite à outils pour la classification supervisée à côté de l'analyse discriminante linéaire et de la quantification vectorielle, ainsi que d'autres techniques encore que vous découvrirez dans le module 3 du cours. Concrètement, vous utiliserez la méthode la plus judicieuse en fonction du contexte. Il est même conseillé d'en tester plusieurs et de les comparer pour ensuite conserver le classifieur le plus efficace après cette étude comparative.
6464

65-
Pour l'ADL, vous avez utilisé la fonction `mlLda()`. Voici les fonctions du package {mlearning} que vous utiliserez ici :
65+
Pour l'ADL, vous avez utilisé la fonction `ml_lda()`. Voici les fonctions du package {mlearning} que vous utiliserez ici :
6666

67-
| **Méthode** | **Fonction** |
68-
|--------------------------------|---------------------------------------|
69-
| Analyse discriminante linéaire | `mlLda(data = <df>, formula,...)` |
70-
| K plus proches voisins | `mlKnn(data = <df>, formula,...)` |
71-
| Partitionnement récursif | `mlRpart(data = <df>, formula,...)` |
72-
| Foret aléatoire | `mlRforest(data = <df>, formula,...)` |
67+
| **Méthode** | **Fonction** |
68+
|--------------------------------|----------------------------------------|
69+
| Analyse discriminante linéaire | `ml_lda(data = <df>, formula,...)` |
70+
| K plus proches voisins | `ml_knn(data = <df>, formula,...)` |
71+
| Partitionnement récursif | `ml_rpart(data = <df>, formula,...)` |
72+
| Forêt aléatoire | `ml_rforest(data = <df>, formula,...)` |
7373

7474
Le package {mlearning} permet d'utiliser une interface similaire et simplifiée pour chaque méthode. Il fait partie du dialecte `SciViews::R` et est chargé en spécifiant que la section relative au "machine learning" doit être également chargée à l'aide de `SciViews::R("ml")`
7575

@@ -151,7 +151,7 @@ pumpkins_rf <- ml___(data = ___, ___~___, ___ = ___)
151151
```{r ml_h2-hint-1}
152152
set.seed(3265)
153153
# K plus proches voisins
154-
pumpkins_knn <- mlKnn(data = pumpkins_train, class ~ ., k.nn = 15)
154+
pumpkins_knn <- ml_knn(data = pumpkins_train, class ~ ., k.nn = 15)
155155
# Partitionnement récursif
156156
pumpkins_part <- ml___(data = ___, ___~___)
157157
# Forêt aléatoire
@@ -164,11 +164,11 @@ pumpkins_rf <- ml___(data = ___, ___~___, ___ = ___)
164164
## Solution ##
165165
set.seed(3265)
166166
# K plus proches voisins
167-
pumpkins_knn <- mlKnn(data = pumpkins_train, class ~ ., k.nn = 15)
167+
pumpkins_knn <- ml_knn(data = pumpkins_train, class ~ ., k.nn = 15)
168168
# Partitionnement récursif
169-
pumpkins_part <- mlRpart(data = pumpkins_train, class ~ .)
169+
pumpkins_part <- ml_rpart(data = pumpkins_train, class ~ .)
170170
# Forêt aléatoire
171-
pumpkins_rf <- mlRforest(data = pumpkins_train, class ~ ., ntree = 100)
171+
pumpkins_rf <- ml_rforest(data = pumpkins_train, class ~ ., ntree = 100)
172172
```
173173

174174
```{r ml_h2-check}

inst/tutorials/C03La_roc/C03La_roc.Rmd.inactivated renamed to inst/tutorials/C03La_roc/C03La_roc.Rmd

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ breast <- sselect(breast, -id)
2525
# Partitionnement récursif
2626
## rpart1
2727
set.seed(12)
28-
breast_part <- mlRpart(data = breast, class ~ .)
28+
breast_part <- ml_rpart(data = breast, class ~ .)
2929
breast_pred1 <- cvpredict(breast_part, cv.k = 5)
3030
part1_conf <- confusion(breast_pred1, breast$class)
3131
part1_tab <- summary(part1_conf)
@@ -46,7 +46,7 @@ breast %>.%
4646
breast2 <- bind_rows(br_m2, br_b2)
4747
# Création du classifieur
4848
set.seed(256)
49-
breast_part2 <- mlRpart(data = breast2, class ~ .)
49+
breast_part2 <- ml_rpart(data = breast2, class ~ .)
5050
# Évaluation du classifieur
5151
breast_pred2 <- cvpredict(breast_part2, cv.k = 5)
5252
part2_conf <- confusion(breast_pred2, breast2$class)
@@ -134,7 +134,7 @@ cvpredict(___, cv.k = ___) |> confusion(___$___) |> summary()
134134
```{r rpart1_h2-hint-1}
135135
set.seed(12)
136136
# Création du classifieur
137-
breast_part <- mlRpart(data = breast, class ~ .)
137+
breast_part <- ml_rpart(data = breast, class ~ .)
138138
# Évaluation du classifieur
139139
cvpredict(___, cv.k = ___) |> confusion(___$___) |> summary()
140140
@@ -145,7 +145,7 @@ cvpredict(___, cv.k = ___) |> confusion(___$___) |> summary()
145145
## Solution ##
146146
set.seed(12)
147147
# Création du classifieur
148-
breast_part <- mlRpart(data = breast, class ~ .)
148+
breast_part <- ml_rpart(data = breast, class ~ .)
149149
# Évaluation du classifieur
150150
cvpredict(breast_part, cv.k = 5) |> confusion(breast$class) |> summary()
151151
```
@@ -163,13 +163,13 @@ question("Quel est le taux de vrais positifs pour les personnes malades ?",
163163
allow_retry = TRUE,
164164
submit_button = "Soumettre une réponse",
165165
try_again_button = "Resoumettre une réponse",
166-
incorrect = "Mauvaise réponse. Recommencez et analysez plus finement les métriques associés à ce classifieur.",
166+
incorrect = "Mauvaise réponse. Recommencez et analysez plus finement les métriques associées à ce classifieur.",
167167
correct = "Notez bien cette valeur pour plus tard.")
168168
```
169169

170170
Pour rappel, nous avons les effectifs suivants dans les deux classes :
171171

172-
```{r, echo=TRUE}
172+
```{r, echo=TRUE, warning=FALSE}
173173
table(breast$class) |>
174174
tabularise()
175175
```
@@ -245,7 +245,7 @@ summary(part2_conf)
245245

246246
```{r rpart2_h2-hint-1}
247247
set.seed(256)
248-
breast_part2 <- mlRpart(data = breast2, class ~ .)
248+
breast_part2 <- ml_rpart(data = breast2, class ~ .)
249249
part2_conf <- confusion(cvpredict(breast_part2, cv.k = ___), ___$___)
250250
summary(part2_conf)
251251
@@ -255,7 +255,7 @@ summary(part2_conf)
255255
```{r rpart2_h2-solution}
256256
## Solution ##
257257
set.seed(256)
258-
breast_part2 <- mlRpart(data = breast2, class ~ .)
258+
breast_part2 <- ml_rpart(data = breast2, class ~ .)
259259
part2_conf <- confusion(cvpredict(breast_part2, cv.k = 5), breast2$class)
260260
summary(part2_conf)
261261
```
@@ -321,7 +321,7 @@ quiz(
321321
submit_button = "Soumettre une réponse",
322322
try_again_button = "Resoumettre une réponse",
323323
incorrect = "Mauvaise réponse. Recommencez et analysez plus finement les métriques associés aux classifieurs.",
324-
correct = "Vous pouvez observer que la modification des proportions a permis d'augmenter grandement le rappel. Cependant, nous observons une perte de précision. Les médecins vont préférer détecter un maximum des tumeurs malignes, quitte à avoir un peu plus de faux positifs dans le lot qu'ils démasqueront via des analyses plus poussées sur les patientes déclarés positifs.")
324+
correct = "Vous pouvez observer que la modification des proportions a permis d'augmenter grandement le rappel. Cependant, nous observons une perte de précision. Les médecins vont préférer détecter un maximum des tumeurs malignes, quitte à avoir un peu plus de faux positifs dans le lot qu'ils démasqueront via des analyses plus poussées sur les patientes déclarées positifs.")
325325
)
326326
```
327327

@@ -357,9 +357,12 @@ ___<- performance(___, "tpr", "fpr")
357357
# 3) Tracer le graphique ROC
358358
plot(___)
359359
abline(a = 0, b = 1, lty = 2)
360+
361+
## Attention, le prochain indice est la solution ##
360362
```
361363

362364
```{r roc_h2-solution}
365+
## Solution ##
363366
library(ROCR)
364367
# 1) Formater les prédictions pour ROCR
365368
pred_obj <- prediction(breast_pred[,"malignant"], breast$class == "malignant")
@@ -381,9 +384,12 @@ ___::___(___$___, ___[, "malignant"])
381384

382385
```{r auc_h2-hint-1}
383386
___::auc(___$___, ___[, "malignant"])
387+
388+
## Attention, le prochain indice est la solution ##
384389
```
385390

386391
```{r auc_h2-solution}
392+
## Solution ##
387393
pROC::auc(breast$class, breast_pred[, "malignant"])
388394
```
389395

@@ -393,7 +399,7 @@ grade_code("Vous avez déterminé la valeur de l'aire sous la courbe ROC pour vo
393399

394400
## Conclusion
395401

396-
Vous venez d'explorer l'effet des proportions par classes sur un classifieur et sur les métriques de perfomance de ce classifieur. Vous avez aussi corrigé vos métriques en renseignant la probabilité *a priori*. Enfin, vous avez tracé une courbe ROC et calculé son aire sous la courbe, AUC. Tous ces outils vous seront bien utiles pour optimiser vos propres classifieurs.
402+
Vous venez d'explorer l'effet des proportions par classes sur un classifieur et sur les métriques de performance de ce classifieur. Vous avez aussi corrigé vos métriques en renseignant la probabilité *a priori*. Enfin, vous avez tracé une courbe ROC et calculé son aire sous la courbe, AUC. Tous ces outils vous seront bien utiles pour optimiser vos propres classifieurs.
397403

398404
```{r comm_noscore, echo=FALSE}
399405
question_text(

inst/tutorials/C03Lb_ml3/C03Lb_ml3.Rmd.inactivated renamed to inst/tutorials/C03Lb_ml3/C03Lb_ml3.Rmd

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ derma <- na_omit(derma, cols = "age")
2424
set.seed(960412)
2525
## Classifieur
2626
# Machine à vecteurs supports
27-
derma_svmr <- mlSvm(data = derma, class ~ .)
27+
derma_svmr <- ml_svm(data = derma, class ~ .)
2828
# Machine à vecteurs supports avec un noyau linéaire
29-
derma_svml <- mlSvm(data = derma, class ~ ., kernel = "linear")
29+
derma_svml <- ml_svm(data = derma, class ~ ., kernel = "linear")
3030
# Réseaux de neurones artificiels
31-
derma_nnet <- mlNnet(data = derma, class ~ ., size = 5)
31+
derma_nnet <- ml_nnet(data = derma, class ~ ., size = 5)
3232
## Métriques
3333
set.seed(367)
3434
# Machine à vecteurs supports
@@ -58,14 +58,14 @@ Ce tutoriel a pour objectif de vous faire découvrir deux nouvelles méthodes de
5858

5959
Ces deux méthodes sont disponibles dans le package {mlearning}
6060

61-
| **Méthode** | **Fonction** |
62-
|---------------------------------|--------------------------------|
63-
| Analyse discriminante linéaire | `mlLda(data, formula,...)` |
64-
| K plus proches voisins | `mlKnn(data, formula,...)` |
65-
| Partitionnement récursif | `mlRpart(data, formula,...)` |
66-
| Forêt aléatoire | `mlRforest(data, formula,...)` |
67-
| Machine à vecteurs supports | `mlSvm(data, formula,...)` |
68-
| Réseaux de neurones artificiels | `mlNnet(data, formula,...)` |
61+
| **Méthode** | **Fonction** |
62+
|---------------------------------|---------------------------------|
63+
| Analyse discriminante linéaire | `ml_lda(data, formula,...)` |
64+
| K plus proches voisins | `ml_knn(data, formula,...)` |
65+
| Partitionnement récursif | `ml_rpart(data, formula,...)` |
66+
| Forêt aléatoire | `ml_rforest(data, formula,...)` |
67+
| Machine à vecteurs supports | `ml_svm(data, formula,...)` |
68+
| Réseaux de neurones artificiels | `ml_nnet(data, formula,...)` |
6969

7070
## Discrimination de maladies de la peau
7171

@@ -85,7 +85,7 @@ Il y a huit valeurs manquantes pour la variable `age`. La variable `class` repre
8585

8686
La variable `family_history` peut prendre soit la valeur de 0 (aucune maladie de la peau dans la famille), soit la valeur de 1 (maladie présente dans la famille.) Les autres attributs peuvent prendre quatre valeurs : 0 (absence), 1, 2 et 3 (très important).
8787

88-
Calculez un classifieur n'utilisant que les observations cliniques. Sélectionnez les variables 1 à 11 et 34 à 35. Utilisez la fonction `sselect()`. Éliminez ensuite les individus contenant des valeurs manquantes pour `age` avec `na_omit()`. Votre jeu de données nettoyé s'appelera `derma`.
88+
Calculez un classifieur n'utilisant que les observations cliniques. Sélectionnez les variables 1 à 11 et 34 à 35. Utilisez la fonction `sselect()`. Éliminez ensuite les individus contenant des valeurs manquantes pour `age` avec `na_omit()`. Votre jeu de données nettoyé s'appellera `derma`.
8989

9090
```{r derma_h2, exercise=TRUE}
9191
# Sélection des variables d'intérêts
@@ -99,6 +99,8 @@ ___ <- na_omit(___, cols = ___)
9999
derma <- sselect(dermatology, c(___:___, ___:___))
100100
# Élimination des NA
101101
derma <- na_omit(derma, cols = ___)
102+
103+
## Attention, le prochain indice est la solution ##
102104
```
103105

104106
```{r derma_h2-solution}
@@ -110,7 +112,7 @@ derma <- na_omit(derma, cols = "age")
110112
```
111113

112114
```{r derma_h2-check}
113-
grade_code("Une fois le remaniement des données réaliser, on va pouvoir s'attaquer à nos classifieurs.")
115+
grade_code("Une fois le remaniement des données réalisé, on va pouvoir s'attaquer à nos classifieurs.")
114116
```
115117

116118
Explorez ce jeu de données comme bon vous semble. Vous avez la possibilité de réaliser tous les analyses et graphiques que vous désirez ci-dessous.
@@ -126,31 +128,34 @@ Créez à présent trois classifieurs utilisant la machine à vecteurs supports
126128
```{r, classif_h2, exercise=TRUE}
127129
set.seed(960412)
128130
# Machine à vecteurs supports
129-
derma_svmr <- mlSvm(data = ___, ___ ~ ___)
131+
derma_svmr <- ml_svm(data = ___, ___ ~ ___)
130132
# Machine à vecteurs supports avec un noyau linéaire
131-
derma_svml <- mlSvm(data = ___, ___ ~ ___, ___ = "linear")
133+
derma_svml <- ml_svm(data = ___, ___ ~ ___, ___ = "linear")
132134
# Réseaux de neurones artificiels
133-
derma_nnet <- mlNnet(data = ___, ___ ~ ___, ___ = ___)
135+
derma_nnet <- ml_nnet(data = ___, ___ ~ ___, ___ = ___)
134136
```
135137

136138
```{r, classif_h2-hint-1}
137139
set.seed(960412)
138140
# Machine à vecteurs supports
139-
derma_svmr <- mlSvm(data = derma, ___ ~ ___)
141+
derma_svmr <- ml_svm(data = derma, ___ ~ ___)
140142
# Machine à vecteurs supports avec un noyau linéaire
141-
derma_svml <- mlSvm(data = ___, ___ ~ ___, kernel = "linear")
143+
derma_svml <- ml_svm(data = ___, ___ ~ ___, kernel = "linear")
142144
# Réseaux de neurones artificiels
143-
derma_nnet <- mlNnet(data = ___, ___ ~ ___, size = 12)
145+
derma_nnet <- ml_nnet(data = ___, ___ ~ ___, size = 12)
146+
147+
## Attention, le prochain indice est la solution ##
144148
```
145149

146150
```{r, classif_h2-solution}
151+
## Solution ##
147152
set.seed(960412)
148153
# Machine à vecteurs supports
149-
derma_svmr <- mlSvm(data = derma, class ~ .)
154+
derma_svmr <- ml_svm(data = derma, class ~ .)
150155
# Machine à vecteurs supports avec un noyau linéaire
151-
derma_svml <- mlSvm(data = derma, class ~ ., kernel = "linear")
156+
derma_svml <- ml_svm(data = derma, class ~ ., kernel = "linear")
152157
# Réseaux de neurones artificiels
153-
derma_nnet <- mlNnet(data = derma, class ~ ., size = 12)
158+
derma_nnet <- ml_nnet(data = derma, class ~ ., size = 12)
154159
```
155160

156161
```{r classif_h2-check}
@@ -177,9 +182,12 @@ cvpredict(derma_svmr, cv.k = 5) |> confusion(___$___) |> summary()
177182
cvpredict(___, ___) |> confusion(___$___) |> summary()
178183
# Réseaux de neurones artificiels
179184
cvpredict(___, ___) |> confusion(___$___) |> summary()
185+
186+
## Attention, le prochain indice est la solution ##
180187
```
181188

182189
```{r predict_h2-solution}
190+
## Solution ##
183191
set.seed(367)
184192
# Machine à vecteurs supports
185193
cvpredict(derma_svmr, cv.k = 10) |> confusion(derma$class) |> summary()

0 commit comments

Comments
 (0)