KNN คือ อะไร

KNN คือ อะไร
Photo by Christina Morillo

KNN ย่อจาก K-Nearest Neighbors ถือเป็น Supervised Machine Learning Algorithm ใข้ในการ Classification หรือ Regression ทำงานได้โดยการกำหนดค่า K ซึ่งก็คือ จำนวน Training Samples ที่มีระยะทางใกล้กับ Data Point ใหม่มากที่สุด และ ทำนายจาก Majority ของ K samples เหล่านั้น

❓ทำไมถึงใช้ KNN

  • ความง่าย ในการ Implement
  • ไม่ต้องมีกระบวนการ Training เริ่มที่กระบวนการ Prediction ได้เลย
  • ปรับตัวได้ (Adaptive) ไม่จำเป็นต้องมีการ Re-training เมื่อมีข้อมูลใหม่เข้ามา
  • สามารถใช้สำหรับ Non-Linear data และ กรณีที่เป็น Complex Boundaries ได้
  • สามารถใช้ได้ทั้งปัญหา Classification และ Regression

🟢 ข้อดี

  • ไม่ต้องมีสมมติฐานเกี่ยวกับ Function ที่เลือกมาใช้ ทำให้เหมาะกับทุกประเภทของข้อมูล
  • เป็น Instance-based Learning ทำให้ง่ายในการปรับตัว
  • รองรับปัญหาแบบ Multi-class Classification 

🔴 ข้อเสีย

  • ต้องมี Storage สำหรับ Dataset ทั้งชุด การหา Nearest Neighbors บางครั้งมีความซับซ้อนในการคำนวณที่มาก
  • มีความไวต่อ Features ที่ไม่เกี่ยวข้อง เนื่องจากเป็นการคำนวณระยะทาง บางครั้ง Features ที่ไม่เกี่ยวข้องจะส่งผลต่อประสิทธิภาพของ Model ได้
  • มีความไวต่อ Scale สำหรับ Features ที่มี Scale ที่สูงกว่า (ค่ามากกว่า) จะส่งผลต่อการคำนวณระยะทางที่มากกว่า 
  • ประสิทธิภาพลดลงหากเป็น High Dimensionality 

Hyper-parameters ใน KNN

  • จำนวนของ Neighbors (K)
  • Distance Metrics (เช่น Euclidean, Manhattan, Minkowski)
  • Wights (Uniform, Distance หรือ Custom)
  • Algorithms (Brute-force, KD-Tree, Back Tree)
  • Leaf Size (สำหรับ Tree-based Algorithms)
  • P (Power Parameter สำหรับ Minkowski distance)
  • Metric Params (Arguments เพิ่มเติม สำหรับ Metric Function)

ตัวอย่าง Python Code 👨🏻‍💻

# To import libraries
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, accuracy_score

# To load iris dataset
iris = datasets.load_iris()
X = iris.data
y = iris.target

# To separate train and test data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# To define algorithm
KNN = KNeighborsClassifier()

# To define hyper-parameters
param_grid = {
    'n_neighbors': np.arange(1,50),
    'weights':['uniform','distance'],
    'metric':['euclidean','manhattan','minkowski'],
    'p':[1, 2, 3]           
}

# To use grid search for hyper-paramter tuning
grid_search = GridSearchCV(KNN, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# To print the best parameters 
print ("Best Parameters: ", grid_search.best_params_)

# To use the best parameters for prediction
best_knn = grid_search.best_estimator_
y_pred = best_knn.predict(X_test)

# To print the accuracy and classification report (model's performance)
print ("Accuracy: ", accuracy_score(y_test, y_pred))
print (classification_report(y_test, y_pred))

******

อ่านเพิ่มเติม Pros & Cons ของ Machine Learning Algorithms ที่นิยมใช้

******

ข้อมูลอ้างอิง - Analytics Vidhya