---
title: "Matematika 1 - random forest"
output: 
  flexdashboard::flex_dashboard:
    social: menu
    orientation: columns
    vertical_layout: fill
    source_code: embed
---

```{css, echo=FALSE}
.sidebar { overflow: auto; }
.dataTables_scrollBody {
    height:95% !important;
    max-height:95% !important;
}
.chart-stage-flex {
    overflow:auto !important;
}
```

```{r setup, include=FALSE}
library(tidyverse)
library(readxl)
library(tidymodels)
library(vip)
library(knitr)
library(kableExtra)

ocjene1_deskriptiva <- read_excel("../podaci/ocjene_MAT1_2021_2022.xlsx") %>%
  mutate_at(vars(KOL1:UKUPNO), as.numeric) %>%
  select(KOL1:KOL3, KP0:ZAD6)

ocjene2_deskriptiva <- read_excel("../podaci/ocjene_MAT1_2022_2023.xlsx") %>%
  mutate_at(vars(KOL1:UKUPNO), as.numeric) %>%
  select(KOL1:KOL3, KP0:ZAD6)

zajedno_ocjene <- bind_rows(list(GOD_2021_2022 = ocjene1_deskriptiva, 
                          GOD_2022_2023 = ocjene2_deskriptiva), .id = "id") %>%
  pivot_longer(KOL1:ZAD6, names_to = "Aktivnost", values_to = "Bodovi") %>%
  mutate_at(vars(id), ~if_else(. == "GOD_2021_2022", "2021", "2022"))

video1_deskriptiva <- read_csv("../podaci/all_logs_MAT1_2021_2022.csv") %>%
  mutate(VID_1 = rowSums(across(P1:V3)),
         VID_2 = rowSums(across(P8:V6)),
         VID_3 = rowSums(across(P12:V13))) %>%
  select(VID_1:VID_3)

video2_deskriptiva <- read_csv("../podaci/all_logs_MAT1_2022_2023.csv") %>%
  mutate(VID_1 = rowSums(across(P1:V3)),
         VID_2 = rowSums(across(P8:V6)),
         VID_3 = rowSums(across(P12:V13))) %>%
  select(VID_1:VID_3)

video_deskriptiva <- bind_rows(list(GOD_2021_2022 = video1_deskriptiva, 
                                    GOD_2022_2023 = video2_deskriptiva), .id = "id") %>%
  pivot_longer(VID_1:VID_3, names_to = "Aktivnost", values_to = "Logovi") %>%
  mutate_at(vars(id), ~if_else(. == "GOD_2021_2022", "2021", "2022"))

dolasci1_deskriptiva <- read_csv("../podaci/dolasci1.csv") %>% select(D1:D3)
dolasci2_deskriptiva <- read_csv("../podaci/dolasci2.csv") %>% select(D1:D3)

dolasci_deskriptiva <- bind_rows(list(GOD_2021_2022 = dolasci1_deskriptiva, 
                                      GOD_2022_2023 = dolasci2_deskriptiva), .id = "id") %>%
  pivot_longer(D1:D3, names_to = "Aktivnost", values_to = "Dolasci") %>%
  mutate_at(vars(id), ~if_else(. == "GOD_2021_2022", "2021", "2022"))

materijali1_deskriptiva <- read_csv("../podaci/materijali1.csv") %>% select(M1:M3)
materijali2_deskriptiva <- read_csv("../podaci/materijali2.csv") %>% select(M1:M3)

materijali_deskriptiva <- bind_rows(list(GOD_2021_2022 = materijali1_deskriptiva, 
                             GOD_2022_2023 = materijali2_deskriptiva), .id = "id") %>%
  pivot_longer(M1:M3, names_to = "Aktivnost", values_to = "Logovi") %>%
  mutate_at(vars(id), ~if_else(. == "GOD_2021_2022", "2021", "2022"))

rf_metrike <- metric_set(roc_auc, sens, precision, spec, accuracy, f_meas, mcc, kap, mn_log_loss)

KOL1_2klase_fit <- readRDS("../RF_modeli/RF_fit_KOL1_2klase.rds")
KOL1_2klase_tuning <- readRDS("../RF_modeli/RF_tuning_KOL1_2klase.rds")
KOL1_2klase_work <- readRDS("../RF_modeli/RF_work_KOL1_2klase.rds")
KOL1_4klase_fit <- readRDS("../RF_modeli/RF_fit_KOL1_4klase.rds")
KOL1_4klase_tuning <- readRDS("../RF_modeli/RF_tuning_KOL1_4klase.rds")
KOL1_4klase_work <- readRDS("../RF_modeli/RF_work_KOL1_4klase.rds")

permKOL1_2klase_fit <- readRDS("../RF_modeli_permutacije/RF_fit_permKOL1_2klase.rds")

KOL2_2klase_fit <- readRDS("../RF_modeli/RF_fit_KOL2_2klase.rds")
KOL2_2klase_tuning <- readRDS("../RF_modeli/RF_tuning_KOL2_2klase.rds")
KOL2_2klase_work <- readRDS("../RF_modeli/RF_work_KOL2_2klase.rds")
KOL2_4klase_fit <- readRDS("../RF_modeli/RF_fit_KOL2_4klase.rds")
KOL2_4klase_tuning <- readRDS("../RF_modeli/RF_tuning_KOL2_4klase.rds")
KOL2_4klase_work <- readRDS("../RF_modeli/RF_work_KOL2_4klase.rds")
KOL2_2klase_KOL1_fit <- readRDS("../RF_modeli/RF_fit_KOL2_2klase_KOL1.rds")
KOL2_2klase_KOL1_tuning <- readRDS("../RF_modeli/RF_tuning_KOL2_2klase_KOL1.rds")
KOL2_2klase_KOL1_work <- readRDS("../RF_modeli/RF_work_KOL2_2klase_KOL1.rds")
KOL2_4klase_KOL1_fit <- readRDS("../RF_modeli/RF_fit_KOL2_4klase_KOL1.rds")
KOL2_4klase_KOL1_tuning <- readRDS("../RF_modeli/RF_tuning_KOL2_4klase_KOL1.rds")
KOL2_4klase_KOL1_work <- readRDS("../RF_modeli/RF_work_KOL2_4klase_KOL1.rds")

KOL3_2klase_fit <- readRDS("../RF_modeli/RF_fit_KOL3_2klase.rds")
KOL3_2klase_tuning <- readRDS("../RF_modeli/RF_tuning_KOL3_2klase.rds")
KOL3_2klase_work <- readRDS("../RF_modeli/RF_work_KOL3_2klase.rds")
KOL3_4klase_fit <- readRDS("../RF_modeli/RF_fit_KOL3_4klase.rds")
KOL3_4klase_tuning <- readRDS("../RF_modeli/RF_tuning_KOL3_4klase.rds")
KOL3_4klase_work <- readRDS("../RF_modeli/RF_work_KOL3_4klase.rds")
KOL3_2klase_KOL12_fit <- readRDS("../RF_modeli/RF_fit_KOL3_2klase_KOL12.rds")
KOL3_2klase_KOL12_tuning <- readRDS("../RF_modeli/RF_tuning_KOL3_2klase_KOL12.rds")
KOL3_2klase_KOL12_work <- readRDS("../RF_modeli/RF_work_KOL3_2klase_KOL12.rds")
KOL3_4klase_KOL12_fit <- readRDS("../RF_modeli/RF_fit_KOL3_4klase_KOL12.rds")
KOL3_4klase_KOL12_tuning <- readRDS("../RF_modeli/RF_tuning_KOL3_4klase_KOL12.rds")
KOL3_4klase_KOL12_work <- readRDS("../RF_modeli/RF_work_KOL3_4klase_KOL12.rds")

KOL3_2klase_tezine1_fit <- readRDS("../RF_modeli/RF_fit_KOL3_2klase_tezine1.rds")
KOL3_2klase_tezine1_tuning <- readRDS("../RF_modeli/RF_tuning_KOL3_2klase_tezine1.rds")
KOL3_2klase_tezine1_work <- readRDS("../RF_modeli/RF_work_KOL3_2klase_tezine1.rds")
KOL3_2klase_tezine2_fit <- readRDS("../RF_modeli/RF_fit_KOL3_2klase_tezine2.rds")
KOL3_2klase_tezine2_tuning <- readRDS("../RF_modeli/RF_tuning_KOL3_2klase_tezine2.rds")
KOL3_2klase_tezine2_work <- readRDS("../RF_modeli/RF_work_KOL3_2klase_tezine2.rds")
KOL3_2klase_smote_fit <- readRDS("../RF_modeli/RF_fit_KOL3_2klase_smote.rds")
KOL3_2klase_smote_tuning <- readRDS("../RF_modeli/RF_tuning_KOL3_2klase_smote.rds")
KOL3_2klase_smote_work <- readRDS("../RF_modeli/RF_work_KOL3_2klase_smote.rds")
KOL3_2klase_rose_fit <- readRDS("../RF_modeli/RF_fit_KOL3_2klase_rose.rds")
KOL3_2klase_rose_tuning <- readRDS("../RF_modeli/RF_tuning_KOL3_2klase_rose.rds")
KOL3_2klase_rose_work <- readRDS("../RF_modeli/RF_work_KOL3_2klase_rose.rds")

update_geom_defaults(geom = "tile", new = list(color = "black"))

permKOL1_2klase_obj <- permKOL1_2klase_fit %>% extract_fit_engine()
lokal_imp_KOL1_2klase <- as_tibble(permKOL1_2klase_obj$variable.importance.local) %>% 
  mutate(students = row_number()) %>%
  pivot_longer(-students, names_to = "aktivnost", values_to = "local importance")

permKOL1_2klase_tab <- ocjene1_deskriptiva %>%
  mutate(KVIZ1 = rowSums(across(KP0:KP4)), DZ1 = ZAD1 + ZAD2) %>%
  bind_cols(video1_deskriptiva, dolasci1_deskriptiva, materijali1_deskriptiva) %>%
  bind_cols(as_tibble(permKOL1_2klase_obj$predictions)) %>% 
  select(KVIZ1, DZ1, VID_1, D1, M1, KOL1, class_1 = `1`, class_0 = `0`) %>%
  bind_cols(as_tibble(permKOL1_2klase_obj$variable.importance.local)) %>%
  arrange(KVIZ, DZ)
```

