1. Pengertian K-Nearest Neighbor (KNN)
Nearest Neighbor atau k-Nearest Neighbor (kNN) merupakan salah satu algoritme klasifikasi dalam data mining yang memanfaatkan data terdekat untuk melakukan prediksi pada data baru yang belum dikenal (data uji). Algoritme ini bekerja dengan cara mencari sejumlah tetangga terdekat dari data uji dan menentukan kelas data uji tersebut berdasarkan mayoritas kelas dari tetangga terdekat (data latih) yang ditemukan. Nearest Neighbor dapat digunakan untuk menangani berbagai jenis data, baik data numerik maupun kategorikal. Pada data kategorikal, perhitungan jarak perbedaan atau kesamaan tidak dapat dihitung menggunakan operasi matematik seperti yang dapat dilakukan pada data numerik. Nearest Neighbor lebih efektif pada data dengan dimensi yang rendah atau sedang. Selain itu, algoritme ini juga efektif untuk dataset dengan jumlah data yang kecil hingga sedang, karena semakin besar jumlah data yang digunakan maka waktu yang dibutuhkan untuk melakukan klasifikasi semakin lama. Tak hanya memiliki kelebihan, kNN juga memiliki kekurangan seperti sensitif terhadap nilai pencilan (outlier) dan ketidakseimbangan kelas (class imbalance). Untuk mempermudah pemahaman kita, perhatikan gambar di bawah ini:
Penjelasan yang hanya berupa teoritis kadang kala sulit untuk kita pahami dengan baik, untuk menghindari hal tersebut kita akan menggunakan contoh kasus untuk menyederhanakan penjelasan sebelumnya. Gambar di atas mengindikasikan sebuah dataset yang memiliki dua kelas, yaitu kelas positif dan negatif. Kelas positif diwakili oleh gambar lingkaran kecil berwarna kuning sedangkan kelas negatif diwakili gambar segitiga berwarna hijau. Pada contoh kasus ini, kita ingin menentukan kelas dari data uji (yang ditunjukkan gambar bintang berwarna merah) menggunakan kNN.
Terlihat gambar di atas menggunakan dua nilai k, yaitu k=3 dan k=6. kNN bekerja dengan mencari sejumlah tetangga terdekat dari data uji yang belum dikenal dan menentukan kelasnya berdasarkan mayoritas kelas tetangga tersebut. Ketika k=3, artinya kita akan mencari tiga tetangga terdekat dari data uji yang belum dikenal. Dalam contoh tersebut, dua dari tiga tetangga terdekat tergolong ke dalam kelas positif dan satu tetangga terdekat tergolong ke dalam kelas negatif. Karena mayoritas kelas tetangga terdekat adalah kelas positif, maka data uji akan diklasifikasikan sebagai kelas positif.
Namun, ketika k=6, artinya kita akan mencari enam tetangga terdekat dari data uji yang belum dikenal. Dalam contoh tersebut, empat dari enam tetangga terdekat tergolong ke dalam kelas negatif dan dua tetangga terdekat tergolong ke dalam kelas positif. Karena mayoritas kelas tetangga terdekat adalah kelas negatif, maka data uji akan diklasifikasikan sebagai kelas negatif. Dalam contoh tersebut, kita dapat melihat bahwa nilai k yang berbeda-beda dapat memberikan hasil klasifikasi yang berbeda pula. Oleh karena itu, pemilihan nilai k yang tepat sangat penting dalam penggunaan algoritme kNN.
2. Cara Kerja K-Nearest Neighbor (KNN)
Nearest Neighbor (NN) adalah salah satu algoritma machine learning yang paling sederhana namun cukup efektif dalam melakukan klasifikasi. Algoritma NN berdasarkan pada konsep “kesamaan” antara data, yang dapat dihitung dengan jarak Euclidean, Manhattan atau Minkowski distance. Pada dasarnya, algoritma ini mencari data latih yang paling mirip dengan data uji yang akan diklasifikasikan, dan memberikan label kelas yang sama dengan data latih tersebut. Secara umum, alur kerja Nearest Neighbor adalah sebagai berikut:
- Tentukan jumlah tetangga terdekat (K) yang akan dipilih
Pertama-tama, kita harus menentukan nilai K terlebih dahulu untuk algoritme Nearest Neighbor. Penentuan nilai K tidak memiliki rumus pasti, tetapi ada beberapa tips yang dapat dipertimbangkan. Misalnya, jika jumlah kelas adalah genap, disarankan untuk memilih nilai K ganjil, sedangkan jika jumlah kelas adalah ganjil, disarankan memilih nilai K genap. Alasannya adalah jika kita memilih nilai K yang genap pada kasus dengan dua kelas, misalnya kelas A dan B, maka ada kemungkinan hasil dari 4 tetangga terdekat terdiri dari 2 kelas A dan 2 kelas B sehingga hasilnya akan sama, yaitu A atau B. Namun, jika kita memilih nilai K yang ganjil, misalnya 3 atau 5, maka akan ada tetangga terdekat yang lebih banyak jumlahnya, sehingga hasilnya akan lebih variatif.
2. Hitung jarak antara data uji dengan semua data latih
Setelah menentukan nilai K, langkah selanjutnya dalam algoritme Nearest Neighbor adalah menghitung jarak antara data uji dengan semua data latih. Jarak ini dapat dihitung menggunakan berbagai metode, seperti Euclidean distance, Manhattan distance, Minkowski distance, cosine similarity, atau yang lainnya. Dalam perhitungan jarak, setiap fitur pada kedua data akan diperhitungkan dan diakumulasikan menjadi satu skor jarak. Semakin kecil skor jarak, semakin mirip kedua data tersebut. Proses ini akan diulang untuk semua data latih yang tersedia.
3. Urutkan data latih berdasarkan jarak dari yang terdekat ke yang terjauh dengan data uji
Setelah kita menghitung jarak antara data latih dengan data uji menggunakan suatu metrik, langkah selanjutnya adalah mengurutkan data latih berdasarkan jarak dari yang terdekat ke yang terjauh dengan data uji. Dalam hal ini, data latih yang paling dekat dengan data uji akan ditempatkan di bagian atas daftar, sedangkan data latih yang paling jauh akan ditempatkan di bagian bawah daftar. Hal ini dilakukan untuk memudahkan dalam mencari tetangga terdekat dari data uji pada langkah selanjutnya. Dengan mengurutkan data latih berdasarkan jarak, kita dapat memastikan bahwa k-nearest neighbor yang dipilih benar-benar merupakan tetangga terdekat dari data uji.
4. Pilih K data dengan jarak terdekat dari data uji
Setelah data latih diurutkan berdasarkan jarak terdekat dengan data uji, selanjutnya pilih K data dengan jarak terkecil. Banyaknya K di sini berdasarkan jumlah K yang telah ditentukan di awal.
5. Hitung frekuensi masing-masing kategori pada K data yang telah dipilih
Dalam penghitungan frekuensi ini, setiap kategori akan dihitung berapa kali muncul pada K data tersebut dan kemudian dicatat jumlahnya. Dengan mengetahui frekuensi masing-masing kategori, kita dapat menentukan kategori mana yang paling banyak muncul dan kemudian menjadikannya sebagai hasil prediksi untuk data yang sedang dicari kategori-nya.
3. Latihan / Study Kasus
Kita akan menggunakan dataset diabetes.xlsx sebagai kasus, dimana dataset ini memuat informasi mengenai diabetes yang dikategorikan menjadi positif dan negatif. Seluruh isi tupel dalam dataset ini memiliki tipe data numerik, hal ini karena kita akan melakukan perhitungan jarak dengan menggunakan kNN. Berikut ini adalah tampilan dari dataset tersebut:

Dalam dataset ini terdapat label dengan dua kategori, yakni 0 untuk hasil negatif dan 1 untuk hasil positif. Terdapat pula sebuah baris data uji yang akan digunakan untuk menentukan apakah hasilnya positif atau negatif. Tujuan dari perhitungan ini adalah untuk mengklasifikasikan data uji tersebut berdasarkan fitur-fitur yang ada dalam dataset. Dengan menggunakan algoritma nearest neighbor, kita akan mencari data pada dataset yang paling mirip dengan data uji dan kemudian menentukan kategori hasilnya berdasarkan label dari data yang mirip tersebut.
Langkah pertama, kita tentukan parameter K. Misalnya kita buat jumlah tetangga terdekat K=3.
Langkah kedua, kita hitung jarak antara data uji dengan seluruh data latih. Pada kasus ini, perhitungan jarak dilakukan menggunakan teknik Euclidean distance dengan rumus berikut:

Kemudian, kita masukkan dataset yang kita miliki ke dalam persamaan matematika di atas, sehingga diperoleh hasil seperti di bawah ini:

Untuk memudahkan kita dalam menganalisa jarak yang diperoleh setiap data latih dengan data uji, hasil perhitungan di atas akan kita sajikan dalam bentuk tabular seperti berikut:

Berikutnya, untuk menentukan nilai label pada data uji, kita dapat mencari jarak terdekat dengan data latih pada kumpulan data yang telah tersedia. Caranya adalah dengan melakukan pengurutan data berdasarkan jarak terkecil ke terbesar pada kolom Distance dengan metode ascending. Dengan demikian, data yang memiliki jarak terdekat dengan data uji akan muncul di urutan pertama dalam daftar data terurut tersebut.

