BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Machine learning bukanlah konsep yang baru. Sejak akhir tahun 1950-an, para peneliti telah berupaya mengembangkan algoritma yang memungkinkan mesin untuk belajar dari data. Salah satu pionirnya adalah Arthur Samuel, yang mengembangkan program bermain catur yang dapat “belajar” dari permainan sebelumnya untuk menjadi lebih baik. Seiring waktu, machine learning berkembang pesat dengan meningkatnya kemampuan komputasi dan ketersediaan data dalam jumlah besar. Di era digital saat ini, machine learning telah menjadi salah satu bidang yang paling cepat berkembang di dunia teknologi. Dari pengenalan pola sederhana hingga sistem pembelajaran mendalam (deep learning) yang kompleks, machine learning telah menjadi fondasi dari banyak inovasi teknologi modern, seperti pengenalan wajah, kendaraan otonom, asisten virtual, dan sistem rekomendasi (Bintoro dkk., 2024).

Machine Learning terbagi menjadi 2 macam konsep pembelajaran, yaitu pertama Supervised Learning yang merupakan teknik machine learning yang membuat suatu fungsi berdasarkan data latihan yang sudah ada, dalam hal ini dapat dikatakan untuk teknik ini sudah tersedia data latihan secara detail dan terklasifikasi dengan baik yang akan dijadikan sebuah model data saat dilakukan proses uji coba dengan data tes yang baru dan menghasilkan hasil keluaran yang sesuai diharapkan sebelumnya berdasarkan data latihan yang ada. Kedua adalah Unsupervised Learning yang merupakan teknik machine learning yang berusaha untuk melakukan representasi pola sebuah input yang berasal dari data latihan dan salah satu yang menjadi perbedaan dengan Supervised Learning adalah tidak adanya pengklasifikasian dari input data. Dalam Machine Learning teknik Unsupervised Learning menjadi esensial karena sistem kerja yang diberikan sama dengan cara kerja otak manusia dimana dalam proses pembelajaran tidak ada role model atau informasi dan contoh yang tersedia untuk dijadikan sebagai model dalam melakukan proses uji coba untuk penyelesaian sebuah masalah dengan data yang baru (Fathurohman, 2021).

K-Nearest Neigbors (KNN) adalah sebuah algoritma klasifikasi popular yang sering digunakan dalam machine learning. KNN mengklasifikasikan objek berdasarkan data pembelajaran yang memiliki jarak terdekat dengan objek tertentu. Algoritma Nearest Neighbor hanya mempertimbangkan satu data pembelajaran terdekat sebagai basis klasifikasi. Walaupun KNN sederhana tapi kekuatan algoritma ini terletak pada kemampuannya menghasilkan prediksi yang cukup akurat dalam berbagai kasus aplikasi. Namun, kelemahan utama algoritma ini adalah sensitifitasnya terhadap parameter seperti jumlah tetangga (k) dan metrik jarak yang digunakan. KNN adalah algoritma nonparametric. Nonparametrik berarti tidak ada parameter atau jumlah parameter tetap terlepas dari ukuran data. Sebaliknya, parameter akan ditentukan oleh ukuran kumpulan data pelatihan, meskipun tidak ada asumsi yang perlu dibuat untuk distribusi data yang mendasarinya. Dengan demikian, KNN bisa menjadi pilihan terbaik untuk setiap studi klasifikasi yang melibatkan sedikit atau tanpa pengetahuan sebelumnya tentang distribusi data (Daulay, 2024).

1.2 Rumusan Masalah

Berdasarkan latar belakang tersebut, rumusan masalah yang dapat disimpulkan adalah:

1.Bagaimana memahami konsep fundamental, formulasi matematis, dan prinsip kerja algoritma K-Nearest Neighbors (𝑘-NN) sebagai metode non-parametrik supervised learning.

2.Bagaimana memahami pentingnya penskalaan fitur (feature scaling) dalam komputasi berbasis metrik jarak (distance metrics).

3.Bagaimana mengimplementasikan algoritma 𝑘-NN secara terstruktur dan mandiri menggunakan bahasa pemrograman R dengan pustaka class dan caret.

4.Bagaimana mengevaluasi performa model klasifikasi menggunakan Confusion Matrix, Akurasi (Accuracy), Sensitivitas (Sensitivity), Spesifisitas (Specificity), dan Positive Predictive Value.

5.Bagaimana melakukan eksplorasi optimasi hiperparameter nilai 𝑘 (hyperparameter tuning) serta memvisualisasikan kurva performanya menggunakan paket ggplot2.

1.3 Tujuan Penelitian

Berdasarkan rumusan masalah tersebut, tujuan yang dapat disimpulkan adalah:

1.Memahami konsep fundamental, formulasi matematis, dan prinsip kerja algoritma K-Nearest Neighbors (𝑘-NN) sebagai metode non-parametrik supervised learning.

2.Memahami pentingnya penskalaan fitur (feature scaling) dalam komputasi berbasis metrik jarak (distance metrics).

3.Mengimplementasikan algoritma 𝑘-NN secara terstruktur dan mandiri menggunakan bahasa pemrograman R dengan pustaka class dan caret.

4.Mengevaluasi performa model klasifikasi menggunakan Confusion Matrix, Akurasi (Accuracy), Sensitivitas (Sensitivity), Spesifisitas (Specificity), dan Positive Predictive Value.

5.Melakukan eksplorasi optimasi hiperparameter nilai 𝑘 (hyperparameter tuning) serta memvisualisasikan kurva performanya menggunakan paket ggplot2.

1.4 Manfaat Penelitian

Adapun manfaat pada penelitian ini yaitu:

1.Bagi Penulis

a.Memberikan informasi serta pengetahuan tentang konsep dan mengimplementasikan model K-Nearest Neighbors (𝑘-NN) sebagai metode non-parametrik supervised learning.