# Aktivnosti {data-navmenu="Deskriptiva"}

### Distribucije pojedinih aktivnosti po akademskim godinama

```{r, fig.width=10}
ggplot(zajedno_ocjene, aes(x = id, y = Bodovi)) +
  geom_boxplot() + facet_wrap(vars(Aktivnost), scales = "free_y", ncol = 8)
```

# Ostalo {data-navmenu="Deskriptiva"}

## Column 1

### Oznake

- VID_1 - ukupni broj logova na video materijale vezane za prvi kolokvij
- VID_2 - ukupni broj logova na video materijale vezane za drugi kolokvij
- VID_3 - ukupni broj logova na video materijale vezane za treći kolokvij

---

- D1 - ukupni broj dolazaka na predavanja do prvog kolokvija
- D2 - ukupni broj dolazaka na predavanja između prvog i drugog kolokvija
- D3 - ukupni broj dolazaka na predavanja između drugog i trećeg kolokvija

---

- M1 - ukupni broj logova na pdf materijale vezane za prvi kolokvij
- M2 - ukupni broj logova na pdf materijale vezane za drugi kolokvij
- M3 - ukupni broj logova na pdf materijale vezane za treći kolokvij

### Distribucije logova na video materijale po akademskim godinama

```{r}
ggplot(video_deskriptiva, aes(x = id, y = Logovi)) +
  geom_boxplot() + facet_wrap(vars(Aktivnost), scales = "free_y")
```

