Introduction to Data Science
Tugas 2 Kelompok
| Kontak | : \(\downarrow\) |
| mailto:e7ilsaudi@gmail.com | |
| https://www.instagram.com/Jeremyheryand/ | |
| RPubs | https://rpubs.com/jeremyheriyand23/ |
Exploring a data set
Impor the Data
Pada dasarnya, ketika kita ingin mendiagnosa sesuatu tumor, dibutuhkan cara yang detail dan akurat sehingga hasilnya juga akurat. Kita tidak bisa memprediksi atau mendiagnosa sebuah tumor hanya dengan penglihatan kita saja. Pasti hasilnya tidak akurat. Maka dari itu, perlu dilakukan diagnosa tumor yang lebih akurat agar kita mengetahui tumor tersebut bersifat jinak atau justru bersifat ganas.
library(tidyverse)## Warning: package 'tidyverse' was built under R version 4.1.2
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.5 v dplyr 1.0.7
## v tidyr 1.1.4 v stringr 1.4.0
## v readr 2.0.2 v forcats 0.5.1
## Warning: package 'ggplot2' was built under R version 4.1.2
## Warning: package 'tidyr' was built under R version 4.1.2
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(tidymodels)## Warning: package 'tidymodels' was built under R version 4.1.2
## Registered S3 method overwritten by 'tune':
## method from
## required_pkgs.model_spec parsnip
## -- Attaching packages -------------------------------------- tidymodels 0.1.4 --
## v broom 0.7.11 v rsample 0.1.1
## v dials 0.1.0 v tune 0.1.6
## v infer 1.0.0 v workflows 0.2.4
## v modeldata 0.1.1 v workflowsets 0.1.0
## v parsnip 0.1.7 v yardstick 0.0.9
## v recipes 0.1.17
## Warning: package 'broom' was built under R version 4.1.2
## Warning: package 'dials' was built under R version 4.1.2
## Warning: package 'scales' was built under R version 4.1.2
## Warning: package 'infer' was built under R version 4.1.2
## Warning: package 'modeldata' was built under R version 4.1.2
## Warning: package 'parsnip' was built under R version 4.1.2
## Warning: package 'recipes' was built under R version 4.1.2
## Warning: package 'rsample' was built under R version 4.1.2
## Warning: package 'tune' was built under R version 4.1.2
## Warning: package 'workflows' was built under R version 4.1.2
## Warning: package 'workflowsets' was built under R version 4.1.2
## Warning: package 'yardstick' was built under R version 4.1.2
## -- Conflicts ----------------------------------------- tidymodels_conflicts() --
## x scales::discard() masks purrr::discard()
## x dplyr::filter() masks stats::filter()
## x recipes::fixed() masks stringr::fixed()
## x dplyr::lag() masks stats::lag()
## x yardstick::spec() masks readr::spec()
## x recipes::step() masks stats::step()
## * Dig deeper into tidy modeling with R at https://www.tmwr.org
cancer <- read_csv("wdbc.txt")## Rows: 569 Columns: 12
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): Class
## dbl (11): ID, Radius, Texture, Perimeter, Area, Smoothness, Compactness, Con...
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
cancerDescribing the variables in the cancer data set
Setelah kita mengimpor dataset yang kita inginkan, alangkah baiknya bila kita mengetahui data yang memiliki banyak kolom dengan posisi menyamping dibandingkan posisi menurun. Untuk melakukan hal ini, kita perlu menggunakan fungsi glimpse agar memudahkan kita dalam melihat dataset nya.
glimpse(cancer)## Rows: 569
## Columns: 12
## $ ID <dbl> 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~
Note: Disini terdapat beberapa kolom yang ada di dalam data. Kolom-kolom itu adalah 1. ID: Nomor Identitas
2. Class: Jenis diagnosa nya (Bersifat jinak atau ganas)
3. Radius: rata-rata jarak dari pusat ke titik-titik pada keliling
4. Texture: standar deviasi nilai skala abu-abu
5. Perimeter: panjang kontur sekitarnya
6. Area: area di dalam kontur
7. Smoothness: variasi lokal dalam panjang radius
8. Compactness: rasio keliling kuadrat dan luas
9. Concavity: Kecekungannya
10. Concave_points: jumlah bagian cekung dari kontur
11. Symmetry: seberapa mirip inti ketika dicerminkan
12. Fractal_Dimension: menunjukkan seberapa kasar kelilingnya
Dari data di atas kita bisa melihat bahwa kolom Class merupakan bentuk character. Karena dalam kondisi ini kolom Class merupakan kolom dari jenis yang mewakili data, maka dari itu kita perlu mengubah menjadi factor dengan fungsi as_factor.
cancer <- cancer |>
mutate(Class = as_factor(Class))
glimpse(cancer)## Rows: 569
## Columns: 12
## $ ID <dbl> 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~
Untuk melihat kategori yang ada di dalam kolom Class, kita perlu menggunakan fungsi pull untuk mengesktrak 1 kolom lalu fungsi levels untuk melihat kategori apa saja yang ada di dalam kolom itu. Dan seperti yang kita lihat, terdapat kategori M dan B dalam kolom Class.
cancer |>
pull(Class) |>
levels()## [1] "M" "B"
Exploring the cancer data
Kita juga perlu untuk mengetahui frekuensi dari tiap kolom Class agar kita mengetahui data menunjukkan berapa jumlah tumor ganas dan berapa jumlah tumor jinak nya. Dalam hal ini kita menggunakan fungsi group_by.Setelah itu, kita juga perlu mengetahui presentase setiap jenis tumor nya, disini kita bisa kalkulasikan dengan menggunakan count yang dimana kita akan membagi frekuensi jenis tumor dengan kolom yang dikali dengan 100.
num_obs <- nrow(cancer)
cancer |>
group_by(Class) |>
summarize(
count = n(),
percentage = n() / num_obs * 100
)
Langkah selanjutnya, kita sudah bisa memulai untuk membuat grafik scatterplot nya. Dimana kita memplot variabel Perimeter dan Concavity.
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 Seperti pada grafik di atas, dapat disimpulkan bahwa sebaran bawah kiri menunjukkan sebaran jenis tumor jinak atau Benign yang memiliki nilai kecekungan dan keliling yang rendah. Sedangkan jika kita perhatikan pada sebaran kanan atas, sebaran tersebut menunjukkan tumor jenis ganas atau Malignant yang memiliki tingkatan yang tinggi.
Classification with KNN
Untuk membuat prediksi kita lebih kuat, kita perlu untuk melakukan langkah pengklasifikasian atau metode K-Nearest Neighbor. Nah, untuk mengetahui penggunaannya, kita perlu menyimak langkah-langkah dibawah.
Distance between points
Langkah selanjutnya, kita perlu mencoba membuat grafiknya agar kita mengetahui hubungan antara perimeter dengan concavity nya. Warna kuning berarti diagnosis Malignant dan warna hijau untuk diagnosis Benign. Disini kita menggunakan grafik scatterplot agar lebih mudah untuk melihat jenis diagnosis nya.
5.5
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) More than two explanatory variables
Pada langkah ini kita kita menggunakan rumus yang lebih banyak dimensi. Seperti dalam peritungan kita ingin menghitung 3 variabel. yaitu perimeter, concavity, dan symmetry. Pada contoh sebelumnya, kita hanya menggunakan 2 variabel yang menjumlahkan selisih kuadrat antara kedua variabelnya, dan kemudian di akar kuadratkan.
Mari kita coba hitung untuk mencari K=5 neighbors ketika kita memiliki 3 prediktor dibawah ini.
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)
Berdasarkan K=5 dgn 3 prediktor yang kita pakai di atas, kita mendapatkan pengamatan baru hasil pengklasifikasian yan menunjukkan knn adalah kelas malignant.
KNN with tidymodels
Langkah berikut ini kita ingin menampilkan data yang berisi kolom Class, Perimeter, Concavity saja untuk memfokuskan pengklasifikasian pada K-Nearest Neighbors. Kita menggunakan fungsi select untuk menampilkan kolom yang ingin kita tampilkan.
5.6
cancer_train <- cancer |>
select(Class, Perimeter, Concavity)
cancer_train
Pada langkah ini kita akan memulai untuk membuat model klasifikasi KNN nya dengan menggunakan fungsi nearest_neighbor. dimana K nya adalah 5. Kita juga memakai jarak garis lurusnya berupa rectangular. Set_engine digunakan untuk menentukan model apa yang ingin kita pakai dalam mengklasifikasi. dan set_mode dengan classification untuk melakukan klasifikasi.
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
Diaini kita memanggil library kknn untuk melakukan klasifikasi KNN. Langkah pertama yang perlu kita lakukan adalah perlu untuk menyesuaikan pemodelan dengan dataset nya terlebih dahulu menggunakan fungsi fit. Di langkah ini kita juga menentukan variabel apa yang akan kita jadikan target dan prediktor. Pada kali ini, kita akan menjadikan variabel Class sebagai target serta perimeter dan concavity menjadi predictor.
knn_fit <- knn_spec |>
fit(Class ~ Perimeter + Concavity, data = cancer_train)
Kita juga dapat menggunakan sintaks singkatan yang nyaman menggunakan titik, Class ~ ., untuk menunjukkan bahwa kita ingin menggunakan setiap variabel kecuali Class sebagai prediktor dalam model.
knn_fit <- knn_spec |>
fit(Class ~ ., data = cancer_train)
knn_fit## parsnip model object
##
## Fit time: 11ms
##
## 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
Di sini Anda dapat melihat ringkasan model terlatih terakhir. Ini menegaskan bahwa mesin komputasi yang digunakan untuk melatih model adalah kknn::train.kknn.
Pada langkah dibawah ini, kita akan memprediksi datanya. Kira menggunakan fungsi predict() untuk memprediksi data yang ingin kita prediksi. Dan ketika kita run, kita bisa melihat hasilnya. Hasilnya menunjukkan hasil klasifikasi yang memprediksi adanya pengamatan baru sebagai M atau tipe ganas.
new_obs <- tibble(Perimeter = 0, Concavity = 3.5)
predict(knn_fit, new_obs)5.7 MEMPROSES DATA DENGAN tydimodels
ketika kita menggunakan k nerarest neighbor klasifikasi,skala setiap variabel (yaitu, ukuran dan rentang nilainya) penting. Karena pengklasifikasi memprediksi kelas dengan mengidentifikasi observasi yang terdekat dengannya, setiap variabel dengan skala besar akan memiliki efek yang jauh lebih besar daripada variabel dengan skala kecilkelas dengan mengidentifikasi observasi yang terdekat dengannya, setiap variabel dengan skala besar akan memiliki efek yang jauh lebih besar daripada variabel dengan skala kecil Tetapi hanya karena suatu variabel memiliki skala yang besar tidak berarti bahwa variabel tersebut lebih penting untuk membuat prediksi yang akurat.sebagai contoh misalkan Anda memiliki kumpulan data dengan dua fitur, gaji (dalam dolar) dan tahun pendidikan, dan Anda ingin memprediksi jenis pekerjaan yang sesuai. Ketika kita menghitung jarak tetangga, perbedaan $1000 sangat besar dibandingkan dengan perbedaan 10 tahun pendidikan. Tapi untuk pemahaman konseptual kita dan menjawab masalah, justru sebaliknya; 10 tahun pendidikan sangat besar dibandingkan dengan perbedaan $1000 dalam gaji tahunan! dalam beberapa banyak prediksi,pusat variable (misalnya, rata-ratanya) juga penting. Misalnya, jika kita memiliki kumpulan data dengan variabel suhu yang diukur dalam derajat Kelvin, dan kumpulan data yang sama dengan suhu yang diukur dalam derajat Celcius, kedua variabel tersebut akan berbeda dengan pergeseran konstan 273 (walaupun keduanya berisi informasi yang sama persis). Demikian juga, dalam contoh klasifikasi pekerjaan hipotetis kita, kita mungkin akan melihat bahwa pusat variabel gaji berada dalam puluhan ribu, sedangkan pusat variabel tahun pendidikan berada dalam satu digit. Meskipun ini tidak mempengaruhi K-Algoritma klasifikasi tetangga terdekat, pergeseran besar ini dapat mengubah hasil dari penggunaan banyak model prediksi lainnya. Untuk menskalakan dan memusatkan data kita, kita perlu menemukan mean variabel kita (rata-rata, yang mengkuantifikasi nilai “pusat” dari serangkaian angka) dan standar deviasi (angka yang mengukur seberapa tersebar nilai). Untuk setiap nilai variabel yang diamati, kita kurangi mean (yaitu, pusatkan variabel) dan bagi dengan standar deviasi (yaitu, skala variabel). 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 K-algoritma tetangga terdekat, 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, kelancaran, dan juga kelas:
unscaled_cancer <- read_csv("unscaled_wdbc.txt") |>
mutate(Class = as_factor(Class)) |>
select(Class, Area, Smoothness)## Rows: 569 Columns: 12
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): Class
## dbl (11): ID, Radius, Texture, Perimeter, Area, Smoothness, Compactness, Con...
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
unscaled_cancerMelihat data yang tidak diskalakan dan tidak terpusat di atas, Anda dapat melihat bahwa perbedaan antara nilai untuk pengukuran area jauh lebih besar daripada untuk kehalusan. Apakah ini akan memengaruhi prediksi? Untuk mengetahuinya, kami akan membuat plot pencar dari dua prediktor ini (diwarnai oleh diagnosis) untuk data tidak standar yang baru saja kami muat, dan versi standar dari data yang sama. Tapi pertama-tama, kita perlu membakukan kumpulan data unscaled_cancer dengan model rapi.
Dalam kerangka model rapi, semua praproses data terjadi menggunakan resep dari paket R resep (Kuhn dan Wickham 2021) Di sini kita akan menginisialisasi resep untuk data unscaled_cancer di atas, menetapkan bahwa variabel Kelas adalah target, dan semua variabel lainnya adalah prediktor :
uc_recipe <- recipe(Class ~ ., data = unscaled_cancer)
print(uc_recipe)## Recipe
##
## Inputs:
##
## role #variables
## outcome 1
## predictor 2
Sejauh ini, resepnya tidak banyak; hanya pernyataan tentang jumlah target dan prediktor. Mari tambahkan langkah penskalaan (step_scale) dan pemusatan (step_center) untuk semua prediktor sehingga masing-masing memiliki rata-rata 0 dan standar deviasi 1. Perhatikan bahwa cleanverse sebenarnya menyediakan step_normalize, yang melakukan pemusatan dan penskalaan dalam satu langkah resep ; dalam buku ini kita akan memisahkan step_scale dan step_center untuk menekankan secara konseptual bahwa ada dua langkah yang terjadi. Fungsi persiapan menyelesaikan resep dengan menggunakan data (di sini, unscaled_cancer) untuk menghitung apa pun yang diperlukan untuk menjalankan resep (dalam hal ini, rata-rata kolom dan simpangan baku):
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]
Anda sekarang dapat melihat bahwa resep tersebut menyertakan langkah penskalaan dan pemusatan untuk semua variabel prediktor. Perhatikan bahwa saat Anda menambahkan langkah ke resep, Anda harus menentukan kolom mana yang akan menerapkan langkah tersebut. Di sini kita menggunakan fungsi all_predictors() untuk menentukan bahwa setiap langkah harus diterapkan ke semua variabel prediktor. Namun, ada sejumlah argumen berbeda yang dapat digunakan di sini, serta memberi nama kolom tertentu dengan sintaks yang sama dengan fungsi pilih. Sebagai contoh:
- all_nominal() dan all_numeric(): tentukan semua variabel kategori atau semua numerik variabel
- all_predictors() dan all_outcomes(): tentukan semua prediktor atau semua variabel target
- Area, Smoothness: tentukan variabel Area dan kelancaran
- Kelas: tentukan semuanya kecuali variabel Kelas
anda bisa menemukan semua langkah-langkah dan pilihan variabel di “recipes refrence page”.
dalam kasus ini,kita sudah memperkirakan diperlukan statistika dasar pada data memasukan kedalam resep,tapi datanya belum terpusat dan berskala.untuk aktual berskala dan pusat data, kita perlu untuk mengumpulkan bake fungsi ke data yang tidak diskalakan.
scaled_cancer <- bake(uc_recipe, unscaled_cancer)
scaled_canceritu mungkin terlihat tidak beraturan maka dari itu kita perlu sehingga kita dapat menentukan kumpulan data yang berbeda dalam langkah memproses jika kita mau. Misalnya, kita mungkin ingin menentukan data baru yang bukan bagian dari set pelatihan.
Anda mungkin berfikir kenapa kita melakukan banyak pekerjaan di pengskalaan dan pemusatan variabel kita.bisa kah kita mmemprosesnya dengan manual skala dan pemusatan dari area dan kelancaraan. variabel kita sendiri sebelum membuat k-nearest model tetangga kita?,Yahh, secara teknik iya; tetapi melakukannya juga bisa melakukan kesalahan jika keliru. Secara khusus, kita mungkin secara tidak sengaja lupa menerapkan pemusatan/penskalaan yang sama saat membuat prediksi, atau secara tidak sengaja menerapkan pemusatan/penskalaan yang berbeda dari yang kita gunakan saat latihan.Penggunaan resep yang tepat membantu menjaga kode kita tetap sederhana, mudah dibaca, dan bebas kesalahan.Selanjutnya, perhatikan bahwa menggunakan persiapan dan pemanggangan hanya diperlukan jika Anda ingin memeriksa sendiri hasil dari langkah-langkah pra-pemrosesan. Anda akan melihat lebih lanjut di Bagian 5.8 bahwa model rapi menyediakan alat untuk secara otomatis menerapkan persiapan dan pemarosesan seperlunya tanpa upaya pengkodean tambahan.
Gambar 5.9 menunjukkan dua plot pencar secara berdampingan—satu untuk unscaled_cancer dan satu untuk scaled_cancer. Masing-masing memiliki pengamatan baru yang sama yang dijelaskan dengan K= 3 tetangga terdekat. Dalam plot data asli yang tidak standar, Anda dapat melihat beberapa pilihan aneh untuk tiga tetangga terdekat.secara khusus, “tetangga” secara visual berada dalam awan pengamatan jinak, dan semua tetangga hampir sejajar secara vertikal dengan pengamatan baru (itulah sebabnya sepertinya hanya ada satu garis hitam di plot ini). Gambar 5.10 menunjukkan close-up wilayah tersebut pada plot yang tidak standar.Di sini perhitungan tetangga terdekat didominasi oleh variabel area dengan skala yang jauh lebih besar. Plot untuk data standar di sebelah kanan pada Gambar 5.9 menunjukkan pilihan tetangga terdekat yang jauh lebih masuk akal secara intuitif. Dengan demikian, 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.
komparasi dengan K=3 tetangga terdekat dengan standar dan tidak standarnya data
figur 5.9 komparasi k= 3 tetangga terdekat dengan standar dan tidak standarnya data
close-up fari tetangga terdekat untuk tidak standar data.
figure 5.10 close-up untuk tiga tetangga terdekat untuk tidak standar data.
5.7.2 keseimbangan
potensi lain masalah di dalam data set untuk kelasifikasi adalah kelas keseimbangan,i.e., ketika satu label terlalu banyak umum dari lain.sejak kelasifikasi seperti K-nearest neighbor algoritma menggunakan label untuk label terdekat(jika pun itu “pola” data menunjukan sebaliknya).kelas keseimbangan adalah sebenarnya masalah yang cukup umum dan penting: dari diagnosis penyakit langka hingga deteksi email berbahaya, ada banyak kasus di mana kelas “penting” untuk diidentifikasi (adanya penyakit, email berbahaya) jauh lebih jarang daripada kelas “tidak penting” (tidak ada penyakit , email biasa).
untuk mengilustrasikan masalah.ayo kita merevisi skala kanker payudara;kecuali sekarang kita akan menghapus banyak pengamatan tumor ganas, mensimulasikan seperti apa data itu jika kanker itu langka. Kita akan melakukan ini dengan memilih hanya 3 pengamatan dari kelompok ganas, dan menyimpan semua pengamatan jinak.kita memilih 3 observasi using the lapisan_atas fungsi, yang mana kelas “penting” untuk di identifikasi.(adanya penyakit, email berbahaya) jauh lebih jarang daripada kelas “tidak penting” (tidak ada penyakit, email normal).
Untuk mengilustrasikan masalah dengan lebih baik, mari kita tinjau kembali data kanker payudara berskala, kanker; kecuali sekarang kami akan menghapus banyak pengamatan tumor ganas, mensimulasikan seperti apa data itu jika kanker itu langka. Kami akan melakukan ini dengan memilih hanya 3 pengamatan dari kelompok ganas, dan menyimpan semua pengamatan jinak. Kami memilih 3 pengamatan ini menggunakan fungsi slice_head, yang mengambil dua argumen: objek seperti bingkai data, dan jumlah baris untuk dipilih dari atas (n). Data baru ketidakseimbangan ditunjukkan pada Gambar 5.11.
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 ketidakseimbangan data.
figure 5.11: ketidakseimbangan data.
Misalkan kita sekarang memutuskan untuk menggunakan K=7 di K-klasifikasi tetangga terdekat. Dengan hanya 3 pengamatan tumor ganas, pengklasifikasi akan selalu memprediksi bahwa tumor itu jinak, tidak peduli seberapa cekung dan kelilingnya! Ini karena dalam suara mayoritas dari 7 pengamatan, paling banyak 3 akan ganas (kami hanya memiliki 3 pengamatan ganas total), jadi setidaknya 4 harus jinak, dan suara jinak akan selalu menang. Misalnya, Gambar 5.12 menunjukkan apa yang terjadi untuk pengamatan tumor baru yang cukup dekat dengan tiga pengamatan dalam data pelatihan yang ditandai sebagai ganas. ketidakseimbangan data dengan 7 tetangga terdekat untuk observasi sorotan Figure 5.12: ketidak seimbangan dengan 7 tetangga terdekat untuk observasi baru sorotan
Figure 5.13 menunjukan apa yang terjadi jika kita set latar belakang warna dari setiap daerah dari plot untuk prediksi K-nearest tetangga kelas akan membuat. kita bisa melihat keputusan selalu "jinak" sesuai dengan warna biru.
keseimbangan data dengan latar belakang warna indikasi keputusan dari kelas mempresentasikan label data.
Figure 5.13: keseimbangan data dengan latar belakang warna mengindikasikan keputusan dari kelas dan kelas dan poin menampilkan label data.
Terlepas dari kesederhanaan masalahnya, pemecahannya dengan cara yang benar secara statistik sebenarnya cukup bernuansa, dan perawatan yang cermat akan membutuhkan lebih banyak detail dan matematika daripada yang akan kita bahas dalam buku teks ini. Untuk tujuan saat ini, cukup untuk menyeimbangkan kembali data dengan melakukan oversampling kelas langka. Dengan kata lain, kami akan mereplikasi pengamatan langka beberapa kali dalam kumpulan data kami untuk memberi mereka lebih banyak hak suara di K-Algoritma tetangga terdekat. Untuk melakukan ini, kami akan menambahkan langkah oversampling ke resep uc_recipe sebelumnya dengan fungsi step_upsample dari paket themis R. Kami menunjukkan di bawah bagaimana melakukan ini, dan juga menggunakan fungsi group_by dan meringkas untuk melihat bahwa kelas kami sekarang seimbang:
library(themis)## Warning: package 'themis' was built under R version 4.1.2
## Registered S3 methods overwritten by 'themis':
## method from
## bake.step_downsample recipes
## bake.step_upsample recipes
## prep.step_downsample recipes
## prep.step_upsample recipes
## tidy.step_downsample recipes
## tidy.step_upsample recipes
## tunable.step_downsample recipes
## tunable.step_upsample recipes
##
## Attaching package: 'themis'
## The following objects are masked from 'package:recipes':
##
## step_downsample, step_upsample
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())Sekarang misalkan kita melatih K-pengklasifikasi tetangga terdekat dengan K=7 Pada data yang seimbang ini. Gambar 5.14 menunjukkan apa yang terjadi sekarang ketika kita mengatur warna latar belakang setiap area plot pencar kita ke keputusan: K-pengklasifikasi tetangga terdekat akan membuat. Kita bisa melihat bahwa keputusan itu lebih masuk akal; ketika titik-titik dekat dengan yang berlabel ganas, pengklasifikasi memprediksi tumor ganas, dan sebaliknya ketika mereka lebih dekat dengan pengamatan tumor jinak. salah tempel data dengan latar belakang warna mengindikasikan kelas Figure.5.14: salah tempel data dengan latarbelakang warna mengindikasikan keputusan kelas
5.8
Putting it together in a workflow
Library tidymodels juga menyediakan workflow. Kali ini kita akan melakukan analisis dengan langkah yang tidak perlu kode yang banyak. Disini kita akan menggunakan dataset unscaled_wdbc.csv. Pertama kita akan memuat data, membuat model, dan menentukan resep bagaimana data harus diproses sebelumnya.
unscaled_cancer <- read_csv("unscaled_wdbc.txt") |>
mutate(Class = as_factor(Class))## Rows: 569 Columns: 12
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): Class
## dbl (11): ID, Radius, Texture, Perimeter, Area, Smoothness, Compactness, Con...
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
knn_spec <- nearest_neighbor(weight_func = "rectangular", neighbors = 7) |>
set_engine("kknn") |>
set_mode("classification")uc_recipe <- recipe(Class ~ Area + Smoothness, data = unscaled_cancer) |>
step_scale(all_predictors()) |>
step_center(all_predictors())
Sekarang kita akan menempatkan langkah-langkah ini dalam alur kerja menggunakan fungsi add_recipe dan add_model, dan terakhir kita akan menggunakan fungsi fit untuk menjalankan seluruh alur kerja pada data unscaled_cancer. Perhatikan perbedaan lain dari sebelumnya di sini:
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
new_observation <- tibble(Area = c(500, 1500), Smoothness = c(0.075, 0.1))
prediction <- predict(knn_fit, new_observation)
predictionLibrary tidymodels juga menyediakan workflow. Kali ini kita akan melakukan analisis dengan langkah yang tidak perlu kode yang banyak. Disini kita akan menggunakan
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))knnPredGrid <- predict(knn_fit, asgrid)prediction_table <- bind_cols(knnPredGrid, asgrid) |>
rename(Class = .pred_class)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