Menu
CoddyTech

Tinh chỉnh mô hình tốt nhất

Thuộc phần Học có giám sát trong hành trình Machine Learning của Coddy. Bài học 53 trên 58.

k-NN thắng với giá trị mặc định là 5 láng giềng. Giá trị k khác có phân loại chim cánh cụt tốt hơn không? Tìm kiếm lưới (grid search) chấm điểm từng giá trị k bạn liệt kê bằng kiểm định chéo, như ví dụ này với ảnh chụp khối u:

Độ chính xác CV trung bình của k-NN trên ảnh chụp khối u với k từ 1 đến 29: đạt đỉnh tại k = 3 với 0.974, được đánh dấu bằng ngôi sao, rồi giảm dần xuống 0.946 tại k = 29

Tương tự như bài học Tinh chỉnh pipeline, k được đặt tên theo bước của nó:

{"kneighborsclassifier__n_neighbors": [3, 5, 7]}

Mức cải thiện nhỏ hơn độ lệch chuẩn giữa các phần chia có thể chỉ là do may mắn. Việc tinh chỉnh cũng chỉ sử dụng các hàng dữ liệu huấn luyện.

challenge icon

Thử thách

Trung bình

Đường ống k-NN của bạn là pipe, còn default lưu độ chính xác CV của nó với k = 5. Chương trình đọc các giá trị k cần thử vào ks.

  1. Tìm kiếm các giá trị đó bằng GridSearch với 5 fold trên các hàng dữ liệu huấn luyện.
  2. In ra giá trị k tốt nhất và độ chính xác CV tương ứng, làm tròn đến 3 chữ số thập phân.
  3. In ra mức cải thiện so với k = 5, làm tròn đến 3 chữ số thập phân.

Với một đàn chim khác và lưới giá trị 3, 5, 9:

Best k: 3
CV accuracy: 0.969
Gain over k = 5: 0.009

Sau đó, chỉ thử các giá trị lớn, như từ 21 đến 27. Việc tinh chỉnh có phải lúc nào cũng giúp ích không?

Tự làm thử

import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.neighbors import KNeighborsClassifier

# Đàn chim cánh cụt trong bài Gặp gỡ chim cánh cụt, các đặc trưng và nhãn của chúng
penguins = pd.read_csv("penguins.csv")
numbers = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
text = ["island", "sex"]
X = penguins[numbers + text]
y = penguins["species"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, stratify=y, random_state=0)

# Từ bài Chuẩn bị dữ liệu: hai nhánh xử lý
number_steps = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
text_steps = make_pipeline(SimpleImputer(strategy="constant", fill_value="unknown"), OneHotEncoder())
prep = ColumnTransformer([("numbers", number_steps, numbers), ("words", text_steps, text)])

# Từ bài Chọn mô hình: mô hình tốt nhất là k-NN với k = 5 mặc định
pipe = make_pipeline(prep, KNeighborsClassifier())
default = cross_val_score(pipe, X_train, y_train, cv=5).mean()

# Các giá trị k cần thử
n = int(input())
ks = []
for i in range(n):
    ks.append(int(input()))

# Viết code của bạn bên dưới
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Học có giám sát

Tự luyện tập: Trình biên dịch Python online