## Column 2

### Distribucije dolazaka na predavanja po akademskim godinama

```{r}
ggplot(dolasci_deskriptiva, aes(x = id, y = Dolasci)) +
  geom_boxplot() + facet_wrap(vars(Aktivnost), scales = "free_y")
```

### Distribucije logova na PDF materijale po akademskim godinama

```{r}
ggplot(materijali_deskriptiva, aes(x = id, y = Logovi)) +
  geom_boxplot() + facet_wrap(vars(Aktivnost), scales = "free_y")
```

# 1. model - opis i varijable {data-navmenu="KOLOKVIJ 1"}

## Column 1

### 1. model (binarni model)

**Prediktori**

- KVIZ - suma svih bodova na kvizovima do prvog kolokvija
- DZ - suma bodova na domaćim zadaćama do prvog kolokvija
- VIDEO - ukupni broj klikova na video materijale do prvog kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale do prvog kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja do prvog kolokvija

**Response** - binarna klasifikacija studenata na temelju broja bodova na prvom kolokviju.

- **1** (pozitivna klasa): ako je na prvom kolokviju ukupni broj bodova veći ili jednak od 10
- **0** (negativna klasa): ako je na prvom kolokviju ukupni broj bodova strogo manji od 10

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora (Gini)

```{r}
KOL1_2klase_fit %>% extract_fit_parsnip() %>% vip()
```

### Važnost prediktora (permutacija)

```{r}
permKOL1_2klase_fit %>% extract_fit_parsnip() %>% vip()
```

# 1. model - hiperparametri {data-navmenu="KOLOKVIJ 1"}

## Column 1

### Testirani hiperparametri

```{r}
KOL1_2klase_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL1_2klase_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL1_2klase_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 1. model - efikasnost {data-navmenu="KOLOKVIJ 1"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL1_2klase_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab2 <- KOL1_2klase_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL1_2klase_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL1_2klase_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1) %>% autoplot()
```

### Gain curve

```{r}
KOL1_2klase_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1) %>% autoplot()
```