b.Mengembangkan dan menerapkan wawasan ilmu yang telah diperoleh dalam bidang statistika, khususnya tentang konsep dan mengimplementasikan model K-Nearest Neighbors (𝑘-NN) sebagai metode non-parametrik supervised learning dengan R-Studio.

2.Bagi Pembaca

Menambah ilmu pengetahuan dan pemahaman yang berkaitan dengan Mengevaluasi performa model K-Nearest Neighbors (𝑘-NN) sebagai metode non-parametrik supervised learning dengan R-Studio.

1.5 Batasan Masalah

Lakukan pemodelan klasifikasi terhadap data medis riil Wisconsin Breast Cancer Database yang dimuat melalui paket mlbench. Tujuan pemodelan adalah mendeteksi secara akurat apakah tumor payudara tergolong jinak (benign) atau ganas (malignant).

1.6 Sistematika Penulisan

Adapun sistematika penulisan dari praktikum ini adalah sebagai berikut.

BAB IPENDAHULUAN

Bab ini terdiri dari latar belakang, rumusan masalah, tujuan penelitian, manfaat penelitian, batasan masalah, dan sistematika penulisan.

BAB IITINJAUAN PUSTAKA

Bab ini berisi kajian pustaka yang terdiri dari jurnal, buku, dan informasi pendukung mengenai K-Nearest Neighbors (𝑘-NN) pada program R-Studio.

BAB IIIMETODE PENELITIAN

Bab ini terdiri dari jenis dan sumber data, variabel penelitian, algoritma penelitian, dan diagram alir.

BAB IVHASIL DAN PEMBAHASAN

Bab ini berisi hasil yang diperoleh dari analisis data beserta penjelasannya pada bagian pembahasan.

BAB VKESIMPULAN

Bab ini merupakan bagian penutup laporan yang berisi kesimpulan dari hasil analisis serta saran dari penulis.

DAFTAR PUSTAKA

LAMPIRAN

BAB II TINJAUAN PUSTAKA

2.1 Machine Learning and Modern Prediction

Machine Learning adalah studi tentang algoritma untuk mempelajari bagaimana melakukan tugas-tugas tertentu yang dilakukan secara otomatis oleh orang-orang. Di sini, belajar mengacu pada kemampuan untuk melakukan berbagai kegiatan yang sudah ada atau untuk mengekstrapolasi kesimpulan baru dengan benar dari berbagai pola yang diamati sebelumnya. Salah satu subbidang kecerdasan buatan, Machine Learning, dapat berdampak pada sejumlah bidang lain, termasuk statistik, matematika, dan banyak bidang teoretis ilmu komputer. Intinya, tujuan machine learning adalah untuk mengembangkan algoritma yang dapat mengeksekusi sistem pembelajaran otonom dengan sangat sedikit masukan dari orang-orang pada umumnya. Berikut beberapa contoh algoritma dari konsep pembelajaran Supervised Learning dan Unsupervised Learning (Fathurohman, 2021):

1.Supervised Learning

a.Logistic Regression: adalah strategi statistik yang dapat digunakan untuk memecahkan masalah dengan membuat prediksi variabel baru berdasarkan sejumlah variabel yang sudah ada dan yang ditentukan sebelumnya dan mencari korelasi antara variabel data input yang ditentukan sebelumnya dengan variabel prediksi baru.

b.K-Nearest Neighbors Algorithm (KNN): memerlukan pembentukan ruang fitur di mana item yang menjadi data pelatihan dan model data diberi nilai berbobot dan direpresentasikan dalam vektor n-dimensi untuk menyelesaikan masalah klasifikasi. Kesulitan tersebut kemudian diselesaikan dengan menentukan jarak dari item baru yang dapat ditentukan menggunakan model data dalam vektor n-dimensi, dan objek baru tersebut kemudian diberikan kategori.

2.Unsupervised Learning

a.Clustering: sebuah proses untuk membuat arketipe item yang digunakan dalam pembelajaran mesin untuk mengatasi tantangan seperti mengklasifikasikan atau mengkategorikan hal-hal ke dalam kelas atau kategori. Data yang digunakan sebagai model data belum membentuk kelompok data, sehingga tidak dapat mengidentifikasi klasifikasi suatu item. Akibatnya, pola dasar pertama-tama harus dibangun menggunakan sejumlah karakteristik yang diperlukan sebelum model data dan data pelatihan dapat digunakan. jika terjadi klasifikasi objek baru.

2.2 Konsep Dasar dan Karakteristik Asimtotik 𝑘-NN

Algoritma K-Nearest Neighbors (𝑘-NN) pertama kali digagas oleh Fix & Hodges (1951) sebagai metode klasifikasi non-parametrik dalam laporan penelitian militer USAF School of Aviation Medicine. Landasan teoritis konvergensinya kemudian dibuktikan secara analitis dan dipublikasikan secara luas oleh Cover & Hart (1967) dalam jurnal bereputasi IEEE Transactions on Information Theory.

Berbeda dengan algoritma parametrik (seperti Linear Discriminant Analysis atau Regresi Logistik) yang mengasumsikan bentuk distribusi data apriori tertentu, 𝑘-NN termasuk ke dalam kelompok instance-based learning atau lazy learning. Model ini tidak membentuk fungsi perantara (explicit hypothesis model) pada tahap pelatihan, melainkan menyimpan seluruh data pelatihan dan menunda komputasi hingga terdapat data baru (query point) yang hendak diprediksi (Hastie, Tibshirani, & Friedman, 2009; Cunningham & Delany, 2021).

Diberikan himpunan data latih yang terdiri atas 𝑛 observasi berpasangan:

\[ D = \{(x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n)\} \]

di mana 𝑥𝑖 ∈ 𝑅𝑝 merupakan vektor fitur berdimensi 𝑝, dan 𝑦𝑖 ∈ {1,2, … , 𝐶} adalah label kelas diskret. Untuk suatu data uji baru dengan vektor fitur 𝑥0 ∈ 𝑅𝑝, algoritma mengidentifikasi himpunan 𝑁𝑘(𝑥0) yang memuat 𝑘 buah tetangga terdekat dari 𝑥0 berdasarkan ukuran kedekatan jarak tertentu.

