Skip to content

Commit f65de5c

Browse files
committed
Revision C03La_cv and C03Lb_ml3 2023-2024
1 parent 84b886e commit f65de5c

File tree

4 files changed

+67
-51
lines changed

4 files changed

+67
-51
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.2.0
2+
Version: 2023.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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# BioDataScience3 2023.3.0
2+
3+
- Revision of **C03La_roc** and **C03Lb_ml3**.
4+
15
# BioDataScience3 2023.2.0
26

37
- Revision of **C02La_cv** and **C02Lb_ml2**.

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

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ breast <- janitor::clean_names(breast)
2222
breast <- na_omit(breast, "bare_nuclei")
2323
breast <- sselect(breast, -id)
2424
25-
# Partitionnement récursif -------
25+
# Partitionnement récursif
2626
## rpart1
2727
set.seed(12)
2828
breast_part <- mlRpart(data = breast, class ~ .)
@@ -32,18 +32,18 @@ part1_tab <- summary(part1_conf)
3232
3333
## rpart2
3434
set.seed(34564)
35-
# Sous-ensemble des tumeurs ma lignes
35+
# Sous-ensemble des tumeurs malignes
3636
breast %>.%
3737
filter(., class == "malignant") %>.%
3838
sample_n(., 200) %->%
3939
br_m2
4040
# Sous-ensemble des tumeurs bénignes
4141
breast %>.%
4242
filter(., class == "benign") %>.%
43-
sample_n(., 100) %->%
43+
sample_n(., 100) ->
4444
br_b2
4545
# Combinaison des tableaux
46-
breast2 %<-% bind_rows(br_m2, br_b2)
46+
breast2 <- bind_rows(br_m2, br_b2)
4747
# Création du classifieur
4848
set.seed(256)
4949
breast_part2 <- mlRpart(data = breast2, class ~ .)
@@ -63,7 +63,7 @@ part2_conf2_tab <- summary(part2_conf2)
6363
#part2_tab
6464
#part2_conf2_tab
6565
66-
# ROC -----
66+
# Courbe ROC
6767
set.seed(875467)
6868
breast_pred <- cvpredict(breast_part, cv.k = 5, type = "membership")
6969
#head(breast_pred)
@@ -81,24 +81,24 @@ BioDataScience3::learnr_server(input, output, session)
8181

8282
## Objectifs
8383

84-
Un classifieur qui ne commet pas d'erreur, ce n'est pas réaliste. Les métriques sont calculées sur base d'une matrice de confusion. Des métriques permettent d'évaluer la qualité d'un classifieur comme le rappel, la précision, le taux d'erreur globale... Le nombre d'items dans chaque classe va influencer grandement la valeur de ces métriques. Ce tutoriel s'intéresse tout d'abord à l'effet des proportions entre les classes sur le classifieur et sur les métriques qui en évaluent les performances.
84+
Un classifieur qui ne commet pas d'erreur, ce n'est pas réaliste. Les métriques sont calculées sur base d'une matrice de confusion. Des métriques permettent d'évaluer la qualité d'un classifieur comme le rappel, la précision, le taux d'erreur globale... Le nombre d'items dans chaque classe va influencer grandement la valeur de la plupart de ces métriques. Ce tutoriel s'intéresse à l'effet des proportions entre les classes sur le classifieur et sur les métriques qui en évaluent les performances.
8585

86-
Un autre manière d'influencer notre classifieur va être de modifier le seuil de détection. Étudier la variation du seuil de détection est l'objectif de la courbe ROC. Cette courbe représente le comportement de notre classifieur à deux classes pour tous les seuils de détection possibles.
86+
Un autre manière d'influencer notre classifieur va être de modifier le seuil de détection. Étudier la variation du seuil de détection est l'objectif de la courbe ROC. Cette courbe représente le comportement de notre classifieur à deux classes pour tous les seuils de détection possibles. La seconde partie du tutoriel traitera de courbe ROC.
8787

8888
## Effet des proportions sur les métriques
8989