# 1. model - lokalna važnost varijabli {data-navmenu="KOLOKVIJ 1"}

## Column 1

### geom_point

```{r}
ggplot(lokal_imp_KOL1_2klase, aes(x=students, y=`local importance`)) + geom_point(alpha=0.3) +
  facet_wrap(vars(aktivnost))
```

### geom_line

```{r}
ggplot(lokal_imp_KOL1_2klase, aes(x=students, y=`local importance`)) + geom_line(linewidth=0.2) +
  facet_wrap(vars(aktivnost))
```

## Column 2

### geom_boxplot

```{r}
ggplot(lokal_imp_KOL1_2klase, aes(x=aktivnost, y=`local importance`)) + geom_boxplot()
```

### geom_histogram

```{r}
ggplot(lokal_imp_KOL1_2klase, aes(x=`local importance`)) + geom_histogram() +
  facet_wrap(vars(aktivnost), scales = "free_y")
```

# 1. model - tablica studenata {data-navmenu="KOLOKVIJ 1"}

## Column 1 {data-width=200}

### tablica studenata

```{r}
permKOL1_2klase_tab %>% 
  kbl(caption = "sortirana tablica studenata prema lokalnoj važnosti varijabli KVIZ i DZ") %>%
  kable_classic("hover",full_width = F, html_font = "Cambria")
```

## column 2 {data-width=100}

### Oznake

**Prediktori**

- KVIZ1 - suma svih bodova na kvizovima do prvog kolokvija
- DZ1 - suma bodova na domaćim zadaćama do prvog kolokvija
- VID_1 - ukupni broj klikova na video materijale do prvog kolokvija
- M1 - ukupni broj klikova na PDF materijale do prvog kolokvija
- D1 - ukupni broj dolazaka na predavanja do prvog kolokvija

**Response**

- KOL1 - ukupni broj bodova na prvom kolokviju

**Vjerojatnosti**

- class_1 - predikcija vjerojatnosti da se na prvom kolokviju ostvarilo barem 10 bodova
- class_0 - predikcija vjerojatnosti da se na prvom kolokviju ostvarilo manje 10 bodova

**Lokalne važnosti varijabli**

- KVIZ - lokalna važnost varijable KVIZ1
- DZ - lokalna važnost varijable DZ1
- VIDEO - lokalna važnost varijable VID_1
- DOLASCI - lokalna važnost varijable D1
- MATERIJALI - lokalna važnost varijable M1

# 2. model - opis i varijable {data-navmenu="KOLOKVIJ 1"}

## Column 1

### 2. model (model s četiri klase)

**Prediktori**

- KVIZ - suma svih bodova na kvizovima do prvog kolokvija
- DZ - suma bodova na domaćim zadaćama do prvog kolokvija
- VIDEO - ukupni broj klikova na video materijale do prvog kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale do prvog kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja do prvog kolokvija

**Response** - Klasifikacija studenata na temelju broja bodova na prvom kolokviju.

- **1** - ako je na prvom kolokviju ukupni broj bodova unutar intervala [0,5]
- **2** - ako je na prvom kolokviju ukupni broj bodova unutar intervala (5,10]
- **3** - ako je na prvom kolokviju ukupni broj bodova unutar intervala (10,15]
- **4** - ako je na prvom kolokviju ukupni broj bodova unutar intervala (15,20]

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora

```{r}
KOL1_4klase_fit %>% extract_fit_parsnip() %>% vip()
```

# 2. model - hiperparametri {data-navmenu="KOLOKVIJ 1"}

## Column 1

### Testirani hiperparametri

```{r}
KOL1_4klase_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3,) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL1_4klase_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL1_4klase_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 2. model - efikasnost {data-navmenu="KOLOKVIJ 1"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL1_4klase_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab2 <- KOL1_4klase_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL1_4klase_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL1_4klase_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```

### Gain curve

```{r}
KOL1_4klase_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```


# 1. model - opis i varijable {data-navmenu="KOLOKVIJ 2"}

## Column 1

### 1. model (binarni model)

**Prediktori**

- KVIZ - suma svih bodova na kvizovima između prvog i drugog kolokvija
- DZ - suma bodova na domaćim zadaćama između prvog i drugog kolokvija
- VIDEO - ukupni broj klikova na video materijale između prvog i drugog kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale između prvog i drugog kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja između prvog i drugog kolokvija

**Response** - binarna klasifikacija studenata na temelju broja bodova na drugom kolokviju.

- **1** (pozitivna klasa): ako je na drugom kolokviju ukupni broj bodova veći ili jednak od 10
- **0** (negativna klasa): ako je na drugom kolokviju ukupni broj bodova strogo manji od 10

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora

```{r}
KOL2_2klase_fit %>% extract_fit_parsnip() %>% vip()
```

# 1. model - hiperparametri {data-navmenu="KOLOKVIJ 2"}

## Column 1

### Testirani hiperparametri

```{r}
KOL2_2klase_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL2_2klase_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL2_2klase_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 1. model - efikasnost {data-navmenu="KOLOKVIJ 2"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL2_2klase_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab2 <- KOL2_2klase_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL2_2klase_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL2_2klase_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1) %>% autoplot()
```

### Gain curve

```{r}
KOL2_2klase_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1) %>% autoplot()
```

# 2. model - opis i varijable {data-navmenu="KOLOKVIJ 2"}

## Column 1

### 2. model (model s četiri klase)

**Prediktori**

- KVIZ - suma svih bodova na kvizovima između prvog i drugog kolokvija
- DZ - suma bodova na domaćim zadaćama između prvog i drugog kolokvija
- VIDEO - ukupni broj klikova na video materijale između prvog i drugog kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale između prvog i drugog kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja između prvog i drugog kolokvija

**Response** - Klasifikacija studenata na temelju broja bodova na drugom kolokviju.

- **1** - ako je na drugom kolokviju ukupni broj bodova unutar intervala [0,5]
- **2** - ako je na drugom kolokviju ukupni broj bodova unutar intervala (5,10]
- **3** - ako je na drugom kolokviju ukupni broj bodova unutar intervala (10,15]
- **4** - ako je na drugom kolokviju ukupni broj bodova unutar intervala (15,20]

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora

```{r}
KOL2_4klase_fit %>% extract_fit_parsnip() %>% vip()
```

# 2. model - hiperparametri {data-navmenu="KOLOKVIJ 2"}

## Column 1

### Testirani hiperparametri

```{r}
KOL2_4klase_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3,) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL2_4klase_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL2_4klase_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 2. model - efikasnost {data-navmenu="KOLOKVIJ 2"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL2_4klase_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab2 <- KOL2_4klase_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL2_4klase_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL2_4klase_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```

### Gain curve

```{r}
KOL2_4klase_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```

# 3. model - opis i varijable {data-navmenu="KOLOKVIJ 2"}

## Column 1

### 3. model

**Prediktori**

- KVIZ - suma svih bodova na kvizovima između prvog i drugog kolokvija
- DZ - suma bodova na domaćim zadaćama između prvog i drugog kolokvija
- VIDEO - ukupni broj klikova na video materijale između prvog i drugog kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale između prvog i drugog kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja između prvog i drugog kolokvija
- KOL1 - ukupni broj bodova na prvom kolokviju

**Response** - binarna klasifikacija studenata na temelju broja bodova na drugom kolokviju.

- **1** (pozitivna klasa): ako je na drugom kolokviju ukupni broj bodova veći ili jednak od 10
- **0** (negativna klasa): ako je na drugom kolokviju ukupni broj bodova strogo manji od 10

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora

```{r}
KOL2_2klase_KOL1_fit %>% extract_fit_parsnip() %>% vip()
```

# 3. model - hiperparametri {data-navmenu="KOLOKVIJ 2"}

## Column 1

### Testirani hiperparametri

```{r}
KOL2_2klase_KOL1_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL2_2klase_KOL1_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL2_2klase_KOL1_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 3. model - efikasnost {data-navmenu="KOLOKVIJ 2"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL2_2klase_KOL1_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab2 <- KOL2_2klase_KOL1_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL2_2klase_KOL1_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL2_2klase_KOL1_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1) %>% autoplot()
```

### Gain curve

```{r}
KOL2_2klase_KOL1_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1) %>% autoplot()
```

# 4. model - opis i varijable {data-navmenu="KOLOKVIJ 2"}

## Column 1

### 4. model

**Prediktori**

- KVIZ - suma svih bodova na kvizovima između prvog i drugog kolokvija
- DZ - suma bodova na domaćim zadaćama između prvog i drugog kolokvija
- VIDEO - ukupni broj klikova na video materijale između prvog i drugog kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale između prvog i drugog kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja između prvog i drugog kolokvija
- KOL1 - ukupni broj bodova na prvom kolokviju

**Response** - Klasifikacija studenata na temelju broja bodova na drugom kolokviju.

- **1** - ako je na drugom kolokviju ukupni broj bodova unutar intervala [0,5]
- **2** - ako je na drugom kolokviju ukupni broj bodova unutar intervala (5,10]
- **3** - ako je na drugom kolokviju ukupni broj bodova unutar intervala (10,15]
- **4** - ako je na drugom kolokviju ukupni broj bodova unutar intervala (15,20]

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora

```{r}
KOL2_4klase_KOL1_fit %>% extract_fit_parsnip() %>% vip()
```

# 4. model - hiperparametri {data-navmenu="KOLOKVIJ 2"}

## Column 1

### Testirani hiperparametri

```{r}
KOL2_4klase_KOL1_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3,) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL2_4klase_KOL1_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL2_4klase_KOL1_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 4. model - efikasnost {data-navmenu="KOLOKVIJ 2"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL2_4klase_KOL1_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab2 <- KOL2_4klase_KOL1_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL2_4klase_KOL1_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL2_4klase_KOL1_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```

### Gain curve

```{r}
KOL2_4klase_KOL1_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```

# 1. model - opis i varijable {data-navmenu="KOLOKVIJ 3"}

## Column 1

### 1. model (binarni model)

**Prediktori**

- KVIZ - suma svih bodova na kvizovima između drugog i trećeg kolokvija
- DZ - suma bodova na domaćim zadaćama između drugog i trećeg kolokvija
- VIDEO - ukupni broj klikova na video materijale između drugog i trećeg kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale između drugog i trećeg kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja između drugog i trećeg kolokvija

**Response** - binarna klasifikacija studenata na temelju broja bodova na trećem kolokviju.

- **1** (pozitivna klasa): ako je na trećem kolokviju ukupni broj bodova veći ili jednak od 10
- **0** (negativna klasa): ako je na trećem kolokviju ukupni broj bodova strogo manji od 10

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora

```{r}
KOL3_2klase_fit %>% extract_fit_parsnip() %>% vip()
```

# 1. model - hiperparametri {data-navmenu="KOLOKVIJ 3"}

## Column 1

### Testirani hiperparametri

```{r}
KOL3_2klase_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL3_2klase_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL3_2klase_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 1. model - efikasnost {data-navmenu="KOLOKVIJ 3"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL3_2klase_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab2 <- KOL3_2klase_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL3_2klase_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL3_2klase_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1) %>% autoplot()
```

### Gain curve

```{r}
KOL3_2klase_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1) %>% autoplot()
```

# 2. model - opis i varijable {data-navmenu="KOLOKVIJ 3"}

## Column 1

### 2. model (model s četiri klase)

**Prediktori**

- KVIZ - suma svih bodova na kvizovima između drugog i trećeg kolokvija
- DZ - suma bodova na domaćim zadaćama između drugog i trećeg kolokvija
- VIDEO - ukupni broj klikova na video materijale između drugog i trećeg kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale između drugog i trećeg kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja između drugog i trećeg kolokvija

**Response** - Klasifikacija studenata na temelju broja bodova na trećem kolokviju.

- **1** - ako je na trećem kolokviju ukupni broj bodova unutar intervala [0,5]
- **2** - ako je na trećem kolokviju ukupni broj bodova unutar intervala (5,10]
- **3** - ako je na trećem kolokviju ukupni broj bodova unutar intervala (10,15]
- **4** - ako je na trećem kolokviju ukupni broj bodova unutar intervala (15,20]

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora

```{r}
KOL3_4klase_fit %>% extract_fit_parsnip() %>% vip()
```

# 2. model - hiperparametri {data-navmenu="KOLOKVIJ 3"}

## Column 1

### Testirani hiperparametri

```{r}
KOL3_4klase_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3,) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL3_4klase_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL3_4klase_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 2. model - efikasnost {data-navmenu="KOLOKVIJ 3"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL3_4klase_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab2 <- KOL3_4klase_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL3_4klase_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL3_4klase_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```

### Gain curve

```{r}
KOL3_4klase_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```

# 3. model - opis i varijable {data-navmenu="KOLOKVIJ 3"}

## Column 1

### 3. model

**Prediktori**

- KVIZ - suma svih bodova na kvizovima između drugog i trećeg kolokvija
- DZ - suma bodova na domaćim zadaćama između drugog i trećeg kolokvija
- VIDEO - ukupni broj klikova na video materijale između drugog i trećeg kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale između drugog i trećeg kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja između drugog i trećeg kolokvija
- KOL1 - ukupni broj bodova na prvom kolokviju
- KOL2 - ukupni broj bodova na drugom kolokviju

**Response** - binarna klasifikacija studenata na temelju broja bodova na trećem kolokviju.

- **1** (pozitivna klasa): ako je na trećem kolokviju ukupni broj bodova veći ili jednak od 10
- **0** (negativna klasa): ako je na trećem kolokviju ukupni broj bodova strogo manji od 10

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3,4}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora

```{r}
KOL3_2klase_KOL12_fit %>% extract_fit_parsnip() %>% vip()
```

# 3. model - hiperparametri {data-navmenu="KOLOKVIJ 3"}

## Column 1

### Testirani hiperparametri

```{r}
KOL3_2klase_KOL12_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL3_2klase_KOL12_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL3_2klase_KOL12_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 3. model - efikasnost {data-navmenu="KOLOKVIJ 3"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL3_2klase_KOL12_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab2 <- KOL3_2klase_KOL12_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL3_2klase_KOL12_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL3_2klase_KOL12_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1) %>% autoplot()
```

### Gain curve

```{r}
KOL3_2klase_KOL12_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1) %>% autoplot()
```

# 4. model - opis i varijable {data-navmenu="KOLOKVIJ 3"}

## Column 1

### 4. model

**Prediktori**

- KVIZ - suma svih bodova na kvizovima između drugog i trećeg kolokvija
- DZ - suma bodova na domaćim zadaćama između drugog i trećeg kolokvija
- VIDEO - ukupni broj klikova na video materijale između drugog i trećeg kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale između drugog i trećeg kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja između drugog i trećeg kolokvija
- KOL1 - ukupni broj bodova na prvom kolokviju
- KOL2 - ukupni broj bodova na drugom kolokviju

**Response** - Klasifikacija studenata na temelju broja bodova na trećem kolokviju.

- **1** - ako je na trećem kolokviju ukupni broj bodova unutar intervala [0,5]
- **2** - ako je na trećem kolokviju ukupni broj bodova unutar intervala (5,10]
- **3** - ako je na trećem kolokviju ukupni broj bodova unutar intervala (10,15]
- **4** - ako je na trećem kolokviju ukupni broj bodova unutar intervala (15,20]

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3,4}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

## Column 2

### Važnost prediktora

```{r}
KOL3_4klase_KOL12_fit %>% extract_fit_parsnip() %>% vip()
```

# 4. model - hiperparametri {data-navmenu="KOLOKVIJ 3"}

## Column 1

### Testirani hiperparametri

```{r}
KOL3_4klase_KOL12_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3,) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### 200 najboljih modela za roc_auc metriku

```{r}
print(KOL3_4klase_KOL12_tuning %>% show_best(metric = 'roc_auc', n = 200), n = 200)
```

### 200 najboljih modela za mcc metriku

```{r}
print(KOL3_4klase_KOL12_tuning %>% show_best(metric = 'mcc', n = 200), n = 200)
```

# 4. model - efikasnost {data-navmenu="KOLOKVIJ 3"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL3_4klase_KOL12_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab2 <- KOL3_4klase_KOL12_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1:.pred_4)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL3_4klase_KOL12_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL3_4klase_KOL12_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```

### Gain curve

```{r}
KOL3_4klase_KOL12_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1:.pred_4) %>% autoplot()
```

# Opis modifikacije {data-navmenu="KOL3 modifikacije modela 1"}

## Column 1

### Modifikacija prvog modela za treći kolokvij

**Prediktori**

- KVIZ - suma svih bodova na kvizovima između drugog i trećeg kolokvija
- DZ - suma bodova na domaćim zadaćama između drugog i trećeg kolokvija
- VIDEO - ukupni broj klikova na video materijale između drugog i trećeg kolokvija
- MATERIJALI - ukupni broj klikova na PDF materijale između drugog i trećeg kolokvija
- DOLASCI - ukupni broj dolazaka na predavanja između drugog i trećeg kolokvija

**Response** - binarna klasifikacija studenata na temelju broja bodova na trećem kolokviju.

- **1** (pozitivna klasa): ako je na trećem kolokviju ukupni broj bodova veći ili jednak od 10
- **0** (negativna klasa): ako je na trećem kolokviju ukupni broj bodova strogo manji od 10

**Modifikacija** - pokušala se povećati efikasnost modela na pozitivnoj klasi koristeći nekoliko
algoritama

- preko dodjeljivanja težina klasama
  - *težine 1:* klasa **1** ima 7 puta veću težinu od klase **0** jer otprilike ima toliko puta manje elemenata
  - *težine 2:* klasa **1** ima 14 puta veću težinu od klase **0**
- SMOTE algoritam
- ROSE algoritam

**Literatura**
<ul>
<li><a href="imbalanced_classes.pdf" target="_blank">Opčeniti opisi</a></li>
<li><a href="step_rose.pdf" target="_blank">ROSE</a></li>
<li><a href="step_smote.pdf" target="_blank">SMOTE</a></li>
<li><a href="forest_unbalanced_class.pdf" target="_blank">Weighted random forest</a></li>
</ul>

