KNN Regression

"Katakan Siapa Tetanggamu, Aku Ramal Nilaimu"

1. Apa itu KNN?

K-Nearest Neighbors (KNN) adalah algoritma yang sangat sederhana dan intuitif. Prinsipnya: Data yang mirip atau berdekatan (tetangga) cenderung memiliki nilai target yang mirip juga.

Dalam konteks Regresi (menebak angka): KNN mencari $K$ tetangga terdekat dari data baru, lalu menghitung Rata-rata dari nilai target mereka.

Non-Parametrik: KNN tidak membuat asumsi rumus matematika (tidak ada $y = mx + c$). Dia murni menghafal data latihan ("Lazy Learner").

2. Visualisasi: Mencari Tetangga (K=3)

Rumah A (2M)
Rumah B (2.5M)
Rumah C (2.2M)
Rumah D (5M)
TARGET BARU?

Jika $K=3$, kita ambil 3 rumah terdekat (A, B, C).
Prediksi = $\frac{2.0 + 2.5 + 2.2}{3} = \mathbf{2.23 \text{ Milyar}}$.
(Rumah D diabaikan karena terlalu jauh).

3. Matematika: Euclidean Distance

Bagaimana KNN tahu siapa yang "dekat"? Paling umum menggunakan Jarak Euclidean (Garis Lurus).

$$ d(p, q) = \sqrt{(q_1 - p_1)^2 + (q_2 - p_2)^2 + \dots} $$
  • PENTING: Karena menghitung jarak, KNN SANGAT SENSITIF terhadap skala data.
    Anda WAJIB melakukan Feature Scaling (StandardScaler/MinMaxScaler) sebelum pakai KNN.
    Bayangkan: Jarak Gaji (jutaan) vs Jarak Umur (puluhan). Gaji akan mendominasi perhitungan jarak jika tidak discale.

4. Simulasi Perhitungan Manual

Kasus: Prediksi Berat Badan (kg) berdasarkan Tinggi (cm)

Data Latih:

  • Orang A: Tinggi 160, Berat 50
  • Orang B: Tinggi 165, Berat 55
  • Orang C: Tinggi 170, Berat 65
  • Orang D: Tinggi 180, Berat 80 (Jauh)

Target Baru: Tinggi 168 cm. Prediksi Beratnya? ($K=2$)

Orang Tinggi Latih Jarak ke 168 ($|x - 168|$) Status
C 170 $|170 - 168| = \mathbf{2}$ Tetangga 1
B 165 $|165 - 168| = \mathbf{3}$ Tetangga 2
A 160 $|160 - 168| = 8$ Jauh
D 180 $|180 - 168| = 12$ Sangat Jauh
Hitung Rata-rata 2 Tetangga Terdekat (B & C):
Berat B = 55, Berat C = 65.
Prediksi = $\frac{55 + 65}{2} = \mathbf{60 \text{ kg}}$.

5. Implementasi Python (Scikit-Learn)

import numpy as np
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import StandardScaler

# 1. Data (Tinggi Badan -> Berat Badan)
X_train = np.array([[160], [165], [170], [180]])
y_train = np.array([50, 55, 65, 80])

# 2. Scaling (PENTING!)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)

# 3. Target Baru (168 cm)
X_new = np.array([[168]])
X_new_scaled = scaler.transform(X_new) # Jangan lupa scale target juga!

# 4. Buat Model KNN (K=2)
knn = KNeighborsRegressor(n_neighbors=2)
knn.fit(X_train_scaled, y_train)

# 5. Prediksi
prediksi = knn.predict(X_new_scaled)
print(f"Prediksi Berat untuk Tinggi 168cm: {prediksi[0]:.2f} kg")

# Tips:
# - K terlalu kecil (K=1) = Overfitting (Gampang kena noise)
# - K terlalu besar (K=100) = Underfitting (Rata-rata populasi, garis datar)