Cơ bản về phân lớp: Softmax và k-láng giềng gần nhất trong Python
Phân lớp là chọn một nhãn, chẳng hạn mèo hay chó. Mô hình có thể đưa ra một điểm số cho mỗi lớp rồi dùng softmax biến chúng thành xác suất, hoặc một cách đơn giản như k-láng giềng gần nhất để các ví dụ gần nhất bỏ phiếu.
Khái niệm bằng lời đơn giản
Phân lớp là chọn một nhãn, chẳng hạn mèo hay chó. Mô hình có thể đưa ra một điểm số cho mỗi lớp rồi dùng softmax biến chúng thành xác suất, hoặc một cách đơn giản như k-láng giềng gần nhất để các ví dụ gần nhất bỏ phiếu.
Biến điểm số thành xác suất của các lớp bằng softmax, đánh giá bằng cross-entropy và phân lớp điểm bằng k-láng giềng gần nhất.
Ý chính
- Softmax giữ nguyên thứ tự các điểm số và làm chúng cộng lại bằng 1.
- Cross-entropy phân loại phạt nặng nhất những câu trả lời sai mà lại rất tự tin.
- k-NN không có bước huấn luyện: nó so sánh điểm mới với các ví dụ đã lưu.
- Naive Bayes và cây quyết định (Gini impurity, information gain) là những bộ phân lớp kinh điển khác.
Khi nào nên sử dụng?
- Hiểu điều gì diễn ra bên trong mạng nơ-ron và các thư viện AI.
- Nắm ý tưởng trước khi tự cài đặt nó trong các thử thách tương ứng.
- Chuẩn bị cho khóa học machine learning, phỏng vấn và dự án.
Xem trực quan
Nhấp vào bất kỳ đâu trên biểu đồ bên trái để phân lớp một điểm mới bằng phiếu bầu của k láng giềng gần nhất. Đổi điểm số bên phải để xem softmax phản ứng.
Code ví dụ
import math
from collections import Counter
# Softmax turns raw scores into probabilities that add up to 1.
def softmax(scores):
exps = [math.exp(s - max(scores)) for s in scores]
total = sum(exps)
return [e / total for e in exps]
probs = softmax([2.0, 1.0, 0.1])
print("softmax:", [round(p, 3) for p in probs])
# Cross-entropy is small when the true class gets a high probability.
print("cross-entropy if class 0 is right:", round(-math.log(probs[0]), 3))
# k-nearest neighbours: label a point by a vote of the closest examples.
examples = [((1, 1), "cat"), ((1, 2), "cat"), ((5, 5), "dog"), ((6, 5), "dog"), ((5, 6), "dog")]
def knn(point, k=3):
nearest = sorted(examples, key=lambda e: math.dist(point, e[0]))[:k]
return Counter(label for _, label in nearest).most_common(1)[0][0]
print("(2, 1) ->", knn((2, 1)))
print("(5, 4) ->", knn((5, 4)))
Kết quả dự kiến
softmax: [0.659, 0.242, 0.099]
cross-entropy if class 0 is right: 0.417
(2, 1) -> cat
(5, 4) -> dog
Cách hoạt động
softmax() lấy mũ các điểm số rồi chia cho tổng của chúng, nên ba xác suất cộng lại bằng 1; trừ giá trị lớn nhất trước để tránh tràn số. Cross-entropy là −log của xác suất của lớp đúng. knn() sắp xếp các ví dụ theo khoảng cách và để 3 ví dụ gần nhất bỏ phiếu.
Thay đổi giá trị và chạy chương trình bằng trình chạy Python online của CodeUtility mà không cần cài Python.
Bài tập mở rộng
Hãy sửa code theo các bài tập dưới đây để hiểu rõ cách hoạt động thay vì chỉ sao chép kết quả.
- Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
- In các giá trị trung gian để theo dõi từng bước tính toán.
- Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
- Hàm softmax Biến các điểm số thô thành xác suất có tổng bằng 1 mà không bị tràn số với giá trị lớn. Dễ
- Hàm mất mát categorical cross-entropy Đo mất mát của bộ phân loại nhiều lớp từ xác suất dự đoán và lớp đúng. Dễ
- Bộ phân loại K láng giềng gần nhất Dự đoán nhãn bằng cách bỏ phiếu đa số trong k điểm huấn luyện gần nhất. Trung bình
- Bộ phân loại Naive Bayes Dự đoán lớp từ các đặc trưng phân loại bằng định lý Bayes và làm trơn Laplace. Trung bình
- Độ vẩn đục Gini Đo mức độ trộn lẫn của các nhãn trong một nhóm, tiêu chí cây quyết định dùng để chọn cách chia. Dễ
- Độ lợi thông tin Tính mức giảm entropy khi chia theo một đặc trưng, tiêu chí đứng sau cây quyết định ID3. Trung bình