Skip to content

Commit 9fe8d50

Browse files
First version of C02Lb_ml2
1 parent 2bade07 commit 9fe8d50

File tree

1 file changed

+228
-5
lines changed

1 file changed

+228
-5
lines changed

inst/tutorials/C02Lb_ml2/C02Lb_ml2.Rmd

Lines changed: 228 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ author: "Guyliann Engels & Philippe Grosjean"
44
description: "**SDD III Module 2** K plus proches voisins, méthodes par arbres, forêt aléatoire."
55
tutorial:
66
id: "C02Lb_ml2"
7-
version: 2.0.0/0
7+
version: 2.0.0/6
88
output:
99
learnr::tutorial:
1010
progressive: true
@@ -17,7 +17,36 @@ BioDataScience3::learnr_setup()
1717
SciViews::R()
1818
library(mlearning)
1919
20-
# ...
20+
# Import dataset ----
21+
pumpkins <- read("pumpkins", package = "BioDataScience3")
22+
23+
library(rsample)
24+
set.seed(101121) # Générateur de nombres pseudo-aléatoires
25+
pumpkins_split <- initial_split(pumpkins, prop = 0.8)
26+
pumpkins_split
27+
# training set
28+
pumpkins_train <- training(pumpkins_split)
29+
# test set
30+
pumpkins_test <- testing(pumpkins_split)
31+
32+
# Classifieurs
33+
## K plus proches voisins
34+
pumpkins_knn <- mlKnn(data = pumpkins_train, class~., k.nn = 15)
35+
## Partitionnement récursif
36+
pumpkins_part <- mlRpart(data = pumpkins_train, class~.)
37+
## Forêt aléatoire
38+
pumpkins_rf <- mlRforest(data = pumpkins_train, class~., ntree = 100)
39+
40+
# Matrice de confusion
41+
## K plus proches voisins
42+
predict(pumpkins_knn, pumpkins_test) |> confusion(pumpkins_test$class) |> summary() ->
43+
conf_knn
44+
## Partitionnement récursif
45+
predict(pumpkins_part, pumpkins_test) |> confusion(pumpkins_test$class) |> summary() ->
46+
conf_part
47+
## forêt aléatoire
48+
predict(pumpkins_rf, pumpkins_test) |> confusion(pumpkins_test$class) |> summary() ->
49+
conf_rf
2150
```
2251

2352
```{r, echo=FALSE}
@@ -32,8 +61,202 @@ BioDataScience3::learnr_server(input, output, session)
3261

3362
## Objectifs
3463

35-
- ...
64+
Ce tutoriel a pour objectif de vous permettre de découvrir de nouveaux algorithmes de classifications supervisées. Il s'intéresse aux K plus proches voisins, à la méthode par arbres et à la méthode par de la forêt aléatoire.
65+
66+
Ces trois méthodes vont s'ajouter à l'analyse discriminante linéaire que vous avez découverte dans le premier module du cours de SDD III. Toutes ces méthodes font partie de votre boite à outils de la classification supervisée. Employez la méthode la plus judicieuse en fonction du contexte. Il est même conseillé de les tester et de les comparer afin de proposer le classifieur le plus efficace.
67+
68+
Lors du premier module, vous avez employé la fonction mlLda() afin de réaliser une analyse discriminante linéaire. Voici les nouvelles fonctions proposées par le package {mlearning}
69+
70+
| **Méthode** | **Fonction** |
71+
|--------------------------------|------------------------------|
72+
| Analyse discriminante linéaire | mlLda(data, formula,...) |
73+
| K plus proches voisins | mlKnn(data, formula,...) |
74+
| Partitionnement récursif | mlRpart(data, formula,...) |
75+
| Foret aléatoire | mlRforest(data, formula,...) |
76+
77+
Le package {mlearning} permet d'utiliser une interface similaire pour chaque méthode.
78+
79+
## Explorer les données
80+
81+
Les données employées dans ce tutoriel sont associées à 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.
82+
83+
```{r, echo = TRUE}
84+
pumpkins <- read("pumpkins", package = "BioDataScience3")
85+
```
86+
87+
Ce tableau de données traite de la différenciation de deux variétés de graines de courge. Il comprend `r nrow(pumpkins)` observations et `r ncol(pumpkins)` variables. Les douze premières variables sont des attributs morphologiques obtenus par analyse d'image et la dernière colonne correspond à la classe. Cette variable facteur est à 2 niveaux.
88+
89+
```{r}
90+
skimr::skim(pumpkins)
91+
```
92+
93+
C'est à vous d'explorer ce tableau. Vous avez la possibilité de réaliser tous les analyses et graphiques que vous désirez.
94+
95+
```{r explo_noscor, exercise=TRUE}
96+
97+
```
98+
99+
## Préparer le set d'apprentissage et le test
100+
101+
Réalisez le set d'apprentissage et le set de test. 80% des observations vont servir à entrainer le classifieur et 20% pour évaluer le classifieur. Le tableau de données se nomme `pumpkins`. Utilisez les fonctions dédiées à la création des sets d'apprentissage et de test `initial_spit()`, `training()`, `testing()` du package {rsample}.
102+
103+
```{r split_h2, exercise = TRUE}
104+
library(rsample)
105+
set.seed(101121) # Générateur de nombres pseudo-aléatoires
106+
pumpkins_split <- initial_split(___, prop = ___)
107+
pumpkins_split
108+
# training set
109+
pumpkins_train <- ___(___)
110+
# test set
111+
pumpkins_test <- ___(___)
112+
```
113+
114+
```{r split_h2-hint-1}
115+
library(rsample)
116+
set.seed(101121) # Générateur de nombres pseudo-aléatoires
117+
pumpkins_split <- initial_split(___, prop = ___)
118+
pumpkins_split
119+
# training set
120+
pumpkins_train <- training(pumpkins_split)
121+
# test set
122+
pumpkins_test <- ___(___)
123+
124+
## Attention, le prochain indice est la solution ##
125+
```
36126