Setelah data diurutkan berdasarkan jarak terkecil hingga tersesar, kemudian kita ambil tiga data dengan jarak terdekat. Pada tabel di atas terlihat data pertama dan kedua masuk ke dalam kategori 0 serta data ketiga masuk dalam kategori 1. Sehingga dapat ditarik kesimpulan bahwa data uji tersebut masuk ke dalam kategori “0” karena dari tiga tetangga terdekat, ada dua data yang masuk kategori 0, sementara hanya ada satu data yang masuk kategori 1.
4. Python Coding
Pada kesempatan ini, kita akan membahas contoh kasus penggunaan algoritme k-Nearest Neighbors (kNN) untuk melakukan klasifikasi pada dataset breast-cancer-wisconsin.xlsx yang terdiri dari 11 fitur. Tujuan dari contoh kasus ini adalah untuk membangun model klasifikasi yang dapat memprediksi apakah tumor pada payudara seseorang bersifat jinak atau ganas berdasarkan fitur-fitur yang ada. Untuk mencapai tujuan ini, kita akan menggunakan Google Colab dan Orange Data Mining untuk mengimplementasikan algoritme kNN. Dalam proses ini, kita akan mengenal lebih jauh tentang bagaimana algoritme kNN bekerja dan bagaimana cara mengimplementasikannya untuk melakukan klasifikasi pada dataset. Berikut adalah penjelasan untuk setiap fitur yang terdapat pada dataset yang akan digunakan:
- ‘Id’: Merupakan nomor identifikasi unik untuk setiap sampel data.
- ‘Clump_thickness’: Merupakan ukuran tebal dari gumpalan sel yang terkandung dalam tumor payudara. Nilai fitur ini diberikan pada skala 1 hingga 10, dengan nilai yang lebih tinggi menunjukkan tumor yang lebih tebal.
- ‘Uniformity_Cell_Size’: Merupakan ukuran sel yang seragam pada tumor payudara. Nilai fitur ini diberikan pada skala 1 hingga 10, dengan nilai yang lebih tinggi menunjukkan bahwa ukuran sel lebih seragam.
- ‘Uniformity_Cell_Shape’: Merupakan bentuk sel yang seragam pada tumor payudara. Nilai fitur ini diberikan pada skala 1 hingga 10, dengan nilai yang lebih tinggi menunjukkan bahwa bentuk sel lebih seragam.
- ‘Marginal_Adhesion’: Merupakan kemampuan sel-sel tumor payudara untuk melekat pada sel-sel jaringan sekitarnya. Nilai fitur ini diberikan pada skala 1 hingga 10, dengan nilai yang lebih tinggi menunjukkan kemampuan melekat yang lebih kuat.
- ‘Single_Epithelial_Cell_Size’: Merupakan ukuran sel yang terdapat pada permukaan tumor payudara. Nilai fitur ini diberikan pada skala 1 hingga 10, dengan nilai yang lebih tinggi menunjukkan ukuran sel yang lebih besar.
- ‘Bare_Nuclei’: Merupakan kandungan inti sel yang tidak memiliki membran nuklir pada tumor payudara. Nilai fitur ini diberikan pada skala 1 hingga 10, dengan nilai yang lebih tinggi menunjukkan kandungan inti sel yang lebih banyak.
- ‘Bland_Chromatin’: Merupakan derajat perubahan kromosom pada sel-sel tumor payudara. Nilai fitur ini diberikan pada skala 1 hingga 10, dengan nilai yang lebih tinggi menunjukkan perubahan kromosom yang lebih signifikan.
- ‘Normal_Nucleoli’: Merupakan jumlah inti sel normal pada tumor payudara. Nilai fitur ini diberikan pada skala 1 hingga 10, dengan nilai yang lebih tinggi menunjukkan jumlah inti sel normal yang lebih banyak.
- ‘Mitoses’: Merupakan jumlah pembelahan sel yang terjadi pada tumor payudara. Nilai fitur ini diberikan pada skala 1 hingga 10, dengan nilai yang lebih tinggi menunjukkan pembelahan sel yang lebih sering terjadi.
- ‘Class’: Merupakan label kelas yang digunakan untuk memprediksi apakah tumor pada payudara seseorang bersifat jinak (nilai 2) atau ganas (nilai 4). Nilai ini akan menjadi target dalam pembuatan model klasifikasi.
Untuk memulai pembuatan model kNN di Google Colab, langkah pertama yang harus dilakukan adalah dengan membuat sebuah lembar kerja baru. Setelah itu, ikuti setiap baris kode yang tersedia untuk menjalankan algoritme kNN pada platform tersebut.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as snsKeterangan kode:
- import pandas as pd mengimport library pandas dengan singkatan pd yang berfungsi untuk mengubah dimensi data, membuat tabel, memeriksa data, membaca data dan lain sebagainya.
- import numpy as np, memanggil library numpy dengan singkatan np untuk memudahkan operasi perhitungan tipe data numerik seperti penjumlahan, perkalian, pengurangan, pemangkatan dan operasi artimatika lainnya.
- import seaborn as sns, seaborn dengan singkatan sns berfungsi sebagai library yang digunakan untuk menampilkan visualisasi data.
- import matplotlib.pyplot as plt, memanggil library matplotlib dengan singkatan plt untuk membuat chart atau grafik.
from google.colab import drive
drive.mount('/content/drive')Keterangan kode:
- perintah untuk mengimport google drive yang digunakan untuk menavigasi file di google drive dengan google colab, contohnya file dataset.
df = pd.read_excel("/content/drive/MyDrive/Buku DM/dataset/breast-cancer-wisconsin.xlsx")
dfKeterangan kode:
- df = pd.read_excel(“/content/drive/MyDrive/Buku DM/dataset/breast-cancer-wisconsin.xlsx”), perintah yang digunakan untuk membaca dataset yang tersimpan di dalam Google Drive kita dalam format excel.
- df, perintah untuk menampilkan seluruh isi dataset yang kita gunakan. Hasilnya seperti di bawah ini:

df.drop('Id', axis=1, inplace=True)
df.info()Keterangan kode:
- df.drop(‘Id’, axis=1, inplace=True), menghapus kolom ‘Id’ dari dataframe df.
- df.info(), mengetahui informasi dasar dari dataset yang kita gunakan seperti jumlah variabel, tipe data, jumlah data null, serta memori yang digunakan. Output nya seperti berikut:

df['Class'].value_counts()Keterangan kode:
- df[‘Class’].value_counts(), digunakan untuk menghitung jumlah kemunculan setiap nilai unik pada kolom ‘Class’ dalam dataframe df. Hasilnya:
2 458
4 241correlation = df.corr()
correlation['Class'].sort_values(ascending=False)Keterangan kode:
- correlation = df.corr(),melakukan perhitungan korelasi antar variabel pada DataFrame df dengan menggunakan fungsi corr() dari pandas.
- correlation[‘Class’].sort_values(ascending=False), mengakses baris korelasi antara variabel ‘Class’ dengan variabel lain pada DataFrame correlation, lalu dilakukan pengurutan nilai korelasi dari yang paling besar ke paling kecil menggunakan fungsi sort_values(). Hasil pengurutan ini kemudian ditampilkan sebagai output seperti berikut:

plt.figure(figsize=(10,8))
plt.title('Correlation of Attributes with Class variable')
a = sns.heatmap(correlation, square=True, annot=True, fmt='.2f', linecolor='white')
a.set_xticklabels(a.get_xticklabels(), rotation=90)
a.set_yticklabels(a.get_yticklabels(), rotation=30)
plt.show()Keterangan kode:
- plt.figure(figsize=(10,8)), membuat figure dengan ukuran 10x8.
- plt.title(‘Correlation of Attributes with Class variable’), memberikan judul pada plot.
- a = sns.heatmap(correlation, square=True, annot=True, fmt=’.2f’, linecolor=’white’), membuat heatmap dengan menggunakan library seaborn. correlation adalah dataframe yang berisi nilai korelasi antar atribut dan square=True membuat heatmap menjadi berbentuk kotak. annot=True menampilkan nilai korelasi pada setiap kotak heatmap. fmt=’.2f’ menunjukkan jumlah angka desimal yang akan ditampilkan. linecolor=’white’ membuat garis antar kotak heatmap menjadi berwarna putih.
- a.set_xticklabels(a.get_xticklabels(), rotation=90), mengatur label sumbu x dengan merotasi 90 derajat.
- a.set_yticklabels(a.get_yticklabels(), rotation=30), mengatur label sumbu y dengan merotasi 30 derajat.
- plt.show(), menampilkan plot yang sudah dibuat.

