Menu
CoddyTech

Tập kiểm định

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

Trong phần Chọn k và độ sâu của cây, bạn giữ lại giá trị k hoặc độ sâu có điểm kiểm tra cao nhất. Điểm số đó dễ khiến bạn lạc quan: bạn giữ lại giá trị ấy vì nó đạt điểm cao.

Vậy hãy giữ lại một bộ thứ ba để lựa chọn, đó là tập xác thực:

Một thanh chia thành ba phần: 60% hàng huấn luyện, dùng để khớp mọi ứng viên; 20% xác thực, dùng để lựa chọn; 20% kiểm thử, dùng để báo cáo một lần

Hai lần chia là đủ. 0.25 của 80% còn lại là 20%:

X_rest, X_test, y_rest, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X_train, X_val, y_train, y_val = train_test_split(X_rest, y_rest, test_size=0.25, random_state=0)
print(len(X_train), len(X_val), len(X_test))

Với 500 hàng, kết quả in ra là:

300 100 100

Chọn trong quá trình kiểm định. Chỉ dùng tập kiểm tra một lần, vào cuối cùng.

challenge icon

Thử thách

Trung bình

Một vườn nho dự đoán sản lượng nho trên mỗi hàng bằng Ridge. Đoạn code khởi đầu chọn alpha dựa trên điểm số trên tập kiểm tra rồi báo cáo chính điểm số đó. Hãy sửa lại.

  1. Chia X_rest và y_rest thành các hàng huấn luyện và xác thực (test_size=0.25, random_state=0).
  2. Chọn alpha dựa trên R bình phương của tập xác thực rồi in alpha cùng điểm số đó.
  3. Huấn luyện với alpha đã chọn trên các hàng huấn luyện rồi in R bình phương trên tập kiểm tra.

Với một vườn nho khác:

Chosen alpha: 1 (validation R squared 0.787)
Test R squared: 0.726

Điểm số trung thực thường thấp hơn điểm số của đoạn code khởi đầu. Đó mới là điểm số thực.

Tự làm thử

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge


# Huấn luyện Ridge(alpha) với dữ liệu đã chuẩn hóa trên tập hàng đầu tiên, rồi trả về R bình phương trên tập thứ hai
def ridge_r2(alpha, X_fit, y_fit, X_check, y_check):
    scaler = StandardScaler()
    model = Ridge(alpha=alpha)
    model.fit(scaler.fit_transform(X_fit), y_fit)
    return model.score(scaler.transform(X_check), y_check)


# 90 hàng dữ liệu vườn nho: mỗi hàng có 10 phép đo và sản lượng nho tính bằng kg
rows = pd.read_csv("vineyard.csv")
features = ["sun_hours", "rain_mm", "soil_ph", "slope_deg", "vine_age",
            "row_length_m", "buds_per_vine", "frost_days", "wind_kmh", "clay_pct"]
X = rows[features]
y = rows["yield_kg"]
alphas = [0.1, 1, 10, 100]
X_rest, X_test, y_rest, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# Đoạn này chọn alpha theo điểm kiểm tra, rồi báo cáo chính điểm đó: hãy sửa lại
best_alpha = 0
best_r2 = -1
for alpha in alphas:
    r2 = ridge_r2(alpha, X_rest, y_rest, X_test, y_test)
    if r2 > best_r2:
        best_alpha = alpha
        best_r2 = r2
print(f"Chosen alpha: {best_alpha}")
print(f"Test R squared: {best_r2:.3f}")
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