---
title: "wisc_bc_data - kNN with CV"
author: "Prof. Eric A. Suess"
date: "2/26/2025"
format: 
  html:
    embed-resources: true
---


```{r}
library(tidyverse)
library(tidymodels)
library(naniar)
```

```{r}
wbcd <- read_csv("wisc_bc_data.csv")
wbcd <- wbcd |> select(-id) |> 
  mutate(diagnosis = as_factor(diagnosis))
wbcd
```

```{r}
wbcd |> filter(is_na(diagnosis))
```


```{r}
wbcd_split <- initial_split(wbcd, prop = 0.8)
wbcd_split

wbcd_train <- training(wbcd_split)
head(wbcd_train)

wbcd_test <- testing(wbcd_split)
head(wbcd_test)
```

```{r}
wbcd |> count(diagnosis) |> 
  mutate(prop = n/sum(n))

wbcd_train |> count(diagnosis) |> 
  mutate(prop = n/sum(n))

wbcd_test |> count(diagnosis) |> 
  mutate(prop = n/sum(n))
```

```{r}
wbcd_rec <-
  recipe(diagnosis ~ ., data = wbcd_train) |>
  step_normalize(all_predictors()) 

wbcd_rec
summary(wbcd_rec)
```

```{r}
knn_model <- 
  nearest_neighbor(neighbors = 9) |>
  set_engine("kknn") |> 
  set_mode("classification")
```

```{r}
knn_fit <- knn_model |> fit(diagnosis ~., wbcd_train)

knn_fit
```

```{r}
knn_training_pred <-
  predict(knn_fit, wbcd_train) |> 
  bind_cols(predict(knn_fit, wbcd_train, type = "prob")) |> 
  # Add the true outcome data back in
  bind_cols(wbcd_train |> 
              select(diagnosis))
```

```{r}
knn_training_pred |>                # training set predictions
  accuracy(truth = diagnosis, .pred_class)

knn_training_pred |> # training set predictions
  roc_auc(truth = diagnosis, .pred_B)

knn_training_pred |>
  conf_mat(truth = diagnosis, estimate = .pred_class)
```

```{r}
knn_test_pred <-
  predict(knn_fit, wbcd_test) |> 
  bind_cols(predict(knn_fit, wbcd_test, type = "prob")) |> 
  # Add the true outcome data back in
  bind_cols(wbcd_test |> 
              select(diagnosis))
```


```{r}
knn_test_pred |>                # training set predictions
  accuracy(truth = diagnosis, .pred_class)

knn_test_pred |> # training set predictions
  roc_auc(truth = diagnosis, .pred_B)

knn_test_pred |>
  conf_mat(truth = diagnosis, estimate = .pred_class)
```


```{r}
wbcd_wflow <-
  workflow() |>
  add_recipe(wbcd_rec) |>
  add_model(knn_model)

wbcd_wflow
```

```{r}
knn_fit <- wbcd_wflow |>
  last_fit(wbcd_split)
```

```{r}
knn_fit |>
  collect_predictions() |>
  conf_mat(truth = diagnosis, estimate = .pred_class)
```

```{r}
knn_fit |>
  collect_metrics()
```

# Using Cross Validation

```{r}
folds <- vfold_cv(wbcd_train, v = 10)
folds
```

```{r}
wbcd_fit_rs <- 
  wbcd_wflow |> 
  fit_resamples(folds)
```

```{r}
collect_metrics(wbcd_fit_rs)
```


