K-Nearest Neighbors trong Python

Trong ví dụ này, chúng ta sẽ sử dụng thuật toán K-Nearest Neighbors (KNN) trong thư viện scikit-learn để phân loại hoa trong bộ dữ liệu Iris. Dưới đây là chi tiết các bước:


🌸 1. Tải dữ liệu Iris

iris = load_iris()
X = iris.data
y = iris.target
  • load_iris(): Hàm này tải bộ dữ liệu hoa Iris, một tập dữ liệu kinh điển trong học máy.
  • X: Ma trận gồm các đặc điểm (chiều dài/rộng cánh hoa và đài hoa).
  • y: Mảng chứa nhãn (loại hoa): 0 = setosa, 1 = versicolor, 2 = virginica.

🔀 2. Chia dữ liệu thành tập huấn luyện và kiểm tra

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  • 80% dữ liệu dùng để huấn luyện (train), 20% dùng để kiểm tra (test).
  • random_state=42: đảm bảo kết quả chia là như nhau mỗi lần chạy lại (giống như “định mệnh”).

🧠 3. Tạo mô hình KNN

knn = KNeighborsClassifier(n_neighbors=3)
  • Tạo mô hình phân loại KNN.
  • n_neighbors=3: mỗi mẫu mới sẽ được phân loại dựa trên loại của 3 hàng xóm gần nhất.

🏋️‍♂️ 4. Huấn luyện mô hình

knn.fit(X_train, y_train)
  • Mô hình học từ dữ liệu huấn luyện: “quen mặt gọi tên” các loại hoa.

🔍 5. Dự đoán kết quả

y_pred = knn.predict(X_test)
  • Dự đoán nhãn cho 20% dữ liệu kiểm tra.

🎯 6. Đánh giá mô hình

accuracy = accuracy_score(y_test, y_pred)
print(f"Độ chính xác của KNN trên dữ liệu test: {accuracy*100:.2f}%")
  • Tính toán độ chính xác: bao nhiêu phần trăm mô hình đoán đúng trên tập kiểm tra.

🌼 7. Dự đoán mẫu mới

sample = [[5.1, 3.5, 1.4, 0.2]]
prediction = knn.predict(sample)
print(f"Dự đoán mẫu mới thuộc loại hoa: {iris.target_names[prediction][0]}")
  • Đưa vào một mẫu hoa mới với 4 đặc điểm.
  • Mô hình sẽ dự đoán mẫu đó thuộc loại hoa nào (ví dụ: setosa).

kết quả

Độ chính xác của KNN trên dữ liệu test: 100.00%
Dự đoán mẫu mới thuộc loại hoa: setosa

Bây giờ, chúng ta điều chỉnh mô hình KNN với K=5 và trực quan hóa kết quả bằng biểu đồ phân loại.


🔧 Thay đổi mô hình KNN với K=5

knn = KNeighborsClassifier(n_neighbors=5)  # dùng 5 hàng xóm gần nhất
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)
print(f"Độ chính xác với K=5: {accuracy*100:.2f}%")

📊 Vẽ biểu đồ phân loại bằng matplotlib

import matplotlib.pyplot as plt
import numpy as np

# Chọn hai đặc trưng để dễ trực quan hóa, ví dụ: đặc trưng số 0 và 2
X_vis = X[:, [0, 2]]
X_train_vis, X_test_vis, _, _ = train_test_split(X_vis, y, test_size=0.2, random_state=42)

# Huấn luyện lại mô hình với dữ liệu 2 chiều
knn_vis = KNeighborsClassifier(n_neighbors=5)
knn_vis.fit(X_train_vis, y_train)

# Tạo lưới điểm để dự đoán
x_min, x_max = X_vis[:, 0].min() - 1, X_vis[:, 0].max() + 1
y_min, y_max = X_vis[:, 1].min() - 1, X_vis[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 0.1))
grid = np.c_[xx.ravel(), yy.ravel()]
Z = knn_vis.predict(grid)
Z = Z.reshape(xx.shape)

# Vẽ biểu đồ phân loại
plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.coolwarm)
plt.scatter(X_vis[:, 0], X_vis[:, 1], c=y, edgecolor='k', cmap=plt.cm.coolwarm)
plt.xlabel('Chiều dài đài hoa')
plt.ylabel('Chiều dài cánh hoa')
plt.title('Phân vùng KNN với K=5')
plt.show()

kết quả

Chạy code trên Colab

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

error: Content is protected !!