**Hiperparametri** - za odabir optimalne kombinacije hiperparametara napravljen je 
cross-validation s 10 *kutija* pri čemu je na slučajni način isprobano 1000 kombinacija 
hiperparametara *mtry*, *min_n* i *trees*. Najbolji model je odabran s obzirom na *roc_auc*
metriku.

- *mtry* - uzimane su vrijednosti iz skupa {2,3}
- *trees* - uzimani su prirodni brojevi između 400 i 1500.
- *min_n* - uzimani su prirodni brojevi između 2 i 40.

# Težine 1 - efikasnost {data-navmenu="KOL3 modifikacije modela 1"}

## Column 1

### Metrike na testnom i trening skupu,  (klasa 0) : (klasa 1) = 1 : 7  {data-height=200}

```{r}
tab1 <- KOL3_2klase_tezine1_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab2 <- KOL3_2klase_tezine1_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL3_2klase_tezine1_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL3_2klase_tezine1_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1) %>% autoplot()
```

### Gain curve

```{r}
KOL3_2klase_tezine1_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1) %>% autoplot()
```

# Težine 2 - efikasnost {data-navmenu="KOL3 modifikacije modela 1"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL3_2klase_tezine2_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab2 <- KOL3_2klase_tezine2_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL3_2klase_tezine2_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL3_2klase_tezine2_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1) %>% autoplot()
```

### Gain curve

```{r}
KOL3_2klase_tezine2_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1) %>% autoplot()
```

# SMOTE - efikasnost {data-navmenu="KOL3 modifikacije modela 1"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL3_2klase_smote_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab2 <- KOL3_2klase_smote_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL3_2klase_smote_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL3_2klase_smote_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1) %>% autoplot()
```

### Gain curve

```{r}
KOL3_2klase_smote_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1) %>% autoplot()
```

# ROSE - efikasnost {data-navmenu="KOL3 modifikacije modela 1"}

## Column 1

###  Metrike na testnom i trening skupu {data-height=200}

```{r}
tab1 <- KOL3_2klase_rose_fit %>% collect_predictions() %>% 
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab2 <- KOL3_2klase_rose_work %>%
  rf_metrike(truth = klasa, estimate = .pred_class, .pred_1)
tab1 %>% inner_join(tab2, by = ".metric") %>%
  select(.metric, .estimator = .estimator.x, trening = .estimate.y, test = .estimate.x)
```

### Confusion matrix

```{r}
KOL3_2klase_rose_fit %>% collect_predictions() %>%
  conf_mat(truth = klasa, estimate = .pred_class) %>% autoplot("heatmap") +
  scale_fill_gradient(low = "#87DEE7",
                       high = "#FFFFCC")
```

## Column 2

### ROC curve

```{r}
KOL3_2klase_rose_fit %>% collect_predictions() %>% roc_curve(klasa, .pred_1) %>% autoplot()
```

### Gain curve

```{r}
KOL3_2klase_rose_fit %>% collect_predictions() %>% gain_curve(klasa, .pred_1) %>% autoplot()
```

# Važnost varijabli {data-navmenu="KOL3 modifikacije modela 1"}

## Column 1

### težine 1

```{r}
KOL3_2klase_tezine1_fit %>% extract_fit_parsnip() %>% vip()
```

### težine 2

```{r}
KOL3_2klase_tezine2_fit %>% extract_fit_parsnip() %>% vip()
```

## Column 2

### ROSE

```{r}
KOL3_2klase_rose_fit %>% extract_fit_parsnip() %>% vip()
```

### SMOTE

```{r}
KOL3_2klase_smote_fit %>% extract_fit_parsnip() %>% vip()
```

# Hiperparametri {data-navmenu="KOL3 modifikacije modela 1"}

## Column 1

### težine 1

```{r}
KOL3_2klase_tezine1_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

### težine 2

```{r}
KOL3_2klase_tezine2_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

## Column 2

### ROSE

```{r}
KOL3_2klase_rose_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```

### SMOTE

```{r}
KOL3_2klase_smote_tuning %>%
  collect_metrics() %>%
  filter(.metric == "roc_auc", trees > 0) %>%
  pivot_longer(cols = mtry:min_n) %>%
  mutate(best_mod = mean == max(mean)) %>% 
  ggplot(aes(x = value, y = mean)) +
  #geom_line(alpha = 0.5, size = 1.5) +
  geom_point(aes(color = best_mod), size = 0.3) +
  facet_wrap(~name, scales = "free_x") +
  scale_x_continuous() +
  labs(y = "roc auc", x = "", color = "Best Model")
```