Estimasi probabilitas posterior bahwa data 𝑥0 tergolong ke dalam kelas 𝑗 diformulasikan sebagai proporsi kelas 𝑗 di antara tetangga terdekatnya:

\[ \hat{P}(Y = j \mid X = x_0) = \frac{1}{k}\sum_{i \in N_k(x_0)} I(y_i = j) \]

di mana 𝐼(⋅) merepresentasikan fungsi indikator (indicator function) yang bernilai:

\[ I(y_i = j) = \begin{cases} 1, & \text{jika } y_i = j \\ 0, & \text{jika } y_i \neq j \end{cases} \]

Keputusan klasifikasi final 𝐺̂(𝑥0) diambil berdasarkan prinsip suara terbanyak (majority voting):

\[ \hat{G}(x_0) = \underset{j \in \{1, 2, \ldots, C\}}{\arg\max}\ \hat{P}(Y = j \mid X = x_0) \]

2.1.1 Teorema Batas Kesalahan Cover-Hart (1967)

Cover dan Hart (1967) membuktikan bahwa ketika ukuran sampel data latih mendekati tak hingga (𝑛 → ∞), probabilitas kesalahan klasifikasi dari tetangga terdekat tunggal (𝑘 = 1), yang dinotasikan dengan 𝑅, dibatasi oleh probabilitas kesalahan pengklasifikasi Bayes optimal (𝑅∗) melalui batas ketat:

\[ R^* \le R \le R^*\left(2 - \frac{C}{C-1}R^*\right) \le 2R^* \]

Teorema ini memberikan jaminan matematis bahwa performa aturan tetangga terdekat secara asimtotik memiliki tingkat kesalahan paling buruk tidak lebih dari dua kali lipat kesalahan pengklasifikasi optimal teoritis (pengklasifikasi Bayes).

2.2 Kompromi Bias dan Varians (Bias-Variance Tradeoff)

Pemilihan nilai hiperparameter 𝑘 memegang peranan krusial dalam mengendalikan keseimbangan antara bias dan varians (Fransiska, 2026):

1.Nilai 𝑘 Kecil (misalnya 𝑘 = 1): Model memiliki fleksibilitas tinggi dan batas keputusan (decision boundary) yang sangat rumit. Karakteristik ini menghasilkan bias yang sangat rendah, namun varians yang sangat tinggi. Model menjadi sangat sensitif terhadap derau (noise) dan rentan mengalami overfitting.

2.Nilai 𝑘 Besar (misalnya 𝑘 → 𝑛): Batas keputusan menjadi sangat halus (oversmoothing). Karakteristik ini menghasilkan varians yang rendah, namun bias yang tinggi. Jika 𝑘 terlalu besar, model berpotensi mengalami underfitting karena keputusan lokal akan terdistorsi oleh prevalensi kelas mayoritas secara global.

2.3 Metrik Jarak (Distance Metrics)

Jarak antar dua titik observasi \(x = (x_1, \ldots, x_p)^\top\) dan \(y = (y_1, \ldots, y_p)^\top\) dalam ruang fitur dihitung menggunakan berbagai formulasi metrik jarak (Fransiska, 2026):

1.Jarak Euclidean (\(L_2\)): Metrik geometris paling umum untuk variabel bertipe numerik kontinu:

\[ d(x, y) = \sqrt{\sum_{i=1}^{p}(x_i - y_i)^2} \]

2.Jarak Manhattan (\(L_1\) / City Block Distance): Metrik jarak berbasis jumlah selisih mutlak yang lebih tangguh terhadap keberadaan pencilan (outliers):

\[ d(x, y) = \sum_{i=1}^{p}|x_i - y_i| \]

3.Jarak Minkowski (\(L_m\)): Generalisasi keluarga metrik \(L_m\), di mana parameter 𝑚 = 1 menghasilkan jarak Manhattan dan 𝑚 = 2 menghasilkan jarak Euclidean:

\[ d(x, y) = \left(\sum_{i=1}^{p}|x_i - y_i|^m\right)^{1/m}, \quad m \ge 1 \]

4.Jarak Mahalanobis: Metrik jarak yang menginkorporasikan matriks kovarians \(\Sigma\), sehingga mengoreksi korelasi antar variabel serta mengatasi perbedaan skala:

\[ d(x, y) = \sqrt{(x - y)^\top \Sigma^{-1}(x - y)} \]

5.Jarak Hamming: Ukuran ketidaksamaan yang dikhususkan untuk data bertipe biner atau kategorik kualitatif:

\[ d(x, y) = \frac{1}{p}\sum_{i=1}^{p} I(x_i \ne y_i) \]

2.4 Urgensi Transformasi dan Penskalaan Fitur (Feature Scaling)

Karena jarak Euclidean dan Manhattan menghitung selisih numerik secara langsung, variabel dengan rentang nilai besar akan mendominasi perhitungan jarak. Oleh karena itu, penskalaan fitur perlu dilakukan pada tahap pra-pemrosesan. Dua cara yang umum digunakan adalah normalisasi min-max yang mengubah nilai ke interval \([0, 1]\) dan standarisasi z-score yang mengubah data menjadi berrata-rata 0 dan simpangan baku 1 (Fransiska, 2026):

\[ x_{scaled} = \frac{x - x_{min}}{x_{max} - x_{min}} \qquad\qquad z = \frac{x - \mu}{\sigma} \]

BAB III METODE PENELITIAN

3.1 Sumber Data

