Giải mã thuật toán KNN: Hướng dẫn từ A-Z với Python và Bộ dữ liệu Iris
KNN là một trong những thuật toán Machine Learning đơn giản và hiệu quả nhất cho người mới bắt đầu. Bài viết này sẽ giải thích cơ chế hoạt động của KNN, các phương pháp đo khoảng cách quan trọng và ví dụ lập trình cụ thể trên bộ dữ liệu Iris bằng Python.

Thuật toán K-Nearest Neighbors (KNN) nổi tiếng vì sự đơn giản và trực quan của mình. Không giống như nhiều mô hình học sâu phức tạp, KNN không yêu cầu các vòng lặp huấn luyện (training loops) dài dòng hay các phép tính gradient phức tạp. Ý tưởng cốt lõi của nó rất dễ hiểu: các điểm dữ liệu tương đồng thường nằm gần nhau.
Cơ chế hoạt động của KNN
KNN được phân loại là một thuật toán học lười (lazy learning). Điều này có nghĩa là nó không thực sự "học" một mô hình trong giai đoạn huấn luyện. Thay vào đó, thuật toán hoạt động theo quy trình 4 bước đơn giản khi có dữ liệu mới:
- Lưu trữ toàn bộ dữ liệu huấn luyện.
- Tính toán khoảng cách từ điểm dữ liệu mới đến tất cả các điểm dữ liệu hiện có.
- Tìm kiếm K hàng xóm gần nhất.
- Sử dụng nhãn của hàng xóm để đưa ra dự đoán.
Đối với bài toán phân loại (classification), kết quả sẽ dựa trên bỏ phiếu đa số trong số K hàng xóm. Còn đối với bài toán hồi quy (regression), kết quả sẽ là giá trị trung bình của các hàng xóm đó.
Khoảng cách là chìa khóa
Mọi thứ trong KNN đều phụ thuộc vào cách chúng ta định nghĩa sự "gần nhau". Dưới đây là 3 phương pháp đo khoảng cách phổ biến nhất:
Khoảng cách Euclidean
Đây là khoảng cách đường thẳng giữa hai điểm, mặc định được sử dụng trong hầu hết các thư viện máy tính.
- Tương tự như cách đo "đường chim bay".
- Phù hợp nhất với các đặc trưng liên tục.
Khoảng cách Manhattan
Đây là tổng khoảng cách tuyệt đối theo các trục tọa độ.
- Tương tự như việc "đi bộ theo các khối phố" (theo lưới ô vuông).
- Hữu ích trong không gian chiều cao.
Khoảng cách Minkowski
Đây là phiên bản tổng quát của cả hai phương pháp trên, được điều khiển bởi tham số p:
- Khi
p = 1: Tương đương với khoảng cách Manhattan. - Khi
p = 2: Tương đương với khoảng cách Euclidean.
Ví dụ thực hành: Bộ dữ liệu Iris
Bộ dữ liệu Iris là "bài tập kinh điển" cho những người mới bắt đầu học Machine Learning. Dữ liệu bao gồm thông tin của 3 loài hoa lan với 4 đặc trưng chính:
- Chiều dài đài hoa (Sepal length)
- Chiều rộng đài hoa (Sepal width)
- Chiều dài cánh hoa (Petal length)
- Chiều rộng cánh hoa (Petal width)
Mục tiêu của chúng ta là sử dụng KNN để dự đoán loài hoa dựa trên 4 đặc trưng này.
Mã nguồn Python đầy đủ
Dưới đây là ví dụ hoàn chỉnh sử dụng thư viện scikit-learn để triển khai KNN:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# Tải bộ dữ liệu Iris
iris = load_iris()
X = iris.data
y = iris.target
# Chia dữ liệu thành tập huấn luyện và tập kiểm tra
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Khởi tạo mô hình KNN với K=3
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
# Dự đoán trên tập kiểm tra
y_pred = knn.predict(X_test)
print("Độ chính xác:", accuracy_score(y_test, y_pred))
# Thử dự đoán một mẫu mới
new_sample = [[5.1, 3.5, 1.4, 0.2]]
prediction = knn.predict(new_sample)
print("Dự đoán loài hoa:", iris.target_names[prediction][0])
Tổng kết: Khi nào nên dùng KNN?
Ưu điểm
- Đơn giản, dễ hiểu và trực quan.
- Không có giai đoạn huấn luyện tốn kém.
- Rất phù hợp để tạo đường cơ sở (baseline) cho các bài toán mới.
Nhược điểm
- Chạy chậm với các bộ dữ liệu lớn vì phải tính khoảng cách đến tất cả các điểm.
- Nhạy cảm với nhiễu (noise) và các dữ liệu bất thường.
- Cần xử lý kỹ thuật đặc trưng (feature scaling) vì các khoảng cách dễ bị chi phối bởi đặc trưng có giá trị lớn.
Bạn nên sử dụng KNN khi: Bộ dữ liệu nhỏ, dữ liệu đã được gán nhãn tốt và bạn cần một mô hình tham chiếu nhanh chóng.
Tóm lại: Lưu dữ liệu → Tìm hàng xóm → Bỏ phiếu → Dự đoán.