37-
## Classification supervisée avec ...
127+
```{r split_h2-solution}
128+
library(rsample)
129+
set.seed(101121) # Générateur de nombres pseudo-aléatoires
130+
pumpkins_split <- initial_split(pumpkins, prop = 0.8)
131+
pumpkins_split
132+
# training set
133+
pumpkins_train <- training(pumpkins_split)
134+
# test set
135+
pumpkins_test <- testing(pumpkins_split)
136+
```
137+
138+
```{r split_h2-check}
139+
grade_code("Bien joué ! La création d'un set d'apprentissage et d'un set de test n'a plus de secret pour vous.")
140+
```
38141

39-
TODO: ce tutoriel doit encore être écrit. Vous devez probablement penser à installer une version plus récente du package qui contient les exercices finalisés !
142+
## Entrainement des classifieurs
143+
144+
Créez trois classifieurs. Le premier classifieur doit employer la méthode des K plus proches voisins avec 15 individus proches considérés (`k.nn=`). Le second classifieur doit employer le partitionnement récursif. Le troisième doit utiliser la forêt aléatoire avec un nombre d'arbres limité à 100 (`ntree=`). Utilisez le set d'apprentissage préparé à l'étape précédente.
145+
146+
```{r ml_h2, exercise = TRUE}
147+
# K plus proches voisins
148+
pumpkins_knn <- ml___(data = ___, ___~___, ___ = ___)
149+
# Partitionnement récursif
150+
pumpkins_part <- ml___(data = ___, ___~___)
151+
# Forêt aléatoire
152+
pumpkins_rf <- ml___(data = ___, ___~___, ___ = ___)
153+
```
154+
155+
```{r ml_h2-hint-1}
156+
# K plus proches voisins
157+
pumpkins_knn <- mlKnn(data = pumpkins_train, class~., k.nn = 15)
158+
# Partitionnement récursif
159+
pumpkins_part <- mlRpart(data = pumpkins_train, class~.)
160+
# Forêt aléatoire
161+
pumpkins_rf <- mlRforest(data = pumpkins_train, class~., ntree = 100)
162+
163+
## Attention, le prochain indice est la solution ##
164+
```
165+
166+
```{r ml_h2-solution}
167+
# K plus proches voisins
168+
pumpkins_knn <- mlKnn(data = pumpkins_train, class~., k.nn = 15)
169+
# Partitionnement récursif
170+
pumpkins_part <- mlRpart(data = pumpkins_train, class~.)
171+
# Forêt aléatoire
172+
pumpkins_rf <- mlRforest(data = pumpkins_train, class~., ntree = 100)
173+
```
174+
175+
```{r ml_h2-check}
176+
grade_code("Bravo ! Vous avez les trois classifieurs avec les arguments demandés. Passons à l'analyse des performances via les métriques.")
177+
```
178+
179+
## Évaluation des classifieurs
180+
181+
Évaluez la qualité des trois classifieurs pumpkins_knn, pumpkins_part, pumpkins-rf. Définissez le tableau de données à employer entre `pumpkins`, `pumpkins_train` et `pumpkins_test`.
182+
183+
```{r predict_h2, exercise = TRUE}
184+
# K plus proches voisins
185+
predict(___, ___) |> confusion(___$___) |> summary()
186+
# Partitionnement récursif
187+
predict(___, ___) |> confusion(___$___) |> summary()
188+
# forêt aléatoire
189+
predict(___, ___) |> confusion(___$___) |> summary()
190+
```
191+
192+
```{r predict_h2-hint-1}
193+
# K plus proches voisins
194+
predict(pumpkins_knn, pumpkins_test) |> confusion(___$class) |> summary()
195+
# Partitionnement récursif
196+
predict(___, ___) |> confusion(___$___) |> summary()
197+
# forêt aléatoire
198+
predict(___, ____) |> confusion(___$___) |> summary()
199+
```
200+
201+
```{r predict_h2-solution}
202+
# K plus proches voisins
203+
predict(pumpkins_knn, pumpkins_test) |> confusion(pumpkins_test$class) |> summary()
204+
# Partitionnement récursif
205+
predict(pumpkins_part, pumpkins_test) |> confusion(pumpkins_test$class) |> summary()
206+
# forêt aléatoire
207+
predict(pumpkins_rf, pumpkins_test) |> confusion(pumpkins_test$class) |> summary()
208+
```
209+
210+
```{r predict_h2-check}
211+
grade_code("Bien joué ! Vous avez calculé les métriques des trois modèles. Vous maitrisez en plus l'utilisation du pipe natif de R.")
212+
```
213+
214+
*Le pipe natif est employé dans cet exercice*
215+
216+
```{r qu_algo}
217+
quiz(
218+
question("Quel classifieur permet d'avoir le meilleur taux de reconnaissance global ?",
219+
answer("Les K plus proches voisins"),
220+
answer("Le partitionnement récursif"),
221+
answer("La forêt aléatoire", correct = TRUE),
222+
allow_retry = TRUE,
223+
submit_button = "Soumettre une réponse",
224+
try_again_button = "Resoumettre une réponse",
225+
incorrect = "Mauvaise réponse. Recommencez et analysez les métriques des trois classifieurs.",
226+
correct = "Bravo, c'est correct !"),
227+
question("Quel est la valeur du taux de vrais positifs pour le groupe des Cercevelik obtenu via le classifieur utilisant les k plus proches voisins ?",
228+
answer(sprintf("%.4f", conf_knn["Cercevelik",]$Recall), correct = TRUE),
229+
answer(sprintf("%.4f", conf_knn["Cercevelik",]$Precision)),
230+
answer(sprintf("%.4f", conf_knn["Cercevelik",]$Fscore)),
231+
answer(sprintf("%.4f", conf_knn["Cercevelik",]$FDR)),
232+
allow_retry = TRUE,
233+
submit_button = "Soumettre une réponse",
234+
try_again_button = "Resoumettre une réponse",
235+
incorrect = "Mauvaise réponse. Recommencez et analysez plus finement les métriques associés à ce classifieur.",
236+
correct = "Bravo, c'est correct !"),
237+
question("Quel est la valeur de spécificité pour le groupe des Urgup Sivrisi obtenu via le classifieur utilisant la forêt aléatoire ?",
238+
answer(sprintf("%.4f", conf_rf["Urgup Sivrisi",]$Specificity), correct = TRUE),
239+
answer(sprintf("%.4f", conf_rf["Urgup Sivrisi",]$Precision)),
240+
answer(sprintf("%.4f", conf_rf["Urgup Sivrisi",]$Fscore)),
241+
answer(sprintf("%.4f", conf_rf["Urgup Sivrisi",]$FDR)),
242+
allow_retry = TRUE,
243+
submit_button = "Soumettre une réponse",
244+
try_again_button = "Resoumettre une réponse",
245+
incorrect = "Mauvaise réponse. Recommencez et analysez plus finement les métriques associés à ce classifieur.",
246+
correct = "Bravo, c'est correct !")
247+
)
248+
```
249+
250+
## Conclusion
251+
252+
Bien joué ! Vous venez de découvrir 3 nouveaux algorithmes de classifications supervisées. Votre boite à outils s'étoffe de modules en modules.
253+
254+
```{r comm_noscore, echo=FALSE}
255+
question_text(
256+
"Laissez-nous vos impressions sur cet outil pédagogique",
257+
answer("", TRUE, message = "Pas de commentaires... C'est bien aussi."),
258+
incorrect = "Vos commentaires sont enregistrés.",
259+
placeholder = "Entrez vos commentaires ici...",
260+
allow_retry = TRUE
261+
)
262+
```

0 commit comments

Comments
 (0)