Penelitian ini merupakan penelitian kuantitatif dengan pendekatan komputasi yang bertujuan menerapkan algoritma K-NN untuk mengklasifikasikan tumor payudara. Data yang digunakan adalah dataset BreastCancer (Wisconsin Breast Cancer Database) yang tersedia dalam paket mlbench pada perangkat lunak R-Studio. Setiap baris data merepresentasikan satu pengamatan sel hasil pemeriksaan, dan dataset ini digunakan untuk membedakan dua kelas diagnosis, yaitu benign (jinak) dan malignant (ganas). Pengolahan data dan pembentukan model dilakukan dengan bahasa pemrograman R menggunakan paket mlbench, class, caret, dan ggplot2. Karena NPM praktikan genap, data dibagi menjadi data latih sebesar 80% dan data uji sebesar 20% dengan set.seed(12336).

3.2 Variabel Penelitian

Variabel respon adalah Class, yaitu kategori diagnosis tumor (benign dan malignant). Variabel prediktor terdiri atas sembilan karakteristik sel yang dinilai pada skala 1 sampai 10, yaitu Cl.thickness (ketebalan kelompok sel), Cell.size (keseragaman ukuran sel), Cell.shape (keseragaman bentuk sel), Marg.adhesion (adhesi marginal), Epith.c.size (ukuran sel epitel tunggal), Bare.nuclei (inti sel telanjang), Bl.cromatin (kromatin), Normal.nucleoli (nukleolus normal), dan Mitoses (tingkat mitosis). Variabel Id hanya berfungsi sebagai identitas sehingga tidak digunakan dalam pemodelan.

3.3 Langkah-langkah Analisis

Algoritma berdasarkan batasan masalah adalah:

1.Memuat dataset BreastCancer dari paket mlbench ke dalam R-Studio.

2.Memeriksa struktur dataset, sebaran kelas, dan nilai hilang (missing value).

3.Menghapus variabel Id dan menghapus pengamatan yang mengandung nilai hilang dengan na.omit.

4.Mengubah variabel prediktor dari faktor menjadi numerik.

5.Melakukan normalisasi min-max pada seluruh variabel prediktor.

6.Membagi data menjadi 80% data latih dan 20% data uji dengan set.seed(12336).

7.Membentuk model K-NN untuk \(k \in \{3, 5, 7, 9, 11\}\) menggunakan fungsi knn() dari paket class.

8.Menghitung confusion matrix serta akurasi, sensitivitas, spesifisitas, dan PPV untuk setiap nilai \(k\) menggunakan confusionMatrix() dari paket caret dengan kelas positif malignant.

9.Menyusun tabel perbandingan metrik evaluasi dan membuat visualisasi pengaruh nilai \(k\).

10.Menentukan nilai \(k\) optimal dengan memprioritaskan sensitivitas tertinggi (jumlah false negative terkecil), kemudian akurasi dan spesifisitas.

  1. Menginterpretasikan hasil dan menarik kesimpulan.

3.4 Diagram Alir Penelitian

Berikut ini diagram alir penelitian:

DiagrammeR::grViz("
digraph flow {
  graph [rankdir = TB, bgcolor = white, nodesep = 0.25, ranksep = 0.35]
  node [shape = box, style = rounded, fontname = Helvetica, fontsize = 10,
        color = '#52799B', margin = '0.16,0.10']
  edge [color = '#777777', arrowsize = 0.7]

  A [label = 'Mulai']
  B [label = 'Memuat Dataset BreastCancer']
  C [label = 'Pemeriksaan Struktur, Sebaran Kelas, dan Missing Value']
  D [label = 'Pra-pemrosesan: Hapus Id, Hapus Missing Value, Faktor ke Numerik']
  E [label = 'Normalisasi Min-Max']
  F [label = 'Pembagian Data Latih 80% dan Uji 20% (set.seed 12336)']
  G [label = 'Pemodelan K-NN untuk k = 3, 5, 7, 9, 11']
  H [label = 'Confusion Matrix dan Evaluasi: Akurasi, Sensitivitas, Spesifisitas']
  I [label = 'Tabel Perbandingan dan Visualisasi Pengaruh k']
  J [label = 'Menentukan k Optimal (Minimalkan False Negative)']
  K [label = 'Interpretasi dan Kesimpulan']
  L [label = 'Selesai']

  A -> B -> C -> D -> E -> F
  F -> G -> H -> I -> J -> K -> L
}
")

BAB IV HASIL DAN PEMBAHASAN

4.1 Eksplorasi Data

Berikut ini eksplorasi data yang digunakan dalam data kanker payudara:

library(class)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(ggplot2)
library(mlbench)
data(BreastCancer, package = "mlbench") # Memuat dataset BreastCancer
str(BreastCancer) # Menampilkan struktur variable
## 'data.frame':    699 obs. of  11 variables:
##  $ Id             : chr  "1000025" "1002945" "1015425" "1016277" ...
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
head(BreastCancer) # Menampilkan 6 observasi teratas
##        Id Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 1 1000025            5         1          1             1            2
## 2 1002945            5         4          4             5            7
## 3 1015425            3         1          1             1            2
## 4 1016277            6         8          8             1            3
## 5 1017023            4         1          1             3            2
## 6 1017122            8        10         10             8            7
##   Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses     Class
## 1           1           3               1       1    benign
## 2          10           3               2       1    benign
## 3           2           3               1       1    benign
## 4           4           3               7       1    benign
## 5           1           3               1       1    benign
## 6          10           9               7       1 malignant
table(BreastCancer$Class) # Memeriksa persebaran frekuensi kelas
## 
##    benign malignant 
##       458       241
colSums(is.na(BreastCancer)) # Memeriksa missing value
##              Id    Cl.thickness       Cell.size      Cell.shape   Marg.adhesion 
##               0               0               0               0               0 
##    Epith.c.size     Bare.nuclei     Bl.cromatin Normal.nucleoli         Mitoses 
##               0              16               0               0               0 
##           Class 
##               0

Data yang digunakan adalah dataset BreastCancer dari paket mlbench yang terdiri dari r n_awal pengamatan dan r p_awal variabel. Variabel tersebut meliputi Id sebagai identitas pasien, sembilan variabel karakteristik sel (Cl.thickness, Cell.size, Cell.shape, Marg.adhesion, Epith.c.size, Bare.nuclei, Bl.cromatin, Normal.nucleoli, dan Mitoses), serta satu variabel Class sebagai diagnosis. Kesembilan variabel karakteristik sel dinilai pada skala 1 sampai 10, tetapi tersimpan di R sebagai faktor atau faktor terurut, sehingga perlu diubah menjadi numerik sebelum jarak antarpengamatan dapat dihitung oleh algoritma K-NN. Variabel Class terdiri dari r n_benign pengamatan benign (r round(n_benign / n_awal * 100, 1)%) dan r n_malign pengamatan malignant (r round(n_malign / n_awal * 100, 1)%), sehingga kelas benign lebih dominan. Ketidakseimbangan kelas ini perlu diperhatikan karena akurasi dapat terlihat tinggi walaupun kelas minoritas (malignant) kurang terdeteksi, sehingga sensitivitas dilibatkan dalam evaluasi. Hasil pemeriksaan missing value menunjukkan bahwa nilai yang hilang terdapat pada variabel r paste(na_var, collapse = “,”), yaitu sebanyak r na_total pengamatan atau sekitar r round(na_total / n_awal * 100, 1)% dari seluruh data. Karena proporsinya kecil, pengamatan yang mengandung missing value dihapus pada tahap pra-pemrosesan.

4.2 Pra-pemrosesan Data

Berikut ini pra-pemrosesan data yang digunakan dalam data kanker payudara:

# Pra-pemrosesan data
bc <- BreastCancer
bc$Id <- NULL # Menghapus variabel Id (hanya identitas)
bc <- na.omit(bc) # Menghapus pengamatan yang mengandung missing value
# Mengubah 9 variabel prediktor dari faktor menjadi numerik
bc[1:9] <- lapply(bc[1:9], function(x) as.numeric(as.character(x)))
bc$Class <- factor(bc$Class, levels = c("benign", "malignant"))
nrow(bc) # Jumlah pengamatan setelah pembersihan
## [1] 683
summary(bc)
##   Cl.thickness      Cell.size        Cell.shape     Marg.adhesion  
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 1.000   1st Qu.: 1.00  
##  Median : 4.000   Median : 1.000   Median : 1.000   Median : 1.00  
##  Mean   : 4.442   Mean   : 3.151   Mean   : 3.215   Mean   : 2.83  
##  3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##   Epith.c.size     Bare.nuclei      Bl.cromatin     Normal.nucleoli
##  Min.   : 1.000   Min.   : 1.000   Min.   : 1.000   Min.   : 1.00  
##  1st Qu.: 2.000   1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 1.00  
##  Median : 2.000   Median : 1.000   Median : 3.000   Median : 1.00  
##  Mean   : 3.234   Mean   : 3.545   Mean   : 3.445   Mean   : 2.87  
##  3rd Qu.: 4.000   3rd Qu.: 6.000   3rd Qu.: 5.000   3rd Qu.: 4.00  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :10.00  
##     Mitoses             Class    
##  Min.   : 1.000   benign   :444  
##  1st Qu.: 1.000   malignant:239  
##  Median : 1.000                  
##  Mean   : 1.603                  
##  3rd Qu.: 1.000                  
##  Max.   :10.000
# Mendefinisikan fungsi normalisasi Min-Max
min_max_norm <- function(x) {
  return((x - min(x)) / (max(x) - min(x)))}
# Menerapkan normalisasi pada 9 variabel prediktor (kolom 1 sampai 9)
bc_norm <- as.data.frame(lapply(bc[1:9], min_max_norm))
bc_norm$Class <- bc$Class # Menggabungkan kembali label kelas diagnosis
summary(bc_norm) # Menampilkan ringkasan statistik setelah normalisasi
##   Cl.thickness      Cell.size        Cell.shape     Marg.adhesion   
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.1111   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :0.3333   Median :0.0000   Median :0.0000   Median :0.0000  
##  Mean   :0.3825   Mean   :0.2390   Mean   :0.2461   Mean   :0.2034  
##  3rd Qu.:0.5556   3rd Qu.:0.4444   3rd Qu.:0.4444   3rd Qu.:0.3333  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
##   Epith.c.size     Bare.nuclei      Bl.cromatin     Normal.nucleoli 
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.1111   1st Qu.:0.0000   1st Qu.:0.1111   1st Qu.:0.0000  
##  Median :0.1111   Median :0.0000   Median :0.2222   Median :0.0000  
##  Mean   :0.2483   Mean   :0.2827   Mean   :0.2717   Mean   :0.2077  
##  3rd Qu.:0.3333   3rd Qu.:0.5556   3rd Qu.:0.4444   3rd Qu.:0.3333  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
##     Mitoses              Class    
##  Min.   :0.00000   benign   :444  
##  1st Qu.:0.00000   malignant:239  
##  Median :0.00000                  
##  Mean   :0.06702                  
##  3rd Qu.:0.00000                  
##  Max.   :1.00000

Tahap pra-pemrosesan dimulai dengan menghapus variabel Id dan pengamatan yang mengandung missing value, sehingga tersisa r n_bersih pengamatan. Seluruh variabel prediktor kemudian diubah dari faktor menjadi numerik dan variabel Class ditetapkan sebagai faktor dengan urutan level benign dan malignant. Selanjutnya dilakukan normalisasi min-max menggunakan fungsi min_max_norm, yaitu mengubah setiap nilai menjadi \((x - x_{min})/(x_{max} - x_{min})\), sehingga seluruh prediktor berada pada rentang 0 sampai 1. Fungsi lapply digunakan agar fungsi normalisasi diterapkan pada setiap kolom prediktor. Hasil summary(bc_norm) menunjukkan setiap prediktor bernilai minimum 0 dan maksimum 1. Normalisasi diperlukan karena K-NN berbasis jarak Euclidean, sehingga variabel dengan rentang nilai yang lebih besar akan mendominasi perhitungan jarak apabila tidak diskalakan. Walaupun kesembilan prediktor sudah berada pada skala yang sama (1 sampai 10), normalisasi tetap dilakukan sebagai praktik standar agar setiap variabel berkontribusi setara terhadap jarak.

4.3 Pembagian Data Latih dan Data Uji

Berikut ini pembagian data latih dan data uji yang digunakan dalam data kanker payudara:

# NPM genap: 80% data latih dan 20% data uji, set.seed(123XY) dengan XY = 36
set.seed(12336)
# Mengambil indeks sampel acak sebesar 80% dari total data
train_indices <- sample(seq_len(nrow(bc_norm)), size = 0.80 * nrow(bc_norm))
# Memisahkan matriks fitur prediktor
train_x <- bc_norm[train_indices, 1:9]
test_x <- bc_norm[-train_indices, 1:9]
# Memisahkan vektor label kelas
train_y <- bc_norm[train_indices, 10]
test_y <- bc_norm[-train_indices, 10]
cat("Dimensi Data Latih (Train):", nrow(train_x), "baris,", ncol(train_x), "fitur\n")
## Dimensi Data Latih (Train): 546 baris, 9 fitur
cat("Dimensi Data Uji (Test) :", nrow(test_x), "baris,", ncol(test_x), "fitur\n")
## Dimensi Data Uji (Test) : 137 baris, 9 fitur

Berdasarkan hasil didapatkan untuk digit terakhir NPM praktikan adalah 36 (genap), data dibagi menjadi 80% data latih dan 20% data uji dengan set.seed(12336). Hasil pembagian menunjukkan data latih terdiri dari r n_latih pengamatan (r round(n_latih / n_bersih * 100, 1)%) dan data uji terdiri dari r n_uji pengamatan (r round(n_uji / n_bersih * 100, 1)%), masing-masing dengan r ncol(train_x) fitur. Pada data uji terdapat r n_pos_uji pengamatan malignant dan r n_neg_uji pengamatan benign. Penggunaan set.seed memastikan pembagian data dapat direproduksi dengan hasil yang sama setiap kali kode dijalankan. Data latih menjadi basis pencarian tetangga terdekat, sedangkan data uji digunakan untuk menilai kemampuan model memprediksi data baru.

4.4 Pemodelan K-NN dengan k = 5

Berikut ini pemodelan K-NN dengan jumlah tetangga terdekat k = 5:

k_tetangga <- 5 # Mengatur jumlah tetangga terdekat k = 5
# Melakukan klasifikasi k-NN
prediksi_k5 <- knn(
  train = train_x, test = test_x, cl = train_y, k = k_tetangga)
head(prediksi_k5, 10) # Menampilkan 10 sampel hasil prediksi pertama
##  [1] benign    malignant benign    benign    malignant malignant benign   
##  [8] malignant benign    malignant
## Levels: benign malignant
# Menghitung matriks konfusi dan statistik evaluasi (kelas positif = malignant)
evaluasi_model <- confusionMatrix(data = prediksi_k5, reference = test_y, positive = "malignant")
print(evaluasi_model) # Menampilkan hasil evaluasi
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign        80         4
##   malignant      2        51
##                                           
##                Accuracy : 0.9562          
##                  95% CI : (0.9071, 0.9838)
##     No Information Rate : 0.5985          
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9083          
##                                           
##  Mcnemar's Test P-Value : 0.6831          
##                                           
##             Sensitivity : 0.9273          
##             Specificity : 0.9756          
##          Pos Pred Value : 0.9623          
##          Neg Pred Value : 0.9524          
##              Prevalence : 0.4015          
##          Detection Rate : 0.3723          
##    Detection Prevalence : 0.3869          
##       Balanced Accuracy : 0.9514          
##                                           
##        'Positive' Class : malignant       
## 

Model K-NN dibentuk dengan fungsi knn() dari paket class menggunakan jarak Euclidean pada data yang telah dinormalisasi. Setiap pengamatan data uji diklasifikasikan berdasarkan suara terbanyak dari k = 5 tetangga terdekat pada data latih. Hasil head(prediksi_k5, 10) menampilkan 10 prediksi pertama pada data uji. Kelas malignant ditetapkan sebagai kelas positif sehingga sensitivitas mengukur kemampuan model mendeteksi tumor ganas dan false negative (FN) adalah tumor ganas yang diprediksi jinak. Berdasarkan confusion matrix, model dengan k = 5 mencapai akurasi r round(acc5 * 100, 2)%, sensitivitas r round(sens5 * 100, 2)%, spesifisitas r round(spec5 * 100, 2)%, dan positive predictive value r round(ppv5 * 100, 2)%. Dari r n_pos_uji pengamatan malignant pada data uji, sebanyak r tp5 berhasil dideteksi dan r fn5 terlewat sebagai false negative. Dari r n_neg_uji pengamatan benign, sebanyak r tn5 diprediksi benar dan r fp5 diprediksi sebagai malignant (false positive).

4.5 Perbandingan Nilai k dan Pemilihan k Optimal

Berikut ini pengujian beberapa nilai k dan pemilihan k optimal yang digunakan dalam data kanker payudara:

# Menyiapkan nilai k yang diuji
k_values <- c(3, 5, 7, 9, 11)
akurasi_vektor <- numeric(length(k_values))
sensitivitas_vektor <- numeric(length(k_values))
spesifisitas_vektor <- numeric(length(k_values))
fn_vektor <- numeric(length(k_values))
# Pengujian iteratif untuk setiap nilai k
for (i in seq_along(k_values)) {
  k_val <- k_values[i]
  set.seed(12336) # agar hasil sama bila terjadi suara seri
  pred_uji <- knn(train = train_x, test = test_x, cl = train_y, k = k_val)
  cm <- confusionMatrix(data = pred_uji, reference = test_y, positive = "malignant")
  akurasi_vektor[i] <- cm$overall["Accuracy"]
  sensitivitas_vektor[i] <- cm$byClass["Sensitivity"]
  spesifisitas_vektor[i] <- cm$byClass["Specificity"]
  fn_vektor[i] <- cm$table["benign", "malignant"] # False Negative
}
# Menyusun data frame hasil eksperimen (tabel perbandingan metrik evaluasi)
tabel_akurasi <- data.frame(k = k_values,
                            Akurasi = akurasi_vektor,
                            Sensitivitas = sensitivitas_vektor,
                            Spesifisitas = spesifisitas_vektor,
                            FN = fn_vektor)
tabel_akurasi # Menampilkan seluruh hasil
##    k   Akurasi Sensitivitas Spesifisitas FN
## 1  3 0.9635036    0.9454545    0.9756098  3
## 2  5 0.9562044    0.9272727    0.9756098  4
## 3  7 0.9562044    0.9272727    0.9756098  4
## 4  9 0.9635036    0.9454545    0.9756098  3
## 5 11 0.9562044    0.9272727    0.9756098  4
# Menentukan k optimal: sensitivitas tertinggi (FN terkecil), lalu akurasi, lalu k terkecil
urut <- order(-tabel_akurasi$Sensitivitas, -tabel_akurasi$Akurasi,
              -tabel_akurasi$Spesifisitas, tabel_akurasi$k)
k_optimal <- tabel_akurasi$k[urut[1]]
cat("Nilai k paling optimal:", k_optimal, "\n")
## Nilai k paling optimal: 3

Hasil pengujian menunjukkan bahwa akurasi kelima model berkisar antara r round(acc_min * 100, 2)% sampai r round(acc_max * 100, 2)%, dengan akurasi tertinggi pada k = r paste(k_acc_max, collapse = “,”). Sensitivitas berkisar antara r round(sens_min * 100, 2)% sampai r round(sens_max * 100, 2)%, dengan nilai tertinggi pada k = r paste(k_sens_max, collapse = “,”). Jumlah false negative berkisar dari r fn_min sampai r fn_max kasus, dengan jumlah terkecil pada k = r paste(k_fn_min, collapse = “,”). Spesifisitas berkisar antara r round(spec_min * 100, 2)% sampai r round(spec_max * 100, 2)%, dengan nilai tertinggi pada k = r paste(k_spec_max, collapse = “,”). Selisih akurasi antar-k adalah r round(rentang_acc * 100, 2) poin persentase, sehingga kinerja K-NN pada rentang k = 3 sampai 11 tergolong r if (rentang_acc <= 0.02) “relatif stabil” else “cukup bervariasi”. Pemilihan k optimal dilakukan dengan mempertimbangkan bahwa false negative lebih berbahaya daripada false positive dalam diagnosis kanker. Oleh karena itu, kriteria utama adalah sensitivitas tertinggi (FN terkecil), kemudian akurasi tertinggi, lalu spesifisitas tertinggi, dan apabila masih sama dipilih k terkecil. Berdasarkan kriteria tersebut, nilai k yang paling optimal adalah k = r k_optimal.

4.6 Visualisasi Pengaruh Nilai k terhadap Akurasi

Berikut ini visualisasi pengaruh nilai k terhadap akurasi klasifikasi K-NN:

# Visualisasi kurva akurasi
ggplot(tabel_akurasi, aes(x = k, y = Akurasi)) +
  geom_line(color = "#2b5c8f", linewidth = 1.1) +
  geom_point(color = "#d95f02", size = 2.8) +
  scale_x_continuous(breaks = seq(3, 11, by = 2)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) +
  labs(
    title = "Pengaruh Hiperparameter k terhadap Akurasi Klasifikasi k-NN",
    subtitle = paste0("Evaluasi Generalisasi pada Data Uji Breast Cancer (Ukuran Sampel Uji = ", nrow(test_x), ")"),
    x = "Jumlah Tetangga Terdekat (k)",
    y = "Akurasi Prediksi"
  ) +
  theme_minimal(base_size = 11) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5),
    panel.grid.minor = element_blank()
  )
