You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于已有保留集绘制训练与验证数据的学习曲线?sklearn learning_curve()无此参数

使用预先划分的保留验证集绘制学习曲线

当然可以!虽然scikit-learn的learning_curve()函数确实没有直接支持使用预先定义好的保留验证集(holdout set)的参数,但我们可以手动模拟它的核心逻辑,转而用固定的holdout集来评估模型,具体步骤如下:

核心思路

  1. 将已有的训练集拆分成不同大小的训练子集(比如从10%到100%的训练样本量)
  2. 在每个训练子集上训练模型,分别计算模型在自身训练子集和固定保留验证集上的得分
  3. 把不同训练子集对应的得分绘制成曲线,就是我们需要的学习曲线

代码示例

下面以鸢尾花数据集和SVM分类器为例,展示具体实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

# 1. 加载数据并预先划分训练集与保留验证集
X, y = load_iris(return_X_y=True)
X_train, X_holdout, y_train, y_holdout = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 2. 定义训练集大小的比例(从10%到100%,取10个间隔点)
train_sizes = np.linspace(0.1, 1.0, 10)

# 3. 存储训练得分和保留验证集得分
train_scores = []
holdout_scores = []

# 4. 遍历每个训练集大小,训练模型并计算得分
n_repeats = 5  # 对每个样本量重复5次取平均,让曲线更稳健
for train_size in train_sizes:
    n_samples = int(train_size * len(X_train))
    temp_train = []
    temp_holdout = []
    
    for _ in range(n_repeats):
        # 随机选择对应数量的训练样本
        idx = np.random.choice(len(X_train), n_samples, replace=False)
        X_subtrain, y_subtrain = X_train[idx], y_train[idx]
        
        # 训练模型
        model = SVC()
        model.fit(X_subtrain, y_subtrain)
        
        # 记录得分
        temp_train.append(model.score(X_subtrain, y_subtrain))
        temp_holdout.append(model.score(X_holdout, y_holdout))
    
    # 取多次重复的平均值
    train_scores.append(np.mean(temp_train))
    holdout_scores.append(np.mean(temp_holdout))

# 5. 绘制学习曲线
plt.figure(figsize=(10, 6))
plt.plot(train_sizes, train_scores, label='Training Score', color='#1f77b4', linewidth=2)
plt.plot(train_sizes, holdout_scores, label='Holdout Validation Score', color='#ff7f0e', linewidth=2)
plt.xlabel('Training Set Size (Proportion of Full Training Data)')
plt.ylabel('Accuracy')
plt.title('Learning Curve with Fixed Holdout Validation Set')
plt.legend()
plt.grid(alpha=0.3)
plt.show()

关键细节说明

  • 加入n_repeats参数是为了减少随机采样带来的方差,让学习曲线更平滑;如果追求速度,也可以只做一次采样
  • 你可以替换代码中的模型(比如用RandomForestClassifier)和数据集,适配自己的任务
  • 这个方法完全兼容回归任务,只需要把得分指标换成回归对应的(比如r2_score或者mean_squared_error)

内容的提问来源于stack exchange,提问作者nopact

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:57:40