Pengantar Data Sains

Classification (Assignment 3)


Kontak : \(\downarrow\)
Email
Instagram https://www.instagram.com/arifin.alicia/
RPubs https://rpubs.com/aliciaarifin/

Biodata

Nama : Alicia Arifin

Prodi : Statistika Bisnis

NIM : 20214920001

Classification 1

Classification 1 : training & predicting

Overview

Di chapter ini kita akan belajar dasar dari klasifikasi, cara menyiapkan data sebelum di klasifikasi agar bisa digunakan dalam pengklasifikasian.

The classification problem

dalam berbagai macam situasi, kita ingin membuat keputusan berdasarkan situasi saat ini dan pengalaman masa lalu.

Contohnya : - For instance, a doctor may want to diagnose a patient as either diseased or healthy based on their symptoms and the doctor’s past experience with patients. - Pasien datang ke dokter dengan gejala batuk, pusing, dan muntah. Seorang dokter pertamanya pasti akan berpikir itu merupakan pasien covid-19. Gejala tersebut mirip dengan pasien-pasien covid-19, karena itu pasien tersebut di PCR dan hasilnya positif. Dokter tersebut harus memutuskan apa yang akan dilakukan.

Hal yang dilakukan diatas termasuk contoh dari klassifikasi. i.e, memprediksi kelas kategori (biasa disebut label) berdasarkan variabel (bisa juga dibilang fitur) yang diberikan.

Observasi yag diketahui kelas yang digunakan dalam memprediksi disebut training set.

Banyak metode yang bisa digunakan untuk memprediksi kelas kategori untuk observasi. di chapter ini, kita akan fokus menggunakan algoritma “K-nearest neighbours”. In your future studies, you might encounter decision trees, support vector machines (SVMs), logistic regression, neural networks, and more; see the additional resources section at the end of the next chapter for where to begin learning more about these other methods.

there are many variations on basic classificarion problem. for example we set a binary classifiacation or multi classification.

Exploring a data set

In this chapter, we will study a data set of digitalized breast cancer image features, created by Dr. Willian H. Wolberg, W. Nick Street, and Olvi L. Mangasarian.

Loading the cancer data

kita akan menggunakan library tidyverse

library(tidyverse)

setwd(getwd())
cancer <- read.csv("wdbc.csv")
cancer

Decribing the variables in the cancer data set

Tumor kanker payudara bisa didiagnosa menggunakan biosy (oengambilan suatu jaringan dari badan yang di teliti untuk mengetahui keberadaan penyakit). Tumor tersebut dilihat dan diukur dari gambar digital hasil biopsy. 10 variabel yang berbeda diukur per satu nukleus (kolom ke 3-12).

sebagai bagian data preparation, yang data dibawah ini sudah di standarisasi (centered dan scaled).

Total set variabel per gambar : 1. ID : identificaion number 2. Class : diagnosis (M = malignant/ganas, B = benign/jinak) 3. Radius : rata-rata jarak dari titik tengah ke poin di parameter. 4. Texture : standar deviasi nilai grey-scale. 5. Perimeter : jarak kontur sekitar. 6. Area : Area di dalam kontur. 7. Smoothness : variasi local dalam jarak radius. 8. Compactness : rasio dari perimeter kuadrat dan area. 9. Concavity : tingkat keparahan bagian kontur cekung. 10. Concave Points : jumlah bagian cekung dari kontur 11. Symmertry : seberapa miripnya nukleus ketika dicerminkan 12. Fractal DImension : pengukuran seberapa “kasar” perimeter.

dibawah ini kita menggunakan glipse untuk melihat preview dataframe. fungsi ini dapat memudahkan melihat data, nanti munculnya kolomnya menjadi baris.

glimpse(cancer)
## Rows: 569
## Columns: 12
## $ ID                <int> 842302, 842517, 84300903, 84348301, 84358402, 843786~
## $ Class             <chr> "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M~
## $ Radius            <dbl> 1.0960995, 1.8282120, 1.5784992, -0.7682333, 1.74875~
## $ Texture           <dbl> -2.0715123, -0.3533215, 0.4557859, 0.2535091, -1.150~
## $ Perimeter         <dbl> 1.26881726, 1.68447255, 1.56512598, -0.59216612, 1.7~
## $ Area              <dbl> 0.98350952, 1.90703027, 1.55751319, -0.76379174, 1.8~
## $ Smoothness        <dbl> 1.56708746, -0.82623545, 0.94138212, 3.28066684, 0.2~
## $ Compactness       <dbl> 3.28062806, -0.48664348, 1.05199990, 3.39991742, 0.5~
## $ Concavity         <dbl> 2.65054179, -0.02382489, 1.36227979, 1.91421287, 1.3~
## $ Concave_Points    <dbl> 2.53024886, 0.54766227, 2.03543978, 1.45043113, 1.42~
## $ Symmetry          <dbl> 2.215565542, 0.001391139, 0.938858720, 2.864862154, ~
## $ Fractal_Dimension <dbl> 2.25376381, -0.86788881, -0.39765801, 4.90660199, -0~

