Postingan ini dirancang untuk memberikan pemahaman dasar tentang pengklasifikasi k-Neighbours dan menerapkannya menggunakan python. Hal ini sama sekali tidak dimaksudkan untuk menjelaskan secara menyeluruh.

k-Nearest Neighbors (kNN) adalah algoritma dimana titik data yang tidak terklasifikasi diklasifikasikan berdasarkan jaraknya dari titik yang diketahui. Meskipun paling sering digunakan sebagai pengklasifikasi, ini juga dapat digunakan untuk memecahkan masalah regresi. Contoh berikut akan digunakan dalam posting ini:

Dalam contoh dasar di atas, model kami mencoba memprediksi apakah suatu kendaraan merupakan SUV atau sedan hanya berdasarkan 2 faktor. Efisiensi Bahan Bakar (diberi label MPG) berada pada sumbu x- dan bobot kendaraan berada pada sumbu y-. Bintang merah mewakili titik data yang tidak diketahui, sedangkan titik ungu menunjukkan sedan, dan titik kuning menunjukkan SUV.

Cara model k-Nearest Neighbors memutuskan cara mengklasifikasikan titik yang tidak diketahui adalah dengan membuat lingkaran dengan titik sebagai pusatnya. Ukuran lingkaran diatur dengan memilih hyperparameter, k. Pengaturan ini tidak mengacu pada ukuran sebenarnya dari lingkaran, namun mengacu pada berapa banyak titik tetangga yang berada di dalam lingkaran.

Dengan tidak adanya hyperparameter lain yang ditetapkan, jumlah tetangga dari masing-masing kelas dihitung, dan klasifikasi dibuat melalui “pemungutan suara”, yang berarti bahwa kelas yang paling sering terlihat dalam lingkaran dipilih untuk titik yang tidak diketahui.

Perhatikan pada contoh di atas, lingkaran yang lebih kecil melambangkan k = 3. Di dalam lingkaran tersebut terdapat 2 titik ungu (sedan) dan 1 titik kuning (SUV). Modelnya melakukan pemungutan suara, dan karena titik ungunya lebih banyak, titik yang tidak diketahui tersebut diklasifikasikan sebagai sedan.

Pada lingkaran yang lebih besar, dimana k = 6,ada 4 titik kuning dan 2 titik ungu. Jadi jika Anda menyetel parameter n_neighbors ke 6, kendaraan yang tidak dikenal tersebut akan diklasifikasikan sebagai SUV.

Menggunakan kNN dengan python

kNN mengikuti alur kerja yang serupa dengan model yang diawasi lainnya dan merupakan salah satu model yang lebih mudah digunakan. Anda mulai dengan mengatur X (fitur) dan y (target) dan melakukan train_test_split():

Selanjutnya, seperti pada kebanyakan model lainnya, Anda harus menskalakan data Anda. Ingatlah bahwa hanya ada sedikit situasi di mana data tidak boleh diskalakan. Jika Anda membaca postingan ini untuk tujuan pendidikan, kemungkinan besar Anda tidak cukup berpengalaman untuk memutuskan untuk tidak melakukan penskalaan. Penskalaan adalah proses sederhana yang dapat dilakukan hanya dalam beberapa baris kode. Setelah mengimpor, buat instance StandardScaler(), fit_transform ke set kereta, dan transform set pengujian.

Sekarang kita akan membuat instance model kNN, menyesuaikannya dengan set pengujian, dan menilai set pelatihan dan set pengujian secara terpisah. Kami tidak akan mengubah satu pun hyperparameter untuk saat ini, jadi k_neighbors akan disetel ke default 5

Sekarang lihat prediksi dan probabilitasnya, yang akan memberikan wawasan tentang seberapa dekat perolehan suara untuk setiap titik data.

Perhatikan bahwa dengan melihatprediksi_proba(), Anda dapat mengetahui berapa banyak tetangga di sekitarnya yang diklasifikasikan. Karena n_neighbours disetel ke default 5, setiap “suara” bernilai 0,2. Dalam contoh di atas, setiap poin yang dipilih sebagai [1. , 0. ]adalah hasil suara 5–0. Setiap suara [0.6, 0.4]adalah suara 3–2.