Kurva Hubungan Nilai k terhadap Akurasi Model k-NN pada Dataset Breast Cancer

Kurva Hubungan Nilai k terhadap Akurasi Model k-NN pada Dataset Breast Cancer

Grafik menunjukkan perubahan akurasi model pada k = 3, 5, 7, 9, dan 11 dengan r nrow(test_x) pengamatan data uji. Akurasi berada pada rentang r round(acc_min * 100, 2)% sampai r round(acc_max * 100, 2)%, dan titik tertinggi terdapat pada k = r paste(k_acc_max, collapse = “,”). Karena data uji relatif kecil, selisih satu pengamatan yang salah diklasifikasikan setara dengan perubahan akurasi sekitar r round(100 / nrow(test_x), 2) poin persentase, sehingga naik-turun garis pada grafik perlu dibaca hati-hati dan tidak selalu menandakan perbedaan kualitas model yang besar. Secara teori, k yang kecil menghasilkan batas keputusan yang lebih rumit (bias rendah, varians tinggi), sedangkan k yang besar menghasilkan batas keputusan yang lebih halus (bias tinggi, varians rendah) dan dapat condong ke kelas mayoritas, yaitu benign. Sebagai pembanding, akurasi bila seluruh data uji diprediksi sebagai kelas mayoritas (no information rate) adalah r round(nir_opt * 100, 2)%, sehingga model K-NN memberikan peningkatan sebesar r round((best$Accuracy - nir_opt) * 100, 2) poin persentase di atas prediksi naif. Nilai balanced accuracy sebesar r round(bacc_opt * 100, 2)% dan koefisien Kappa sebesar r round(kappa_opt, 4) menunjukkan kesesuaian antara prediksi dan kelas aktual setelah memperhitungkan faktor kebetulan.