Dari data di atas dapat disuimpulkan Class merupakan character (<chr>). Karena kita akan menggunakan Class~ sebagai variabel kategorical statistik, kita akan mengubah itu menjadi factoe menggunakan fungsias_factor`.

cancer <- cancer |>
  mutate(Class = as_factor(Class))
glimpse(cancer)
## Rows: 569
## Columns: 12
## $ ID                <int> 842302, 842517, 84300903, 84348301, 84358402, 843786~
## $ Class             <fct> M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M~
## $ Radius            <dbl> 1.0960995, 1.8282120, 1.5784992, -0.7682333, 1.74875~
## $ Texture           <dbl> -2.0715123, -0.3533215, 0.4557859, 0.2535091, -1.150~
## $ Perimeter         <dbl> 1.26881726, 1.68447255, 1.56512598, -0.59216612, 1.7~
## $ Area              <dbl> 0.98350952, 1.90703027, 1.55751319, -0.76379174, 1.8~
## $ Smoothness        <dbl> 1.56708746, -0.82623545, 0.94138212, 3.28066684, 0.2~
## $ Compactness       <dbl> 3.28062806, -0.48664348, 1.05199990, 3.39991742, 0.5~
## $ Concavity         <dbl> 2.65054179, -0.02382489, 1.36227979, 1.91421287, 1.3~
## $ Concave_Points    <dbl> 2.53024886, 0.54766227, 2.03543978, 1.45043113, 1.42~
## $ Symmetry          <dbl> 2.215565542, 0.001391139, 0.938858720, 2.864862154, ~
## $ Fractal_Dimension <dbl> 2.25376381, -0.86788881, -0.39765801, 4.90660199, -0~

Perlu diingat kalau factor bisa dinamakan “levels,” yang bisa kita sebut sebagai kategori. kita bisa memastikan levelnya kolom Class menggunakan fungsi levels. Fungsi ini harusnya mengeluarkan nama kategori dalam kolom tersebut. Karena di kolom tersebut hanya memiliki 2 kategori, kita hanya berekspektasi muncul 2 kategori.

Note levels bisa dipakai kalau kolom merupakan vektor. jadi kita menggunakan pull untuk mengekstrak satu kolom (Class) dan di levels untuk melihat berapa banyak kategori yang ada.

cancer |>
  pull(Class) |>
  levels()
## [1] "M" "B"

Exploring the cancer data

Sebelum kita melakukan modeling mari eksplore data set. dibawah ini kita akna menggunakan group_by, summarize, dan n untuk menemukan banyaknya data dan berapa persen tumor ganas dan jinak. Jika menggabungkan n dan summarize dengan group_by, kita bisa mendapatkan persentase. kita punya 357 (63%) tumor jinak, dan 212 (37%) tumor ganas.

num_obs <- nrow(cancer)
cancer |>
  group_by(Class) |>
  summarize(
    count = n(),
    percentage = n() / num_obs * 100
  )

Selanjutnya, kita akan membuat visualisasi hubungan natara variabel perimeter dan concavity. daripada kita menggunakan ggplot defult template, kita akan memilih warna yang bisa dibedakan oleh orang yang buta warna.

perim_concav <- cancer |>
  ggplot(aes(x = Perimeter, y = Concavity, color = Class)) +
  geom_point(alpha = 0.6) +
  labs(x = "Perimeter (standardized)", 
       y = "Concavity (standardized)",
       color = "Diagnosis") +
  scale_color_manual(labels = c("Malignant", "Benign"), 
                     values = c("orange2", "steelblue2")) +
  theme(text = element_text(size = 12))
perim_concav

Figure 5.1 : Scatter plot concavity vs perimeter yang dibedakan dengan warna menggunakan diagnosis label.

Di figure 5.1, kita bisa lihat kalau observasi yg ganas biasanya ada di area kanan atas. Secara tidak langsung yang jinak berada di kiri bawah. Dengan kata lain, observasi jinak biasanya mempunyai concavity dan perimeter yang kecil, dan observasi ganas biasanya mempunyai concavity dan perimeter yang besar.

Misalkan kita mendapatkan pengamatan baru tidak dalam kumpulan data saat ini yang memiliki semua variabel yang diukur kecuali label. kita bisa mengkomputasi nilai standar perimeter dan concavity, yang hasilnya misalkan 1 banding 1. Apakah kita bisa menggunakan informasi tersebut untuk mengklasifikasikan jinak / ganas?

Jika nilai standar concavity dan perimeter satu banding 1, mungkin poin yang ada di tengah" awan orange (ganas) dan sepertinya kita bisa mengklasifikasikan itu sebagai ganas. Berdasarkan dari visualisasi kita, sepertinya prediksi berdasarkan label yang belum diketahui bisa dilakukan.

Classification with K-nearest neighbours

Klasifikasi algoritma K-nearest neighbours ini bisa memprediksi label observasi yang tidak diketahui. K-nearest ini mengklasifikasikan dengan cara mencari titik terdekat antara titik yang satu dengan yang lainnya pada traing set, dan menggunakan observasi mereka untuk membuat prediksi kepada observasi baru.

/K/ adalah angka yang kita pilih, untuk sekarang misalkan seseorang telah memilihkan /K/ untuk kita. Nanti kita akan belajar cara mengetahui berapa nilai K di chapter berikutnya.

untuk mengilustrasikan konsep K-nearest neighbour, kita akan menggunakan contoh. Contohnya kita mempunyai observasi baru, dengan standar yg sudah ada, perimeternya 2, dan concavitynya 4 yang tidak diketahui kelasnya (“Class”) apa. observasi baru ini diwarnai merah sebagai unknown/ new object di figure 5.2.

Figure 5.2 Figure 5.2 : scatter plot dari concavity vs perimeter dengan observasi baru yang diwarnai merah.

Figure 5.3 menujukkan titik terdekat dengan new observation adalah /ganas/ dan terletak di kordinat (2.1 , 3.6). konsep /K/-nearest ini itu dengan mencari jarak dari titik terdekat lalu kita bisa berekspektasi mereka mempunyai diagnosis yang sama.

Figure 5.3

Figure 5.3 : scatter plot dengan cara K-nearest neighbour yang memiliki label ganas.

Contohnya kita punay observasi baru dengan parameter 0,2 dan concavity 3,3. dilihat dari scatter plot 5.4 bagaimana cara kita mengklasifikasikannya? titik yang paling dekat yang merupakan jinak ada di (0.2 , 2.7). Apakah ini dinilai sebagai observasi yang tepat? Mungkin tidak, kalau Anda menganggap titik terdekat yang lainnya.

Figure 5.4 Figure 5.4

Untuk meningkatkan prediksi kita bisa mempertimbangkan beberapa neibouring points, misalnya /K/ = 3. dari 3 titik yang terdekat kita menggunakan jumlah yang terbanyak atau majority class untuk prediksi new observation. Contohnya di figure 5.5, 2 dari 3 nearest neighbour adalah ganas. Jadi bisa disimpulkan kita mengambil keputusan berdasarkan suara terbanyak dan mengklasifikasikan observasi baru kita menjadi ganas.

Foto 5.5 Figure 5.5

Di atas kita mmilih /K/ = 3 nearest observations, tetapi tidak ada special tentang /K/ = 3. Kita bisa menggunakan /K/ = 4,5 atau lebih. kita akan membahas K di chapter berikutnya,

Distance between points

cara mencari jarak K “nearest” dengan garis lurus. contoh jika ada 2 titik. dari a(x,y) ke b(x,y). Maka kita bisa mencari jaraknya dengan menggunakan pitagoras.

Foto jarak1 Figure Distance

K observasi itu mengambil /K/ dengan nilai yang paling kecil.

Contoh lain : K = 5, ada objek baru dengan perimeter 0 dan concavity 3.5, yang berwarna merah. kita akan menghitung menggunakan mutate, dan melihat bagaimana cara mengkomputasikannya.

Foto 5.6 Figure 5.6

new_obs_Perimeter <- 0
new_obs_Concavity <- 3.5
cancer |>
  select(ID, Perimeter, Concavity, Class) |>
  mutate(dist_from_new = sqrt((Perimeter - new_obs_Perimeter)^2 + 
                              (Concavity - new_obs_Concavity)^2)) |>
  arrange(dist_from_new) |>
  slice(1:5) # take the first 5 rows

pada tabel 5.1 kita bisa melihat cara menghitung menggunakan mutate untuk mengkomputasi variabel dist_from_new untuk 5 titk terdekat.

tabel5.1 Tabel 5.2

hasilnya 3 dari 5 merupakan tumor ganas. karena mayoritas, kita mengklasifikasikan objek baru kita sebagai ganas. 5 neighbour akan dilingkari pada figure 5.7

Foto5.7 Figure 5.7

More than two explanotary variables

Algoritma K-nearest neighbour ini juga bisa digunakan ketika kita memiliki lebih dari 2 variabel prediktor. Ketika titik a (x,y,…,n) dan b(x,y,…,n). Jaraknya menjadi :

Figure jarak2

Formula ini mirip seperti garis lurus antar titik, tetapi lebih dari 2 dimensi.

Example : new observation with a perimeter of 0, concavity of 3.5, and symmetry of 1, and another observation with a perimeter, concavity, and symmetry of 0.417, 2.31, and 0.837 respectively. We have two observations with three predictor variables: perimeter, concavity, and symmetry.

Cara mencari jaraknya :

Jarak 2.1

Mari menghitung objek baru kita dengan data training set untuk mencari K= 5 ketika kita memiliki 3 prediktor.

new_obs_Perimeter <- 0
new_obs_Concavity <- 3.5
new_obs_Symmetry <- 1

cancer |>
  select(ID, Perimeter, Concavity, Symmetry, Class) |>
  mutate(dist_from_new = sqrt((Perimeter - new_obs_Perimeter)^2 + 
                              (Concavity - new_obs_Concavity)^2 +
                                (Symmetry - new_obs_Symmetry)^2)) |>
  arrange(dist_from_new) |>
  slice(1:5) # take the first 5 rows

dengan K = 5 dan 3 prediktor, kita bisa mengklasifikasikan objek baru ini sebagai ganas (4.5 merupakan ganas).

Figure 5.8 menunjukkan datanya seperti apa ketika divisualisasikan 3 dimensi scatter line dari objek baru ke 5 nearest neighbours.

Figure newplot

Figure 5.8: 3D scatter plot of the standardized symmetry, concavity, and perimeter variables. Note that in general we recommend against using 3D visualizations; here we show the data in 3D only to illustrate what higher dimensions and nearest neighbors look like, for learning purposes.

Summary of /K/-nearest neighbours algorithm

In order to classify a new observation using a
K-nearest neighbor classifier, we have to do the following:

  1. Compute the distance between the new observation and each observation in the training set.
  2. Sort the data table in ascending order according to the distances.
  3. Choose the top K rows of the sorted table.
  4. Classify the new observation based on a majority vote of the neighbor classes.

K-nearest neighbours with /tidymodels/

library(tidymodels)

Mari kita melihat cara menggunakan tinymodels untuk knn. Contoh :We will use the cancer data set from above, with perimeter and concavity as predictors and K=5 neighbors to build our classifier. Then we will use the classifier to predict the diagnosis label for a new observation with perimeter 0, concavity 3.5, and an unknown diagnosis label

Mari kita select data cancer menjadi class, perimeter dan concavity

cancer_train <- cancer |>
  select(Class, Perimeter, Concavity)
cancer_train

selanjutnya kita membuat model specification untuk knn dengan menggunakan fungsi nearest_neighbour, kita akan pakai K = 5 dan jarak garis lurus (weight_func = "rectangular). weight_func = "rectangular ini mengontrol bagaimana neighbour emolih ketika mengklasifikasikan objek baru dengan setting "rectangular". Cara men-weigh satu per satu neighbour’s vote secara berbeda bisa dilihat di tje parsnip website.

Pada set_engine, kita lebih spesifik package apa yang akan kita pakai untuk training model. Disini kkn adalah package R yang akan kita gunakan untuk mengklasifikasikan kkn. Akhirnya kita bisa menentukana masalah klasifikasi ini dengan set_mode.

knn_spec <- nearest_neighbor(weight_func = "rectangular", neighbors = 5) |>
  set_engine("kknn") |>
  set_mode("classification")
knn_spec
## K-Nearest Neighbor Model Specification (classification)
## 
## Main Arguments:
##   neighbors = 5
##   weight_func = rectangular
## 
## Computational engine: kknn

Agar modelnya bisa digunakan di data kanker , kita butuh memberikan model specification dan data set ke fit function. Kita juga butuh menentukan variabel apa yang akan digunakan sebagi prediktor dan sebagai target.

Di bawah ini Class ~ Perimeter +Concavity menentukan Class sebagai target (yg akan kita prediksi), dan Perimeter dan Concavity adalah prediktornya.

knn_fit <- knn_spec |>
  fit(Class ~ Perimeter + Concavity, data = cancer_train)

Kita juga bisa melakukan hal diatas dengan cara yang pendek, dengan mengganti Class ~.. . mengartikan semua nya kecuali yang di depan ~. Jika kita menggunakan short cut ini, dalam data set ini hasilnya akan sama dengan yg di atas.

  1. . sebagai semuanya
  2. + sebagai penambah (memilih kolom yg mana saja yang akan di gunakan)
knn_fit <- knn_spec |>
  fit(Class ~ ., data = cancer_train)
knn_fit
## parsnip model object
## 
## Fit time:  20ms 
## 
## Call:
## kknn::train.kknn(formula = Class ~ ., data = data, ks = min_rows(5,     data, 5), kernel = ~"rectangular")
## 
## Type of response variable: nominal
## Minimal misclassification: 0.07557118
## Best kernel: rectangular
## Best k: 5

Jadi Anda bisa melihat hasil kesimpulan trained model. Dari kesimpulan di atas confirm bahwa computational engine yang digunakan adalah kkn:train.kkn. itu juga menunjukkan fraksi error yang dibuar oleh model nearest neighbour, tetapi kita akan mengabaikan ini untuk sekarang dan membahas ini di chapter berikutnya. Jadi dungsi weight “yg terbaik” adalah “rectangular” dan setting K yg “terbaik” adalah 5.

Kita akan mempresiksi objek observasi baru dengan mengunakan predict . dengan coding yang di atas, ketika kita akan mencari kkn algorithm secara manual, kkn_fit objek mengklasifikasikan observasi baru sebagai Ganas (“M”).

Note: + output dari predict adalah dataframe dengan satu variable bernama pred_class.

new_obs <- tibble(Perimeter = 0, Concavity = 3.5)
predict(knn_fit, new_obs)

Apakah prediksi label ganas benar untuk observasi ini?? yaa, kita belum tahu karena kita tidak mempunyai observasi diagnosis. ini yang kita coba prediksi.

Data preprocessing with tidymodels

Centering and scaling

Untuk centering dan scaling data, kita perlu menemukan mean variabel dan standar deviasi. Untuk setiap nilai variabel yang diamati, kita kurangi mean dan bagi dengan standar deviasi. Ketika kita melakukan ini, data dikatakan terstandarisasi, dan semua variabel dalam kumpulan data akan memiliki rata-rata 0 dan simpangan baku 1.

Untuk mengilustrasikan pengaruh standarisasi terhadap algoritma knn, skearang kita akan membaca dalam kumpulan data kanker payudara Wisconsin yang asli dan tidak standar; kami telah menggunakan versi standar dari pengaturan data sampai sekarang. Untuk mempermudah, kita hanya akan menggunakan variabel Area, Smoothness, dan Class:

unscaled_cancer <- read_csv("unscaled_wdbc.csv") |>
  mutate(Class = as_factor(Class)) |>
  select(Class, Area, Smoothness)
unscaled_cancer

ketika melihat data yang belum di standarisasi seperti data di atas, kita bisa melihat perbedaan antara nilai untuk pengukuran area lebih besar daripada smoothness. Apakah akan mempengaruhi? nanti akan kita lihat. untuk mencari tahu, kita akan membuat scatter plot dari kedua prediktor (warna sesuai diagnosis) untuk kedua data yang belum distandarisasi, dan sesudah.

Pertamanya kita akan menstandarisasi unscaled_cancer data set dengan tidymodels. dalam tidymodels, semua preprosessing terjadi menggunakan recipe dari recipes package R. Kita akan menginisialisasi resep untuk data unscaled_cancer di atas, yg menentukan Class sebagai target, dan variabel lain adalah prediktor.

uc_recipe <- recipe(Class ~ ., data = unscaled_cancer)
print(uc_recipe)
## Recipe
## 
## Inputs:
## 
##       role #variables
##    outcome          1
##  predictor          2

Sejauh ini, tidak ada di recipe, hanya pernyataan tentang berapa banyak target dan prediktor. Mari kita tambahkan scaling (step_scale) dan centering (step_center) untuk semua prediktor sehingga semuanya memiliki rata-rata 0 dan sd 1.

tidyverse juga menyediakan step_normalize, yang melakukan scaling dan centering dalam satu recipe.

prep function ini untuk menyelesaikan recipe dengan menggunakan data untuk mengkomputasi semuanya untuk manjalankan recipe(sd dan mean).

uc_recipe <- uc_recipe |>
  step_scale(all_predictors()) |>
  step_center(all_predictors()) |>
  prep()
uc_recipe
## Recipe
## 
## Inputs:
## 
##       role #variables
##    outcome          1
##  predictor          2
## 
## Training data contained 569 data points and no missing data.
## 
## Operations:
## 
## Scaling for Area, Smoothness [trained]
## Centering for Area, Smoothness [trained]

Note : Ketika kita menambah step recipe, Anda harus menentukan kolom mana yang akan diaplikasikan. DI sini kita menggunakan all_predictors() untuk menentukan semua step harus diaplikasikan ke semua variabel prediktor.

Bahasa inggis : However, there are a number of different arguments one could use here, as well as naming particular columns with the same syntax as the select function. For example:

  • all_nominal() and all_numeric(): specify all categorical or all numeric variables
  • all_predictors() and all_outcomes(): specify all predictor or all target variables
  • Area, Smoothness: specify both the Area and Smoothness variable
  • -Class: specify everything except the Class variable

Anda bisa mencari full set dari semua step dan pemilihan variabel di recipe reference page.

Sekarang kita punya kalkulasi yang membutuhkan stattistika yang berdasar dari data input ke recipe, tetapi datanya belum di scaled dan centered. untuk benar-benar scale dan center data, kita perlu apply bake function ke data yg belum di scaled.

scaled_cancer <- bake(uc_recipe, unscaled_cancer)
scaled_cancer

Kita melakukan bake dan prep untuk scale dan center data melakukan step ini seperti step yang berlebih. Tetapi kita melakukan dua step ini agar kita bisa menentukan perbedaan data set pada bake step kalau kita mau.

Sebenarnya kita melakukan semua hal ini hanya untuk scaling dan center variabel. kita melakukan semua ini untuk menghindari error-prone. yang dimana kira bisa secara tidak sadar lupa men-apply centering / scaling yang sama ketika membuat prediksi, atau sengaja mengapply centering / scaling yang berbeda. Cara menggunakan recipe yang sebenarnya itu untuk membuat coding menjadi simple, bisa dibacam dan tidak ada error.

menggunakan prep dan bake itu diperlukan hanyak ketika anda ingin mengecek hasil dari preprosessing steps. (inggris) You will see further on in Section 5.8 that tidymodels provides tools to automatically apply prep and bake as necessary without additional coding effort.

Figure 5.9 menunjukkan dua perbandingan scatterplot dari unscaled_cancer dan scaled_cancer. dua-duanya sama-sama memiliki K=3.

Jika dibandingkan antara scaled dan unscaled data, terbdapat banyak perbedaan. Standarisasi data dapat mengubah banyak hal dengan cara yang penting ketika kita menggunakan algoritma prediktif. Menstandarisasi data Anda harus menjadi bagian dari prapemrosesan yang Anda lakukan sebelum pemodelan prediktif dan Anda harus selalu berpikir hati-hati tentang domain masalah Anda dan apakah Anda perlu menstandarisasi data Anda.

Figure 5.9 Figure 5.9 : Comparison of K = 3 nearest neighbors with standardized and unstandardized data.

Figure 5.10 Figure 5.10 : Close-up of three nearest neighbors for unstandardized data

Balancing

Balancing ini diperlukan ketika jumlah datanya tidak seinmbang dalam suatu kelas. Jadi jumlah yang sangat sedikit bisa salah observasi. contohnya ada 50 tumor jinak, dan hanya 3 tumor ganas. kalau dilihat ketiga tumor ganas tersebut bisa didiagnosa sebagai tumor jinak.

Contoh ilustrasi :

rare_cancer <- bind_rows(
      filter(cancer, Class == "B"),
      cancer |> filter(Class == "M") |> slice_head(n = 3)
    ) |>
    select(Class, Perimeter, Concavity)

rare_plot <- rare_cancer |>
  ggplot(aes(x = Perimeter, y = Concavity, color = Class)) +
  geom_point(alpha = 0.5) +
  labs(x = "Perimeter (standardized)", 
       y = "Concavity (standardized)",
       color = "Diagnosis") +
  scale_color_manual(labels = c("Malignant", "Benign"), 
                     values = c("orange2", "steelblue2")) +
  theme(text = element_text(size = 12))

rare_plot

Figure 5.11: Imbalanced data.

Dari contoh di atas, kita bisa simpulkan kalau K=7, apapun yang terjadi pasti suatu objek baru akan didiagnosa sebagai tumo jinak karena 3 kalah dengan 4. Sebagai contoh lihat foto di bawah ini.

Figure 5.12 Figure 5.12: Imbalanced data with 7 nearest neighbors to a new observation highlighted.

FIgure 5.13 menunjukkan apapun yg terjadi pasti akan di diagnosa sebagai jinak. 5.13 juga menunjukkan apa yang terjadi jika kita mengubah warna background area prediksi yg dibuat knn pengklasifikasiian.

Figure 5.13 Figure 5.13: Imbalanced data with background color indicating the decision of the classifier and the points represent the labeled data.

Kita bisa rebalance data ini dengan over sampling the rare class. Dengan kata lain, kita akan mereplikasi rare observvation berurang kali pada data set untuk memberikan suara yang lebih banyak saat algoritma Knn. Caranya kita menggunakan oversampling step uc_recipe recipe dengan step_upsample dari themis package R. Kita akan menunjukkan bagaimana cara melakukan ini, kita juga menggunakan summarize dan group_by.

library(themis)

ups_recipe <- recipe(Class ~ ., data = rare_cancer) |>
  step_upsample(Class, over_ratio = 1, skip = FALSE) |>
  prep()

ups_recipe
## Recipe
## 
## Inputs:
## 
##       role #variables
##    outcome          1
##  predictor          2
## 
## Training data contained 360 data points and no missing data.
## 
## Operations:
## 
## Up-sampling based on Class [trained]
upsampled_cancer <- bake(ups_recipe, rare_cancer)

upsampled_cancer |>
  group_by(Class) |>
  summarize(n = n())
upsampled_cancer <- bake(ups_recipe, rare_cancer)

upsampled_cancer |>
  group_by(Class) |>
  summarize(n = n())

Sekarang kita seharusnya berlatih dengan pengklasisfikasian Knn dengan K = 7 pada balanced data. Figure 5.14 menunjukkan apa yang terjadi sekarang ketika kita membuat background setiap bagian / daerah ke K-Nearest neighbour classsifier akan buat. Kita bisa melihat keputusan lebih masuk akan, ketika poin itu berdekatan dengan label ganas, pengklasifikasiannya akan memprediksi tumor ganas.

Figure 5.14 Figure 5.14: Upsampled data with background color indicating the decision of the classifier.

Putting it together in a workflow

tidymodels juga menyertakan workflow, cara untuk mengaitkan populasi data analisis step tanpa banyak kode yang diperlukan untuk langkah-langkah perantara.

untuk mengilustrasika semuanya, kita load, bikin model, specify recipe untuk bagaimana data harusnya di preprosessed.

# load the unscaled cancer data 
# and make sure the target Class variable is a factor
unscaled_cancer <- read_csv("unscaled_wdbc.csv") |>
  mutate(Class = as_factor(Class))

# create the KNN model
knn_spec <- nearest_neighbor(weight_func = "rectangular", neighbors = 7) |>
  set_engine("kknn") |>
  set_mode("classification")

# create the centering / scaling recipe
uc_recipe <- recipe(Class ~ Area + Smoothness, data = unscaled_cancer) |>
  step_scale(all_predictors()) |>
  step_center(all_predictors())

Note, cara yang digunakan sama seperti yg sebelumnya hanya tidak menggunakan select untuk mengekstrak variabel dari dataframe. Lalu, menentukannya menggunakan Class ~ Area + Smoothness bukan Class ~ .. dan kita juga tidak memanggil prep() di recipe.

Sekarang akan menempatkan langkah-langkah ini dalam workflow menggunakan fungsi add_recipe dan add_model, dan akhirnya kita akan menggunakan fungsi fit untuk menjalankan seluruh alur kerja pada data unscaled_cancer.

Note : - kita tidak menggunakan fit pada cara sebelumnya

knn_fit <- workflow() |>
  add_recipe(uc_recipe) |>
  add_model(knn_spec) |>
  fit(data = unscaled_cancer)

knn_fit
## == Workflow [trained] ==========================================================
## Preprocessor: Recipe
## Model: nearest_neighbor()
## 
## -- Preprocessor ----------------------------------------------------------------
## 2 Recipe Steps
## 
## * step_scale()
## * step_center()
## 
## -- Model -----------------------------------------------------------------------
## 
## Call:
## kknn::train.kknn(formula = ..y ~ ., data = data, ks = min_rows(7,     data, 5), kernel = ~"rectangular")
## 
## Type of response variable: nominal
## Minimal misclassification: 0.112478
## Best kernel: rectangular
## Best k: 7

fit object list fungsi merupakan fungsi yang melatih model atau bisa dibilang setting yg “terbaik” untuk number of neighbour dan weight function.

fit object ini juga terdapat informasi tentang overall workflow (centering and scaling preprosessing step). dengan kata lain, kia mengguankan predict dengan knn_fit objek untuk membuat prediksi observasi baru.

sebagai contoh : 1. Area = 500 and Smoothness = 0.075 2. Area = 1500 and Smoothness = 0.1

new_observation <- tibble(Area = c(500, 1500), Smoothness = c(0.075, 0.1))
prediction <- predict(knn_fit, new_observation)

prediction

Pengklasifikasian akan memprediksi kalo observasi pertamaa itu jinak (B), dan yang kedua ganas (M). figure 5.15 memvisualisasikan bahwa Knn model ini dilatih akan melakukan berbagai observasi baru.

Note: Understanding this code is not required for the remainder of the textbook. It is included for those readers who would like to use similar visualizations in their own data analyses.

# create the grid of area/smoothness vals, and arrange in a data frame
are_grid <- seq(min(unscaled_cancer$Area), 
                max(unscaled_cancer$Area), 
                length.out = 100)
smo_grid <- seq(min(unscaled_cancer$Smoothness), 
                max(unscaled_cancer$Smoothness), 
                length.out = 100)
asgrid <- as_tibble(expand.grid(Area = are_grid, 
                                Smoothness = smo_grid))

# use the fit workflow to make predictions at the grid points
knnPredGrid <- predict(knn_fit, asgrid)

# bind the predictions as a new column with the grid points
prediction_table <- bind_cols(knnPredGrid, asgrid) |> 
  rename(Class = .pred_class)

# plot:
# 1. the colored scatter of the original data
# 2. the faded colored scatter for the grid points
wkflw_plot <-
  ggplot() +
  geom_point(data = unscaled_cancer, 
             mapping = aes(x = Area, 
                           y = Smoothness, 
                           color = Class), 
             alpha = 0.75) +
  geom_point(data = prediction_table, 
             mapping = aes(x = Area, 
                           y = Smoothness, 
                           color = Class), 
             alpha = 0.02, 
             size = 5) +
  labs(color = "Diagnosis", 
       x = "Area (standardized)", 
       y = "Smoothness (standardized)") +
  scale_color_manual(labels = c("Malignant", "Benign"), 
                     values = c("orange2", "steelblue2")) +
  theme(text = element_text(size = 12))

wkflw_plot

Figure 5.15: Scatter plot of smoothness versus area where background color indicates the decision of the classifier.

Referensi dari buku Pak Bakti

  • Cover, Thomas, and Peter Hart. 1967. “Nearest Neighbor Pattern Classification.” IEEE Transactions on Information Theory 13 (1): 21–27.
  • Fix, Evelyn, and Joseph Hodges. 1951. “Discriminatory Analysis. Nonparametric Discrimination: Consistency Properties.” USAF School of Aviation Medicine, Randolph Field, Texas.
  • Kuhn, Max, and David Vaughan. 2021. parsnip R package. https://parsnip.tidymodels.org/.
  • Kuhn, Max, and Hadley Wickham. 2021. recipes R package. https://recipes.tidymodels.org/.
  • Stanford Health Care. 2021. “What Is Cancer?” https://stanfordhealthcare.org/medical-conditions/cancer/cancer.html.
  • Street, William Nick, William Wolberg, and Olvi Mangasarian. 1993. “Nuclear Feature Extraction for Breast Tumor Diagnosis.” In International Symposium on Electronic Imaging: Science and Technology.