kNN di GridSearchCV

Beberapa hyperparameter yang paling umum adalah:
- n_neighbors, yang telah disebutkan sebelumnya
- weights yang dapat disetel ke 'seragam', di mana setiap tetangga dalam batas memiliki bobot atau 'jarak' yang sama di mana poin yang lebih dekat akan lebih berpengaruh pada keputusan. Perhatikan bahwa ketika weights = 'distance' kelas dengan angka tertinggi dalam batas tidak boleh “memenangkan suara”
- metric yang mengacu pada bagaimana jarak titik tetangga dipilih dari titik yang tidak diketahui. Karena pemodelan umumnya dilakukan dalam lebih dari 3 dimensi, hal ini mungkin sulit untuk divisualisasikan.

Kode berikut akan memberi Anda format dasar tentang cara melakukan GridSearchCV yang dapat diadaptasi untuk model apa pun dengan sedikit modifikasi:

Sedikit catatan tentang GridSearch ini. Pertama, perhatikan bahwa n_neighbors selalu berupa bilangan ganjil. Anda dapat memilih nomor genap, tetapi jika terjadi pemungutan suara seri, keputusan kelas mana yang akan ditetapkan akan dilakukan secara acak ketika weights disetel ke seragam. Dengan memilih angka ganjil maka tidak ada ikatan. Hal penting lainnya yang perlu diperhatikan adalah saat Anda melakukan GridSearch, Anda menjalankan lebih banyak model dibandingkan saat Anda sekadar menyesuaikan dan mencetak skor. Pada GridSearch diatas terdapat :

4 kemungkinan untuk n_neighbors *
2 kemungkinan untuk weights *
2 kemungkinan untuk metric *
3 validasi silang

Dengan total 4 * 2 * 2 * 3 = 48 total waktu menjalankan model. Penting untuk mengatur verbose sehingga Anda akan mendapatkan masukan tentang model dan mengetahui berapa lama waktu yang dibutuhkan untuk menyelesaikannya. kNN membutuhkan waktu lama untuk diselesaikan karena kNN mengukur jarak individu untuk setiap titik dalam set pengujian.

Hal lain yang perlu diperhatikan dari GridSearch adalah n_jobs = -1. Dengan menyetel n_jobs ke -1, Anda memberi tahu komputer untuk menggunakan semua prosesornya untuk menjalankan model tersebut. Perlu diperhatikan bahwa kesalahpahaman umum adalah bahwa -1 berarti menggunakan “total prosesor -1” (yaitu 4–1 = 3 prosesor), namun hal ini ditafsirkan oleh komputer sebagai penggunaan semua prosesor.

Untuk info lebih lanjut tentang hyperparameter kNN

Terakhir, untuk mengembalikan parameter dan skor terbaik untuk model Anda dari pencarian grid, gunakan perintah berikut:

Sesuatu yang saya sebutkan sebelumnya tetapi ingin dikembangkan, adalah adanya model KNeighboursRegressor yang bekerja dengan menggabungkan data dari titik-titik tetangga untuk membuat prediksi secara berkelanjutan y variable. Jarang digunakan, tetapi memang ada.

Haruskah Anda menggunakan kNN?

Jawaban atas pertanyaan ini, seperti yang sering kali dijawab dalam ilmu data, adalah “Tergantung.” kNN mudah digunakan dan dapat memberikan hasil yang sangat akurat dan bermakna. Ini juga cenderung mahal secara komputasi, jadi ini mungkin bukan pilihan terbaik Anda untuk kumpulan data yang lebih besar. Jika Anda memiliki kumpulan data yang lebih besar dengan klasifikasi biner, regresi logistik sederhana mungkin merupakan pilihan yang lebih baik. Dalam kasus lain, pengklasifikasi hutan acak bisa menjadi pilihan yang lebih baik. Jika Anda punya waktu, ada baiknya Anda mencoba sebanyak mungkin model untuk mendapatkan prediksi paling akurat dalam pembelajaran mesin.