Kasus false negative (tumor ganas yang diprediksi jinak) adalah kesalahan yang paling perlu dihindari karena dapat menunda penanganan pasien, sedangkan false positive hanya berdampak pada pemeriksaan lanjutan yang sebenarnya tidak diperlukan. Oleh sebab itu, pemilihan k = r k_optimal dengan r best$FN kasus false negative dinilai paling sesuai dengan tujuan pemodelan. Namun, jumlah data uji yang relatif kecil (r n_uji pengamatan) membuat metrik sangat dipengaruhi oleh beberapa pengamatan saja, sehingga hasil ini mencerminkan satu skenario pembagian data dan sebaiknya divalidasi lebih lanjut, misalnya dengan validasi silang (cross-validation). K-NN juga merupakan lazy learning yang tidak menghasilkan persamaan model sehingga interpretasi dilakukan melalui kinerja prediksi, bukan melalui koefisien.

BAB V KESIMPULAN

5.1 Kesimpulan

Machine Learning adalah studi tentang algoritma untuk mempelajari bagaimana melakukan tugas-tugas tertentu yang dilakukan secara otomatis oleh orang-orang. Di sini, belajar mengacu pada kemampuan untuk melakukan berbagai kegiatan yang sudah ada atau untuk mengekstrapolasi kesimpulan baru dengan benar dari berbagai pola yang diamati sebelumnya. Salah satu subbidang kecerdasan buatan, Machine Learning, dapat berdampak pada sejumlah bidang lain, termasuk statistik, matematika, dan banyak bidang teoretis ilmu komputer. Intinya, tujuan machine learning adalah untuk mengembangkan algoritma yang dapat mengeksekusi sistem pembelajaran otonom dengan sangat sedikit masukan dari orang-orang pada umumnya.