90-
Lorsqu'un classifieur ne commet aucune erreur. Les proportions de chacune des classes n'ont aucune importance. Qu'il y ait 10, 1000, 10000 individus par classe n'aura aucun effet. Par contre, dès qu'il y a des erreurs de classification, les proportions de chaque classe dans le set d'apprentissage vont avoir un effet sur les résultats de chaque métrique. Il peut être intéressant de modifier les proportions relatives de chaque classe afin de maximiser certaines métriques comme la précision ou le rappel. Cela va avoir également un effet sur les métriques globales (multiclasses) comme le taux de reconnaissance global.
90+
Lorsqu'un classifieur ne commet aucune erreur, les proportions des classes n'ont aucune importance. Par contre, dès qu'il y a des erreurs de classification, les proportions des classes dans le set d'apprentissage vont avoir un effet sur le classifieur et les proportions dans le set de test vont influencer les métriques de performance du classifieur. Il peut être intéressant de modifier les proportions relatives des classes pour maximiser certaines métriques comme la précision ou le rappel. Cela va avoir également un effet sur les métriques globales (multiclasses) comme le taux global de reconnaissance.
9191

9292
Comme nous l'avons précisé depuis le premier module du cours de SDD III, il faut définir les métriques d'intérêt en fonction de notre objectif final. Souhaite-t-on un classifieur qui commet globalement peu d'erreurs ou bien un classifieur très précis pour une classe particulière ? Et l'erreur pour la classe en question est-elle plus grave si le classifieur rate certains individus (faux négatifs) ou s'il contamine trop la classe prédite (faux positifs) ? C'est à vous en tant qu'expert de le définir.
9393

94-
Vous avez à votre disposition le tableau `BreastCancer` du package {mlbench}. Votre objectif est de déterminer si une tumeur du sein est bénigne ou maligne sur base de caractéristiques mesurées sur une biopsie. N'hésitez pas à consulter la page d'aide de ce tableau afin d'en apprendre davantage.
94+
Vous avez à votre disposition le tableau `BreastCancer` du package {mlbench}. Vous devez déterminer si une tumeur du sein est bénigne ou maligne sur base de caractéristiques récoltées par biopsie. N'hésitez pas à consulter la page d'aide de ce jeu de données pour en apprendre davantage (`?mlbench::BreastCancer`).
9595

9696
```{r, echo=TRUE}
9797
breast <- read("BreastCancer", package = "mlbench")
9898
breast <- janitor::clean_names(breast)
9999
```
100100

101-
Ce tableau comprend `r nrow(breast)` individus et `r ncol(breast)`.
101+
Ce jeu de données contient `r nrow(breast)` individus et `r ncol(breast)` variables.
102102

103103
```{r, echo=TRUE}
104104
skimr::skim(breast)
@@ -119,11 +119,11 @@ La répartition entre les tumeurs bénignes et malignes n'est pas homogène dans
119119
table(breast$class)
120120
```
121121

122-
Les médecins font appel à vous afin de mettre en place un classifieur capable de trouver un maximum de tumeurs malignes sur base des attributs choisis à l'aide d'une classification automatisée sur ordinateur. Ils acceptent que le classifieur se trompe et prédise des faux positifs. Par contre, ils ne souhaitent pas rater de patientes atteintes d'un cancer grave.
122+
Les médecins font appel à vous pour mettre en place un classifieur capable de trouver un maximum de tumeurs malignes sur base des attributs choisis à l'aide d'une classification automatisée sur ordinateur. Ils acceptent que le classifieur se trompe et prédise des faux positifs. Par contre, ils ne souhaitent pas rater de patientes atteintes d'un cancer grave.
123123

124-
Réalisez un premier classifieur utilisant le partitionnement récursif et la validation croisée 5 fois afin d'employer un maximum d'observations. Utilisez une formule condensée. Nommez ce classifieur `breast_part`.
124+
Réalisez un premier classifieur utilisant le partitionnement récursif et la validation croisée cinq fois afin d'employer un maximum d'observations. Utilisez une formule condensée. Nommez ce classifieur `breast_part`.
125125