- Fitur “Class” memiliki korelasi positif yang tinggi dengan fitur “Uniformity_Cell_Size”, “Uniformity_Cell_Shape”, dan “Bare_Nuclei” dengan koefisien korelasi sebesar 0,82 dan 0,81.
- Fitur “Class” memiliki korelasi positif dengan fitur “Clump_thickness” dengan koefisien korelasi=0,72, “Marginal_Adhesion” dengan koefisien korelasi=0,70, dan “Normal_Nucleoli” dengan koefisien korelasi=0,71.
X = df.drop(['Class'], axis=1)
y = df['Class']Keterangan kode:
- X = df.drop([‘Class’], axis=1), digunakan untuk membuat variabel X yang berisi dataset tanpa kolom ‘Class’. Fungsi drop() digunakan untuk menghapus kolom ‘Class’ dari dataset df. Argumen axis=1 menunjukkan bahwa kolom yang dihapus adalah kolom, sedangkan axis=0 akan menghapus baris.
- y = df[‘Class’], digunakan untuk membuat variabel y yang berisi target atau label yang akan diprediksi oleh model.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = pd.DataFrame(scaler.fit_transform(X),columns=X.columns)
XKeterangan kode:
- from sklearn.preprocessing import StandardScaler, merupakan sintaks untuk mengimport modul StandardScaler dari library scikit-learn (sklearn).
- scaler = StandardScaler(), inisialisasi objek StandardScaler() yang disimpan ke dalam variabel scaler.
- X=pd.DataFrame(scaler.fit_transform(X),columns=X.columns), proses transformasi data dengan menggunakan objek scaler yang telah dibuat sebelumnya. fit_transform() digunakan untuk melakukan normalisasi data pada X dan menghasilkan nilai baru untuk X. Hasil normalisasi disimpan dalam variabel X dan dikonversi menjadi pandas dataframe. Kemudian, nama kolom pada dataframe yang dihasilkan sama dengan nama kolom pada dataset X sebelumnya.
- X, perintah untuk menampilkan seluruh isi dataset yang sudah dinormalisasi. Hasilnya seperti berikut:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
X_train.shape, X_test.shapeKeterangan kode:
- from sklearn.model_selection import train_test_split,
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0), menentukan hyperparameter untuk data training dan data testing. Data testing diatur sebanyak 0.20 atau 20% dari total keseluruhan dataset dan random_state=0 memiliki arti jika pemilihan data testing tidak akan berubah setiap kali kita mengatur nilainya dengan 0.
- X_train.shape, X_test.shape, merupakan properti dari objek numpy array yang mengindikasikan bentuk dari array tersebut. X_train.shape akan mengembalikan tuple berisi dua angka yang menunjukkan jumlah baris dan kolom dalam X_train. X_test.shape akan mengembalikan tuple berisi satu angka yang menunjukkan jumlah baris dalam X_test. Hasilnya adalah ((559, 9), (140, 9)).
X_trainKeterangan kode:
- X_train, digunakan untuk menampilkan data latih yang telah ditentukan pada proses sebelumnya. Hasilnya seperti ini:

X_testKeterangan kode:
- X_test, digunakan untuk menampilkan data uji yang telah ditentukan pada proses sebelumnya. Hasilnya seperti ini:

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3,weights='distance',metric='euclidean')
knn.fit(X_train, y_train)Keterangan kode:
- from sklearn.neighbors import KNeighborsClassifier, digunakan untuk mengimport class KNeighborsClassifier dari modul neighbors pada scikit-learn, yang digunakan untuk membuat model klasifikasi berdasarkan algoritma K-Nearest Neighbor (KNN).
- knn = KNeighborsClassifier(n_neighbors=3,weights=’distance’,metric=’euclidean’), digunakan untuk membuat objek dari class KNeighborsClassifier dan mengatur beberapa parameter algoritma. Parameter tersebut adalah:
- n_neighbors: jumlah tetangga terdekat yang akan dipertimbangkan dalam algoritma KNN, dalam kasus ini sebanyak 3.
- weights: metode perhitungan bobot jarak antara data point, dalam kasus ini menggunakan metode ‘distance’ yang berarti semakin dekat jaraknya semakin besar bobotnya.
- metric: metrik jarak yang digunakan untuk menghitung jarak antara data point, dalam kasus ini menggunakan ‘euclidean’ yang merupakan metrik jarak Euclidean.
- knn.fit(X_train, y_train), digunakan untuk melakukan training model KNN dengan menggunakan data training.
- Setelah kode di atas berhasil dijalankan, maka akan muncul tampilan seperti berikut:

y_pred = knn.predict(X_test)
y_predKeterangan kode:
- y_pred = knn.predict(X_test), Kode ini digunakan untuk memanggil fungsi predict dari objek knn (model KNN) untuk memprediksi hasil kelas (label) dari data uji X_test. Hasil prediksi tersebut akan disimpan pada variabel y_pred.
- y_pred, digunakan untuk melihat nilai-nilai prediksi yang dihasilkan oleh model KNN untuk data uji yang telah disediakan sebelumnya. Hasilnya seperti berikut:
array([2, 2, 4, 2, 4, 2, 4, 2, 4, 2, 2, 2, 4, 4, 4, 2, 2, 4, 4, 2, 4, 4, 2, 2, 2, 4, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 4, 2, 4, 2, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4, 2, 2, 4, 4, 4, 4, 2, 2, 4, 2, 2, 4, 4, 2, 2, 2, 2, 4, 2, 2, 2, 4, 2, 2, 2, 4, 2, 4, 4, 2, 2, 2, 4, 2, 2, 2, 4, 2, 4, 4, 2, 2, 2, 4, 2, 2, 2, 2, 2, 4, 4, 4, 2, 2, 2, 2, 2, 4, 4, 4, 4, 2, 4, 2, 2, 4, 4, 4, 4, 4, 2, 2, 4, 4, 2, 2, 4, 2, 2])from sklearn.metrics import accuracy_score
print('Model accuracy score: {0:0.4f}'. format(accuracy_score(y_test, y_pred)))Keterangan kode:
- from sklearn.metrics import accuracy_score, mengimpor modul accuracy_score dari sklearn.metrics. Modul ini akan digunakan untuk menghitung akurasi model.
- print(‘Model accuracy score: {0:0.4f}’. format(accuracy_score(y_test, y_pred))), mencetak nilai akurasi dari model yang telah dibuat. Fungsi accuracy_score() akan membandingkan hasil prediksi y_pred dengan label asli dari data uji y_test untuk menghitung akurasi model. Hasil cetakan akan menampilkan nilai akurasi dengan empat angka di belakang koma. Hasilnya: Model accuracy score: 0.9714
y_pred_train = knn.predict(X_train)
print('Training-set accuracy score: {0:0.4f}'. format(accuracy_score(y_train, y_pred_train)))Keterangan kode:
- y_pred_train = knn.predict(X_train), baris kode ini akan memprediksi kelas target menggunakan model kNN (K-Nearest Neighbor) yang telah dilatih sebelumnya pada data latih X_train. Hasil prediksi ini akan disimpan dalam variabel y_pred_train.
- print(‘Training-set accuracy score: {0:0.4f}’. format(accuracy_score(y_train, y_pred_train))), menampilkan akurasi dari hasil prediksi pada data latih dengan format empat angka di belakang koma. Nilai akurasi dihitung dengan membandingkan nilai target variabel pada data latih (y_train) dengan hasil prediksi pada data latih (y_pred_train_en) menggunakan fungsi accuracy_score() dari library Scikit-learn. Hasilnya: Training-set accuracy score: 1.0000
print('Training set score: {:.4f}'.format(knn.score(X_train, y_train)))
print('Test set score: {:.4f}'.format(knn.score(X_test, y_test)))Keterangan kode:
- print(‘Training set score: {:.4f}’.format(knn.score(X_train, y_train))), digunakan untuk menampilkan skor akurasi model pada data training set dan kemudian hasilnya diformat dengan menggunakan {:.4f}, yang berarti angka desimal akan ditampilkan dengan 4 digit di belakang koma.
- print(‘Test set score: {:.4f}’.format(knn.score(X_test, y_test))), digunakan untuk menampilkan skor akurasi model pada data test set dan kemudian hasilnya diformat dengan menggunakan {:.4f}, yang berarti angka desimal akan ditampilkan dengan 4 digit di belakang koma. Hasilnya adalah Training set score: 1.0000 dan Test set score: 0.9714.
- Dari data tersebut dapat disimpulkan bahwa model yang dibangun memiliki performa yang baik. Hal ini dilihat dari nilai akurasi pada training set dan test set yang cukup tinggi dan tidak terdapat selisih yang signifikan antara keduanya. Oleh karena itu, model tersebut tidak mengalami overfitting pada saat melakukan prediksi pada data yang belum pernah dilihat sebelumnya.
y_test.value_counts()Keterangan kode:
- y_test.value_counts(), digunakan untuk menghitung jumlah kemunculan setiap kelas pada data uji. Hasilnya:
2 85
4 55- Angka 2 dan 4 di atas mengindikasikan kelas pada data uji.
- Angka 85 dan 55 menunjukkan jumlah kemunculan setiap kelas.
cm = confusion_matrix(y_test, y_pred)
print('Confusion matrix\n\n', cm)
print('\nTrue Negatives(TP) = ', cm[0,0])
print('\nTrue Positives(TN) = ', cm[1,1])
print('\nFalse Negatives(FP) = ', cm[0,1])
print('\nFalse Positives(FN) = ', cm[1,0])Keterangan kode:
- cm = confusion_matrix(y_test, y_pred), Membuat confusion matrix dengan menggunakan fungsi confusion_matrix dari library sklearn.metrics. Confusion matrix digunakan untuk menunjukkan klasifikasi yang salah dan benar dari suatu model. Pada kasus ini, variabel y_test adalah target yang sebenarnya (actual), sedangkan y_pred adalah target hasil prediksi dari model.
- print(‘Confusion matrix\n\n’, cm), Menampilkan confusion matrix dengan string “Confusion matrix” diikuti dengan isi matrix ‘cm’.
- print(‘\nTrue Negatives(TN) = ‘, cm[0,0]), Menampilkan jumlah True Negatives (TN) yang terdapat dalam confusion matrix. TN adalah jumlah prediksi negatif yang benar.
- print(‘\nTrue Positives(TP) = ‘, cm[1,1]), Menampilkan jumlah True Positives (TP) yang terdapat dalam confusion matrix. TP adalah jumlah prediksi positif yang benar.
- print(‘\nFalse Negatives(FN) = ‘, cm[0,1]), Menampilkan nilai False Negatives yang merupakan jumlah data positif yang terdeteksi salah sebagai negatif.
- print(‘\nFalse Positives(FP) = ‘, cm[1,0]), Menampilkan jumlah False Positives (FP) yang terdapat dalam confusion matrix. FP adalah jumlah prediksi positif yang salah.
- Berikut nilai confusion matrix yang dihasikan:
Confusion matrix
[[83 2]
[ 2 53]]
True Negatives(TP) = 83
True Positives(TN) = 53
False Negatives(FP) = 2
False Positives(FN) = 2plt.figure(figsize=(6,4))
cm_matrix = pd.DataFrame(cm, columns=['Actual Benign:2', 'Actual Malignant:4'], index=['Predict Benign:2', 'Predict Malignant:4'])
sns.heatmap(cm_matrix, annot=True, fmt='d', cmap='YlGnBu')Keterangan kode:
- plt.figure(figsize=(6,4)), membuat figure dengan ukuran 6 x 4 inci.
- cm_matrix = pd.DataFrame(cm, columns=[‘Actual Benign:2’, ‘Actual Malignant:4’], index=[‘Predict Benign:2’, ‘Predict Malignant:4’]), membuat DataFrame dengan nama cm_matrix berdasarkan cm, yaitu confusion matrix. Di sini, kolom pertama diisi dengan label aktual ‘Benign:2’ dan label aktual ‘Malignant:4’, sedangkan baris pertama diisi dengan label prediksi ‘Benign:4’ dan label prediksi ‘Malignant:4’.
- sns.heatmap(cm_matrix, annot=True, fmt=’d’, cmap=’YlGnBu’), membuat heatmap dari cm_matrix menggunakan library Seaborn. annot=True berarti angka confusion matrix ditampilkan pada heatmap, fmt=’d’ berarti angka ditampilkan sebagai bilangan bulat desimal, dan cmap=’YlGnBu’ adalah palet warna yang digunakan untuk heatmap. Grafik yang dihasilkan seperti berikut:

- Terlihat pada grafik heatmap di atas, class “2” atau benign (tumor jinak) memiliki nilai aktual sebanyak 85 data. Namun model memprediksi dengan benar sebanyak 83 data, 2 data lainnya diprediksi oleh model sebagai data yang masuk ke dalam class “4” atau malignant (tumor ganas).
- Untuk class “4” atau malignant memiliki data aktual sebanyak 55 data. Namun model memprediksi dengan data yang termasuk class “4” sebanyak 53 data, 2 data lainnya diprediksi oleh model sebagai data yang masuk ke dalam class “2” atau benign.
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))Keterangan kode:
- from sklearn.metrics import classification_report, menggunakan classification_report dari modul sklearn.metrics untuk menghasilkan laporan klasifikasi. Laporan ini berisi informasi tentang presisi, recall, nilai F1, dan dukungan untuk setiap kelas.
- print(classification_report(y_test, y_pred_en)), menampilkan laporan evaluasi klasifikasi pada data uji (y_test) menggunakan prediksi yang dihasilkan oleh model (y_pred_en). Hasilnya seperti di bawah ini:

Keterangan Hasil:
- Precision: mengukur proporsi hasil positif yang benar dari keseluruhan hasil yang dinyatakan sebagai positif oleh model. Dalam hal ini, precision untuk label “2” adalah 0.98, sedangkan untuk label “4” adalah 0.96. Ini berarti, ketika model memprediksi data masuk ke dalam label “2”, sebanyak 98% prediksi tersebut benar. Sedangkan ketika model memprediksi sebuah data masuk ke dalam label “4”, artinya sebanyak 98% prediksi tersebut benar.
- Recall: mengukur proporsi hasil positif yang benar dari keseluruhan data aktual yang positif. Dalam hal ini, recall untuk label “2” adalah 0.98, sedangkan untuk label “4” adalah 0.96. Ini berarti, ketika model memprediksi sebuah data termasuk label “2”, sebanyak 98% data aktual dengan label “2” berhasil ditemukan oleh model, sedangkan ketika model memprediksi label “4”, sebanyak 96% data aktual dengan label “4” berhasil ditemukan oleh model.
- F1-score: mengukur rata-rata harmonik dari precision dan recall. Dalam hal ini, f1-score untuk label “2” adalah 0.98, sedangkan untuk label “4” adalah 0.96. Semakin tinggi nilai f1-score, semakin baik performa model.
- Support: jumlah data aktual untuk setiap label pada data uji.
- Accuracy: mengukur proporsi hasil prediksi yang benar dari keseluruhan data uji. Dalam hal ini, akurasi model adalah 0.97, yang berarti sebanyak 97% dari data uji berhasil diprediksi dengan benar oleh model.
- Macro average: rata-rata dari precision, recall, dan f1-score untuk setiap label pada data uji.
- Weighted average: rata-rata dari precision, recall, dan f1-score untuk setiap label pada data uji, yang dihitung dengan mempertimbangkan proporsi jumlah data untuk setiap label.
Selain melakukan evaluasi menggunakan metrik di atas, pada tahap selanjutnya kita akan melakukan evaluasi menggunakan teknik k-fold cross validation. Teknik ini membagi dataset menjadi beberapa fold, kemudian dilakukan iterasi training dan testing pada setiap fold secara bergantian. Dengan melakukan evaluasi menggunakan metode ini, kita dapat memastikan bahwa performa model tidak hanya baik pada subset data tertentu, tetapi juga pada seluruh dataset. Selain itu, teknik k-fold cross validation juga dapat membantu mengatasi masalah overfitting dan underfitting pada model yang dibuat.
from sklearn.model_selection import cross_val_score
scores = cross_val_score(knn, X, y, cv = 10, scoring='accuracy')
print('Cross-validation scores:{}'.format(scores))Keterangan kode:
- from sklearn.model_selection import cross_val_score, Mengimport modul cross_val_score dari library sklearn.model_selection. Modul ini digunakan untuk melakukan cross-validation scoring pada model.
- scores = cross_val_score(knn, X, y, cv = 10, scoring=’accuracy’), Menerapkan cross_val_score pada model knn dengan menggunakan fitur X dan target y. cv=10 menandakan bahwa kita akan menggunakan 10-fold cross-validation. scoring=’accuracy’ menandakan bahwa kita ingin mengukur akurasi model.
- print(‘Cross-validation scores:{}’.format(scores)), Menampilkan cross-validation score dari model dengan format yang telah ditentukan. Hasilnya:
Cross-validation scores:[0.89285714 0.96428571 0.94642857 0.96428571 0.96428571 0.92857143 0.96428571 0.94642857 1. 0.98181818]print('Average cross-validation score: {:.2f}'.format(scores.mean()))Keterangan kode:
- print(‘Average cross-validation score: {:.2f}’.format(scores.mean())), Kode tersebut digunakan untuk mencetak rata-rata dari skor validasi silang (cross-validation) yang telah dihitung sebelumnya pada data tertentu dengan menggunakan model tertentu. Format yang digunakan adalah dua angka desimal setelah koma. Hasilnya:
Average cross-validation score: 0.96Nah, sekian dulu penjelasan saya Michael Sitorus terhadap implementasi KNN menggunakan bahasa pemrograman Python. Semoga bermanfaat.
Tidak ada komentar:
Posting Komentar