K-Nearest Neighbors (K-NN) adalah algoritma supervised learning non-parametrik berjenis lazy learning yang mengklasifikasikan data baru berdasarkan suara terbanyak dari \(k\) tetangga terdekatnya pada data latih. Karena berbasis jarak, algoritma ini memerlukan penskalaan fitur agar variabel dengan rentang besar tidak mendominasi perhitungan jarak, dan pemilihan nilai \(k\) mengendalikan kompromi antara bias dan varians.

Algoritma K-Nearest Neighbors (𝑘-NN) pertama kali digagas oleh Fix & Hodges (1951) sebagai metode klasifikasi non-parametrik dalam laporan penelitian militer USAF School of Aviation Medicine. Landasan teoritis konvergensinya kemudian dibuktikan secara analitis dan dipublikasikan secara luas. Berbeda dengan algoritma parametrik (seperti Linear Discriminant Analysis atau Regresi Logistik) yang mengasumsikan bentuk distribusi data apriori tertentu, 𝑘-NN termasuk ke dalam kelompok instance-based learning atau lazy learning. Model ini tidak membentuk fungsi perantara (explicit hypothesis model) pada tahap pelatihan, melainkan menyimpan seluruh data pelatihan dan menunda komputasi hingga terdapat data baru (query point) yang hendak diprediksi.

Berdasarkan hasil analisis pada data Wisconsin Breast Cancer yang telah dibersihkan (r n_bersih pengamatan setelah r na_total pengamatan dengan missing value dihapus), dengan sembilan prediktor yang dinormalisasi min-max dan pembagian 80:20 (r n_latih data latih dan r n_uji data uji, set.seed(12336)), diperoleh bahwa model K-NN untuk \(k \in \{3, 5, 7, 9, 11\}\) menghasilkan akurasi antara r round(acc_min * 100, 2)% dan r round(acc_max * 100, 2)%, sensitivitas antara r round(sens_min * 100, 2)% dan r round(sens_max * 100, 2)%, serta spesifisitas antara r round(spec_min * 100, 2)% dan r round(spec_max * 100, 2)%. Dengan mempertimbangkan pentingnya meminimalkan false negative pada diagnosis tumor ganas, nilai \(k\) yang paling optimal adalah \(k\) = r k_best, dengan akurasi r round(best\(Accuracy * 100, 2)%, sensitivitas r round(best\)Sensitivity * 100, 2)%, spesifisitas r round(best\(Specificity * 100, 2)%, dan jumlah false negative sebanyak r best\)FN kasus. Mengingat jumlah data uji yang relatif kecil, hasil ini mencerminkan satu skenario pembagian data sehingga perlu divalidasi lebih lanjut.

5.2 Saran

Ketika menggunakan program R, diperlukan ketelitian dalam penulisan sintaks, pemasukan data, dan perhitungan agar hasil yang diperoleh sesuai harapan, termasuk ketepatan menentukan kelas positif dan penggunaan set.seed agar hasil dapat direproduksi. Untuk penelitian selanjutnya disarankan menggunakan validasi silang untuk memilih \(k\) secara lebih andal, mencoba metrik jarak lain seperti Manhattan atau Mahalanobis, serta membandingkan K-NN dengan algoritma klasifikasi lain seperti Support Vector Machine atau Artificial Neural Network.

DAFTAR PUSTAKA

Bintoro, P., Ratnasari., Wihardjo, E., Putri, I. P., & Asari, A. (2024). Pengantar Machine Learning.

Cover, T., & Hart, P. (1967). Nearest neighbor pattern classification. IEEE Transactions on Information Theory, 13(1), 21–27.

Cunningham, P., & Delany, S. J. (2021). k-Nearest Neighbour Classifiers - A Tutorial. ACM Computing Surveys (CSUR), 54(6), 1–25.

Daulay, R. S. A. (2024). Analisis Kritis dan Pengembangan Algoritma K-Nearest Neighbor (KNN): Sebuah Tinjauan Literatur. Jurnal Pendidikan Sains dan Komputer Volume 4, Number 2, Oktober 2024.

Fathurohman, A. (2021). Machine Learning Untuk Pendidikan: Mengapa Dan Bagaimana. Jurnal JITEK, 1(3), 57–62.

Fix, E., & Hodges, J. L. (1951). Discriminatory Analysis. Nonparametric Discrimination: Consistency Properties. USAF School of Aviation Medicine, Report No. 4, Project 21-49-004.

Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Laboratorium Statistika, Universitas Bengkulu.

Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning: Data Mining, Inference, and Prediction (2nd ed.). Springer New York.