126-
```{r rpart1_h2, exercise = TRUE}
126+
```{r rpart1_h2, exercise=TRUE}
127127
set.seed(12)
128128
# Création du classifieur
129129
breast_part <- ml___(data = ___, ___ ~ ___)
@@ -170,25 +170,26 @@ question("Quel est le taux de vrais positifs pour les personnes malades ?",
170170
Pour rappel, nous avons les effectifs suivants dans les deux classes :
171171

172172
```{r, echo=TRUE}
173-
table(breast$class)
173+
table(breast$class) |>
174+
tabularise()
174175
```
175176

176-
À présent, construisez un nouveau classifieur utilisant à nouveau le partitionnement récursif avec une validation croisée 5 fois. Modifiez le set d'apprentissage afin d'avoir 100 tumeurs bénignes et 200 tumeurs malignes afin de réduire l'écart entre les deux.
177+
À présent, construisez un nouveau classifieur utilisant à nouveau le partitionnement récursif avec une validation croisée cinq fois. Modifiez le set d'apprentissage afin d'avoir 100 tumeurs bénignes et 200 tumeurs malignes pour réduire l'écart entre les deux.
177178

178179
```{r split_h2, exercise=TRUE}
179180
set.seed(34564)
180181
# Sous-ensemble des tumeurs malignes
181182
breast %>.%
182183
filter(., ___ == ___) %>.%
183-
sample_n(., ___) %->%
184+
sample_n(., ___) ->
184185
br_m2
185186
# Sous-ensemble des tumeurs bénignes
186187
breast %>.%
187188
filter(., ___ == ___) %>.%
188-
sample_n(., ___) %->%
189+
sample_n(., ___) ->
189190
br_b2
190191
# Combinaison des tableaux
191-
breast2 %<-% bind_rows(___, ___)
192+
breast2 <- bind_rows(___, ___)
192193
table(breast2$class)
193194
```
194195

@@ -197,15 +198,15 @@ set.seed(34564)
197198
# Sous-ensemble des tumeurs malignes
198199
breast %>.%
199200
filter(., class == ___) %>.%
200-
sample_n(., ___) %->%
201+
sample_n(., ___) ->
201202
br_m2
202203
# Sous-ensemble des tumeurs bénignes
203204
breast %>.%
204205
filter(., class == ___) %>.%
205-
sample_n(., ___) %->%
206+
sample_n(., ___) ->
206207
br_b2
207208
# Combinaison des tableaux
208-
breast2 %<-% bind_rows(br_m2, br_b2)
209+
breast2 <- bind_rows(br_m2, br_b2)
209210
table(breast2$class)
210211
211212
## Attention, le prochain indice est la solution ##
@@ -217,15 +218,15 @@ set.seed(34564)
217218
# Sous-ensemble des tumeurs malignes
218219
breast %>.%
219220
filter(., class == "malignant") %>.%
220-
sample_n(., 200) %->%
221+
sample_n(., 200) ->
221222
br_m2
222223
# Sous-ensemble des tumeurs bénignes
223224
breast %>.%
224225
filter(., class == "benign") %>.%
225-
sample_n(., 100) %->%
226+
sample_n(., 100) ->
226227
br_b2
227228
# Combinaison des tableaux
228-
breast2 %<-% bind_rows(br_m2, br_b2)
229+
breast2 <- bind_rows(br_m2, br_b2)
229230
table(breast2$class)
230231
```
231232

@@ -267,6 +268,7 @@ Si nous considérons que les probabilités d'obtenir une tumeur maligne ou béni
267268

268269
Heureusement, il est possible d'indiquer les probabilités *a priori* dans la matrice de confusion `part2_conf`. Ainsi, les métriques seront corrigées en tenant compte de ces probabilités d'avoir l'une ou l'autre tumeur.
269270

271+
270272
```{r prior_h2, exercise=TRUE}
271273
# Calcul des probabilités a priori
272274
(breast_prior <- table(___$___) / nrow(___))
@@ -319,13 +321,13 @@ quiz(
319321
submit_button = "Soumettre une réponse",
320322
try_again_button = "Resoumettre une réponse",
321323
incorrect = "Mauvaise réponse. Recommencez et analysez plus finement les métriques associés aux classifieurs.",
322-
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 le sous-ensemble ainsi obtenu.")
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.")
323325
)
324326
```
325327

326328
## Courbes ROC
327329

328-
Dans la section précédente, nous avons modifié les proportions relatives dans les classes pour modifier les performances de notre classifieur (rappel *versus* précision). Il est possible de modifier aussi le seuil de détection. La courbe ROC permet d'étudier tous les seuils de détection pour un classifieur à deux classes. Cette vue d'ensemble est particulièrement utile si l'on ne connait pas les probabilités *a priori*, ou si celles-ci peuvent varier grandement. Une comparaison des classifieurs sur base des courbes ROC permet alors de choisir le meilleur dans les différents cas de figure qui peuvent se présenter.
330+
Dans la section précédente, nous avons altéré les proportions relatives dans les classes pour modifier les performances de notre classifieur (rappel *versus* précision). Il est possible de modifier aussi le seuil de détection. La courbe ROC permet d'étudier tous les seuils de détection pour un classifieur binaire. Cette vue d'ensemble est particulièrement utile si l'on ne connait pas les probabilités *a priori*, ou si celles-ci peuvent varier grandement. Une comparaison des classifieurs sur base des courbes ROC permet alors de choisir le meilleur dans les différents cas de figure qui peuvent se présenter.
329331

330332
```{r, echo=TRUE}
331333
set.seed(875467)
@@ -335,7 +337,7 @@ head(breast_pred)
335337

336338
Réalisez en R de base le graphique de la courbe ROC. Vous devez commencer par formater les prédictions pour ROCR et nommer cet objet `pred_obj`. Ensuite, vous devez calculer les performances de votre `pred_obj` et le nommer `perf`. Déterminer les taux de vrais positifs (`tpr`) et le taux de faux positifs (`fpr`).
337339

338-
```{r roc_h2, exercise = TRUE}
340+
```{r roc_h2, exercise=TRUE}
339341
library(ROCR)
340342
# 1) Formater les prédictions pour ROCR
341343
___ <- prediction(breast_pred[,"malignant"], breast$class == "malignant")
@@ -371,9 +373,9 @@ plot(perf); abline(a = 0, b = 1, lty = 2)
371373
grade_code("Vous avez obtenu le graphique souhaité. On observe que le taux de vrais positifs augmente très rapidement, ce qui est bon signe.")
372374
```
373375

374-
Déterminez l'aire sous la courbe à l'aide de la fonction `auc()` du package {pROC}. Employez l'objet `breast_pred` explicité ci-dessus.
376+
Déterminez l'aire sous la courbe à l'aide de la fonction `auc()` du package {pROC} à partir de l'objet `breast_pred` explicité ci-dessus.
375377

376-
```{r auc_h2, exercise = TRUE}
378+
```{r auc_h2, exercise=TRUE}
377379
___::___(___$___, ___[, "malignant"])
378380
```
379381

@@ -386,12 +388,12 @@ pROC::auc(breast$class, breast_pred[, "malignant"])
386388
```
387389

388390
```{r auc_h2-check}
389-
grade_code("Bien joué ! Vous avez déterminé la valeur de l'aire sous la courbe ROC.")
391+
grade_code("Vous avez déterminé la valeur de l'aire sous la courbe ROC pour votre classifieur.")
390392
```
391393

392394
## Conclusion
393395

394-
Vous venez de découvrir l'effet des proportions par classes sur le set d'apprentissage, la correction des métriques en renseignant la probabilité *a priori* et les courbes ROC. Tous ces outils vous seront iben utiles pour optimiser votre classifieur par rapport au problème rencontré.
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.
395397

396398
```{r comm_noscore, echo=FALSE}
397399
question_text(

0 commit comments

Comments
 (0)