Menu
CoddyTech

验证集

本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 35 课,共 58 课。

在“选择 k 和树深度”中,你保留了测试分数最高的 k 或深度。这个分数有些虚高:你保留它,只是因为它的分数很高。

因此,还要留出第三组数据用于选择,也就是验证集:

一条分成三部分的长条:训练行占 60%,用于拟合每个候选项;验证集占 20%,用于选择;测试集占 20%,用于报告一次

分两次拆分就能实现。剩余 80% 的 0.25 是 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))

对于 500 行,它会打印:

300 100 100

在验证时进行选择。只在最后使用一次测试集。

challenge icon

挑战

中等

葡萄园使用 Ridge 预测每行葡萄的产量。初始代码根据测试分数选择 alpha,并报告同一个分数。请修复它。

  1. 将 X_rest 和 y_rest 拆分为训练行和验证行(test_size=0.25,random_state=0)。
  2. 根据验证集的 R squared 选择 alpha,并打印它和对应的分数。
  3. 用训练行拟合选定的 alpha,并打印它在测试集上的 R squared。

对于另一个葡萄园:

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

诚实的分数通常低于初始代码给出的分数。它才是真实分数。

亲手试试

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


# 用第一组数据行训练经过标准化的 Ridge(alpha) 模型,返回它在第二组数据行上的 R² 分数
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 行葡萄园数据:每行有 10 项测量值,以及以 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)

# 这里根据测试分数选择 alpha,又报告同一个分数:请修正这个问题
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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

监督学习中的所有课

自己练习: Python 在线编译器