Menu
CoddyTech

So sánh các mô hình công bằng

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 38 trên 58.

So sánh các mô hình trên một lần chia dữ liệu chẳng khác nào tung đồng xu: một mô hình có thể gặp may với tập kiểm tra. Thay vào đó, hãy dùng cùng năm phần dữ liệu cho mỗi mô hình. Với 150 tờ tiền giấy, thật hay giả:

Điểm số trên năm phần dữ liệu của mỗi mô hình được biểu thị bằng các dấu chấm, với một đường màu đen ở mỗi giá trị trung bình. Các dấu chấm của k-NN nằm gần nhau quanh mức 0.867; logistic trải từ 0.73 đến 0.93 quanh mức 0.873; cây đạt mức thấp hơn, 0.807

k-NN và logistic có kết quả ngang nhau trong phạm vi dao động, còn k-NN ổn định hơn. Cây quyết định kém hơn.

Bộ chia KFold xáo trộn các hàng một lần rồi cung cấp cho mỗi mô hình các phần dữ liệu giống hệt nhau:

from sklearn.model_selection import KFold

folds = KFold(n_splits=5, shuffle=True, random_state=0)
for model in [knn, logistic, tree]:
    scores = cross_val_score(model, X, y, cv=folds)
    print(f"{scores.mean():.3f} {scores.std():.3f}")

Nó in ra các số trong biểu đồ:

0.867 0.042
0.873 0.074
0.807 0.077

Chọn giá trị trung bình cao nhất; nếu các giá trị trung bình gần nhau, chọn độ lệch chuẩn nhỏ hơn.

challenge icon

Thử thách

Trung bình

Một trang web nấu ăn dự đoán khách truy cập nào sẽ nấu món ăn trong công thức mà họ mở. Mã khởi đầu chấm điểm ba mô hình qua một lần chia dữ liệu, và cây quyết định thắng. Hãy đánh giá công bằng; chương trình đọc số lần chia.

  1. Tạo một KFold với số lần chia đó, shuffle=True và random_state=0.
  2. Kiểm định chéo từng mô hình qua các lần chia đó; in giá trị trung bình và độ lệch chuẩn, với 3 chữ số thập phân.
  3. In mô hình có giá trị trung bình cao nhất.

Với những khách truy cập khác và 5:

One split picks: k-NN
k-NN: mean 0.833, std 0.045
logistic: mean 0.860, std 0.044
tree: mean 0.787, std 0.029
Cross-validation picks: logistic

Tự làm thử

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

n_folds = int(input())

# Đừng thay đổi các dòng bên dưới: 300 khách truy cập, 6 thói quen duyệt web; nhãn 1 nghĩa là họ đã nấu món ăn theo công thức
X, y = make_classification(n_samples=300, n_features=6, n_informative=4, n_redundant=0,
                           flip_y=0.06, class_sep=0.8, random_state=0)
names = ["k-NN", "logistic", "tree"]
models = [KNeighborsClassifier(), LogisticRegression(max_iter=1000),
          DecisionTreeClassifier(max_depth=4, random_state=0)]

# Một lần chia dữ liệu chọn ra mô hình thắng cuộc
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
single = []
for model in models:
    model.fit(X_train, y_train)
    single.append(model.score(X_test, y_test))
print(f"One split picks: {names[np.argmax(single)]}")

# 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