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ả
