Pengatar Data Science || Tugas 5
~ Chapter 7 Regression I : K-nearest neighbors ~
| Kontak | : \(\downarrow\) |
| mugemisausan05@gmail.com | |
| https://www.instagram.com/saram.05/ | |
| RPubs | https://rpubs.com/sausanramadhani/ |
Anggota Kelompok
Statistika Bisnis 2021
1. Calvin Riswandi
2. Sausan Ramadhani
3. Ferdinand Nathaniel Widjaya
7.1 Overview
Regression memiliki persamaan dengan classification : sebagai contoh, dalam kasus klasifikasi, kita akan membagi data menjadi training, validation, dan test sets, kita akan menggunakan tidymodels workflows, kita akan menggunakan KNN untuk membuat prediksi, dan kita akan menggunakan cross-validation untuk memilih K. Bab ini akan lebih terfokus pada kasus di mana ada 1 prediktor, tetapi pada akhir bab akan ditampilkan bagaimana cara menampilkan regression dengan lebih dari satu variabel prediktor, yaitu multivariable regression.
7.2 Chapter learning objectives
Setelah mempelajari bab ini, pembaca akan mendapatkan pengetahuan diantaranya yaitu :
• Mengenali situasi di mana analisis regresi yang mudah dapat sesuai untuk membuat prediksi.
• Menjelaskan algoritma regresi KNN dan mendeskripsikan bagaimana ini berbeda dari klasifikasi KNN.
• Menafsirkan output dari regresi KNN.
• Dalam dataset dengan dua atau lebih variabel, menampilkan regresi KNN dalam R menggunakan tidymodels workflow.
• Menjalankan cross-validation dalam R untuk memilih jumlah dari neighbors.
• Mengevaluasi prediksi regresi KNN akurasi dalam R menggunakan test dataset dan the root mean squared prediction error (RMSPE).
• Dalam konteks dari regresi KNN, bandingkan dan kontraskan kebaikan dari kesesuaian dan prediksi properti (bernama RMPE vs RMSPE).
• Mendeskripsikan keuntungan dan kerugian dari regresi KNN.
7.3 The regression problem
Regresi, seperti klasifikasi, adalah prediksi masalah pengaturan di mana kita akan menggunakan informasi sebelumnya untuk memprediksi observasi selanjutnya. Namun dalam kasus regresi, targetnya yaitu memprediksi nilai numerical sebagai gantinya dari nilai categorical. Variabel yang kita akan prediksikan yang sering disebut response variable.
7.4 Exploring a data set
Pada bab ini dan seterusnya, kita akan mempelajari sebuah data set. Kita memulai analisis dengan memuat dan memeriksa data, dan menetapkan nilai seed.
library(tidyverse)
library(tidymodels)
library(gridExtra)
set.seed(5)
sacramento <- read_csv("sacramento.txt")
sacramentoKita memvisualisasi data sebagai scatter plot dimana kita menempatkan variabel prediktor (house size) pada sumbu x, dan kita menempatkan variabel target/repons yang kita ingin prediksikan (sale price) pada sumbu y.
eda <- ggplot(sacramento, aes(x = sqft, y = price)) +
geom_point(alpha = 0.4) +
xlab("House size (square feet)") +
ylab("Price (USD)") +
scale_y_continuous(labels = dollar_format()) +
theme(text = element_text(size = 12))
edakita dapat beralasan bahwa kita mungkin dapat menggunakan ukuran rumah yang belum terjual (yang kita tidak tahu harga jualnya) untuk memprediksi harga jual akhirnya.
7.5 K-nearest neighbors regression
Sama seperti dalam kasus klasifikasi, kita dapat menggunakan pendekatan berbasis K-nearest neighbor dalam regresi untuk membuat prediksi.
Kita akan menggunakan fungsi slice_sample untuk mengambil sampel acak kecil berukuran 30.
small_sacramento <- slice_sample(sacramento, n = 30)Misalkan kita menemukan rumah seluas 2.000 kaki persegi di Sacramento yang ingin kita beli, dengan harga jual yang diiklankan sebesar $350.000.
small_plot <- ggplot(small_sacramento, aes(x = sqft, y = price)) +
geom_point() +
xlab("House size (square feet)") +
ylab("Price (USD)") +
scale_y_continuous(labels = dollar_format()) +
geom_vline(xintercept = 2000, linetype = "dotted") +
theme(text = element_text(size = 12))
small_plotKita gunakan intuisi yang sama dari bab klasifikasi, yang mana untuk memprediksi harga jua; bisa menggunakan the beighboring points ke tempat points baru.
nearest_neighbors <- small_sacramento |>
mutate(diff = abs(2000 - sqft)) |>
arrange(diff) |>
slice(1:5) #subset the first 5 rows
nearest_neighborsDari hasil tersebut mengilustrasikan perbedaan antara ukuran rumah dari 5 nearest neighbors dengan rumah baru seluas 2.000 kaki persegi.
prediction <- nearest_neighbors |>
summarise(predicted = mean(price))
predictionAlgoritme benar-benar memiliki sedikit asumsi tentang seperti apa tampilan data agar dapat berfungsi.
7.6 Training, evaluating, and turning the model
Seperti bab sebelumnya, dataset dibagi menjadi training set dan test set dengan ratio 75-25
sacramento_split <- initial_split(sacramento, prop = 0.75, strata = price)
sacramento_train <- training(sacramento_split)
sacramento_test <- testing(sacramento_split)Selanjutnya, kita akan menggunakan validasi silang untuk memilih K. Dalam klasifikasi KNN, kita menggunakan akurasi untuk melihat seberapa baik prediksi kami cocok dengan label sebenarnya. Kita tidak dapat menggunakan metrik yang sama dalam pengaturan regresi, karena prediksi kita hampir tidak akan pernah sama persis dengan nilai variabel respons yang sebenarnya. Oleh karena itu dalam konteks regresi KNN kita akan menggunakan root mean square prediksi error (RMSPE) sebagai gantinya. Jika prediksi sangat mendekati nilai sebenarnya, maka RMSPE akan kecil. Sebaliknya, jika prediksi sangat berbeda dari nilai sebenarnya, maka RMSPE akan cukup besar. Saat kami menggunakan validasi silang, kami akan memilih K yang memberi kita RMSPE terkecil.
Note -> Saat menggunakan banyak paket kode (termasuk model rapi), keluaran evaluasi yang akan kami peroleh untuk menilai kualitas prediksi model regresi KNN kami diberi label “RMSE,” atau “root mean squared error.”
Sekarang kita tahu bagaimana kita dapat menilai seberapa baik model kita memprediksi nilai numerik, mari kita gunakan R untuk melakukan validasi silang dan untuk memilih K yang optimal. Pertama, kita akan membuat resep untuk preprocessing data kita. Perhatikan bahwa kami menyertakan standarisasi dalam prapemrosesan kami untuk membangun kebiasaan yang baik, tetapi karena kami hanya memiliki satu prediktor, secara teknis hal itu tidak diperlukan; tidak ada risiko membandingkan dua prediktor dari skala yang berbeda.
Selanjutnya kita membuat spesifikasi model untuk regresi K-nearest neighbor. Kemudian kita membuatcross validation 5 kali , dan menyatukan recipe dan spesifikasi model dalam workflow.
sacr_recipe <- recipe(price ~ sqft, data = sacramento_train) |>
step_scale(all_predictors()) |>
step_center(all_predictors())
sacr_spec <- nearest_neighbor(weight_func = "rectangular",
neighbors = tune()) |>
set_engine("kknn") |>
set_mode("regression")
sacr_vfold <- vfold_cv(sacramento_train, v = 5, strata = price)
sacr_wkflw <- workflow() |>
add_recipe(sacr_recipe) |>
add_model(sacr_spec)
sacr_wkflw## == Workflow ====================================================================
## Preprocessor: Recipe
## Model: nearest_neighbor()
##
## -- Preprocessor ----------------------------------------------------------------
## 2 Recipe Steps
##
## * step_scale()
## * step_center()
##
## -- Model -----------------------------------------------------------------------
## K-Nearest Neighbor Model Specification (regression)
##
## Main Arguments:
## neighbors = tune()
## weight_func = rectangular
##
## Computational engine: kknn
Selanjutnya kita menjalankan validasi silang untuk kisi jumlah tetangga mulai dari 1 hingga 200. Kode berikut menyetel model dan mengembalikan RMSPE untuk setiap jumlah tetangga. Dalam output dari frame data hasil sacr_results, kita melihat bahwa variabel tetangga berisi nilai K, mean (mean) berisi nilai RMSPE yang diperkirakan melalui validasi silang, dan kesalahan standar (std_err) berisi nilai yang sesuai dengan ukuran seberapa tidak pasti kita dalam nilai mean. Penjelasan rinci tentang hal ini berada di luar cakupan bab ini; tetapi secara kasar, jika perkiraan rata-rata Anda adalah 100.000 dan kesalahan standar adalah 1.000, Anda dapat mengharapkan RMSPE yang sebenarnya berada di suatu tempat kira-kira antara 99.000 dan 101.000 (meskipun mungkin berada di luar kisaran ini). Anda dapat mengabaikan kolom lain dalam kerangka data metrik.
gridvals <- tibble(neighbors = seq(from = 1, to = 200, by = 3))
sacr_results <- sacr_wkflw |>
tune_grid(resamples = sacr_vfold, grid = gridvals) |>
collect_metrics() |>
filter(.metric == "rmse")
# show the results
sacr_resultsMengambil RMSPE Terkecil
# show only the row of minimum RMSPE
sacr_min <- sacr_results |>
filter(mean == min(mean))
sacr_minRMSPE terkecil ada di K=37.
7.7 Underfitting and overfitting
Sama halnya dengan klasifikasi, pemilihan jumlah k yang salah juga bisa merusak model regresi yang kita buat, nilai RSMPE Meroket. Nilai akan terlalu dipengaruhi atau kurang dipengaruhi oleh data lainnya sehingga prediksi menjadi tidak jelas.
Idealnya, yang kita inginkan bukanlah kedua situasi yang dibahas di atas. Sebagai gantinya, kita ingin model yang (1) mengikuti “tren” keseluruhan dalam training datan, sehingga model tersebut benar-benar menggunakan training data untuk mempelajari sesuatu yang berguna, dan (2) tidak mengikuti fluktuasi , sehingga kami dapat yakinlah bahwa model kami akan mentransfer/menggeneralisasi dengan baik ke data baru lainnya. Jika kita menjelajahi nilai-nilai lain untuk K, khususnya K = 37 (seperti yang disarankan oleh cross validation ), kita dapat melihatnya mencapai tujuan ini: mengikuti tren kenaikan harga rumah versus ukuran rumah, tetapi tidak terlalu dipengaruhi oleh variasi harga yang istimewa. Semua ini mirip dengan bagaimana pilihan K mempengaruhi klasifikasi K-tetangga terdekat, seperti yang dibahas dalam bab sebelumnya.
7.8 Evaluating on the test set
Untuk menilai seberapa baik model kami dalam memprediksi data yang tidak terlihat, kami akan menilai RMSPE-nya pada data uji. Untuk melakukan ini, pertama-tama kita akan melatih kembali model regresi KNN kita di seluruh kumpulan data pelatihan, menggunakan K=37 Kemudian kita akan menggunakan prediksi untuk membuat prediksi pada test set, dan menggunakan fungsi metrik lagi untuk menghitung ringkasan kualitas regresi.
kmin <- sacr_min |> pull(neighbors)
sacr_spec <- nearest_neighbor(weight_func = "rectangular", neighbors = kmin) |>
set_engine("kknn") |>
set_mode("regression")
sacr_fit <- workflow() |>
add_recipe(sacr_recipe) |>
add_model(sacr_spec) |>
fit(data = sacramento_train)
sacr_summary <- sacr_fit |>
predict(sacramento_test) |>
bind_cols(sacramento_test) |>
metrics(truth = price, estimate = .pred) |>
filter(.metric == 'rmse')
sacr_summarykami memperkirakan kesalahan dalam prediksi kami kira-kira USD89.279. Dari satu perspektif, ini adalah kabar baik: ini hampir sama dengan estimasi RMSPE validasi silang dari model kami yang disetel (yaitu USD85.227), jadi kami dapat mengatakan bahwa model tersebut tampaknya digeneralisasi dengan baik ke data baru yang belum pernah dilihatnya sebelum. Namun, seperti halnya klasifikasi KNN, apakah nilai untuk RMSPE ini baik—yaitu, apakah kesalahan sekitar USD89.279 dapat diterima—bergantung sepenuhnya pada aplikasi. Dalam aplikasi ini, kesalahan ini tidak terlalu besar, tetapi juga tidak dapat diabaikan; USD89.279 mungkin mewakili sebagian besar anggaran pembeli rumah
Grafik menunjukkan prediksi yang dibuat model akhir kami di berbagai ukuran rumah yang mungkin kami temui di area Sacramento—dari 500 hingga 5000 kaki persegi
sacr_preds <- tibble(sqft = seq(from = 500, to = 5000, by = 10))
sacr_preds <- sacr_fit |>
predict(sacr_preds) |>
bind_cols(sacr_preds)
plot_final <- ggplot(sacramento_train, aes(x = sqft, y = price)) +
geom_point(alpha = 0.4) +
geom_line(data = sacr_preds,
mapping = aes(x = sqft, y = .pred),
color = "blue") +
xlab("House size (square feet)") +
ylab("Price (USD)") +
scale_y_continuous(labels = dollar_format()) +
ggtitle(paste0("K = ", kmin)) +
theme(text = element_text(size = 12))
plot_final7.9 Multivariable KNN regression
Kita akan menampilkan hasil analisis regresi KNN multivariabel dari data real estate Sacramento menggunakan tidymodels. Kita menggunakan house size juga number of bedrooms, dan price sebagai variabelnya.
plot_beds <- sacramento |>
ggplot(aes(x = beds, y = price)) +
geom_point(alpha = 0.4) +
labs(x = 'Number of Bedrooms', y = 'Price (USD)') +
theme(text = element_text(size = 12))
plot_bedsDari plot tersebut, menunjukkan bahwa dengan bertambahnya jumlah kamar tidur, harga jual rumah cenderung meningkat tetapi hubungannya lemah. Untuk memprediksi harga dengan number of bedrooms, kita gunakan rumus price ~ sqft + beds(2 prediktor).
sacr_recipe <- recipe(price ~ sqft + beds, data = sacramento_train) |>
step_scale(all_predictors()) |>
step_center(all_predictors())
sacr_spec <- nearest_neighbor(weight_func = "rectangular",
neighbors = tune()) |>
set_engine("kknn") |>
set_mode("regression")Kita gunakan validassi silang 5 kali lipat untuk memiliki number of neighbors melalui RMSPE minimum :
gridvals <- tibble(neighbors = seq(1, 200))
sacr_multi <- workflow() |>
add_recipe(sacr_recipe) |>
add_model(sacr_spec) |>
tune_grid(sacr_vfold, grid = gridvals) |>
collect_metrics() |>
filter(.metric == "rmse") |>
filter(mean == min(mean))
sacr_k <- sacr_multi |>
pull(neighbors)
sacr_multiDari hasil tersebut terlihat bahwa estimasi RMSPE terkecil dari validasi silang terjadi saat K=12. Dari data sebelumnya, perkiraan akurasi validasi silang untuk model prediktor tunggal adalah 85.227 sedangkan untuk model multivariabelnya yaitu 82.648. Maka kita tidak meningkatkan model dalam jumlah besar dengan menambahkan prediktor tambahan.
Analisis selanjutnya yaitu re-train seluruh dataset training dengan K=12 dan gunakan model itu untuk membuat prediksi pada data uji.
sacr_spec <- nearest_neighbor(weight_func = "rectangular",
neighbors = sacr_k) |>
set_engine("kknn") |>
set_mode("regression")
knn_mult_fit <- workflow() |>
add_recipe(sacr_recipe) |>
add_model(sacr_spec) |>
fit(data = sacramento_train)
knn_mult_preds <- knn_mult_fit |>
predict(sacramento_test) |>
bind_cols(sacramento_test)
knn_mult_mets <- metrics(knn_mult_preds, truth = price, estimate = .pred) |>
filter(.metric == 'rmse')
knn_mult_metsDari data tersebut, kita mendapatkan kesalahan uji RMSPE sebesar 82418.86. Kita dapat melihat bahwa prediksi dalam kasus ini, kita memiliki 2 prediktor, membentuk permukaan, bukan garis.
7.10 Strengths and limitations of KNN regression
Seperti klasifikasi KNN (atau algoritma prediksi apa pun dalam hal ini), regresi KNN memiliki kekuatan dan kelemahan. Beberapa tercantum di sini:
Kekuatan: Regresi KNN
1. adalah algoritma yang sederhana dan intuitif,
2. membutuhkan beberapa asumsi tentang seperti apa data itu seharusnya, dan
3. bekerja dengan baik dengan hubungan non-linier (yaitu, jika hubungannya bukan garis lurus).
Kelemahan: Regresi KNN
1. menjadi sangat lambat karena data pelatihan semakin besar,
2. mungkin tidak berkinerja baik dengan sejumlah besar prediktor, dan
3. mungkin tidak memprediksi dengan baik di luar kisaran input nilai dalam data pelatihan Anda.