You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

学习曲线:训练集规模应采用增量扩充还是随机选取?

学习曲线的两种常规实现方式及适用场景

嘿,这个问题问到点子上了——学习曲线的这两种实现路径其实都很常用,核心取决于你想通过学习曲线探究什么问题,咱们一个个说清楚:

1. 重新随机选取对应规模的训练集(更常用的标准方式)

这是大多数机器学习框架(比如Scikit-learn的learning_curve函数)默认采用的方式。拿你说的比例列表[0.2, 0.3, 0.4...]举例:

  • 当训练规模到0.2时,从全量训练集里随机抽取20%的样本训练模型;
  • 到0.3时,完全不依赖之前的0.2子集,重新从全量训练集里随机抽取30%的样本训练;
  • 后续每个比例都是独立从全集中抽样,彼此的子集没有必然重叠。

为什么用这种方式?

这种方式的核心是消除“样本选择偏差”对结果的影响,让每个训练规模下的模型表现都能反映模型在该规模随机子集上的平均泛化能力。比如如果你的0.2子集刚好是数据里的“简单样本”,增量添加的话会高估小数据量的性能,而重新抽样能通过多次重复(配合交叉验证)得到更稳健的结果,适合做标准的模型泛化能力评估。

2. 增量添加新样本(贴合真实训练场景)

这种方式是在已有子集的基础上,额外补充未使用过的新样本:

  • 先从全量数据里抽20%的样本训练;
  • 接着从剩下的80%数据里再抽10%(凑到30%),加到之前的20%子集里,用这个完整的30%样本重新训练;
  • 后续每个规模都是在前一个子集的基础上,新增对应比例的未使用过的样本。

适合的场景

这种方式更贴近真实世界里“数据逐步积累、模型持续迭代”的场景。比如你想研究:

  • 模型随着数据量增加的收敛速度
  • 新增数据对性能提升的边际效应(比如加到0.8之后再增加数据,性能是不是几乎不涨了);
  • 模拟在线学习、增量学习的效果。

注意点

要确保新增的样本没有和之前的子集重复,而且如果你的数据集存在分布偏移(比如新数据和旧数据的分布不一样),这种方式的结果会更贴近实际业务中的模型表现,但统计稳健性不如重新抽样(因为每个子集的选择是依赖前一步的)。

举个代码小例子

比如用Python手动实现两种方式:

重新抽样的简化版

import numpy as np
from sklearn.linear_model import LogisticRegression

# 假设X_train是全量训练数据,y_train是标签
sample_sizes = [0.2, 0.3, 0.4]
scores = []

for size in sample_sizes:
    # 每次重新随机选对应比例的样本
    idx = np.random.choice(len(X_train), int(len(X_train)*size), replace=False)
    X_sub = X_train[idx]
    y_sub = y_train[idx]
    model = LogisticRegression()
    model.fit(X_sub, y_sub)
    scores.append(model.score(X_test, y_test))

增量添加的简化版

# 先初始化基础子集
base_idx = np.random.choice(len(X_train), int(len(X_train)*0.2), replace=False)
remaining_idx = np.setdiff1d(np.arange(len(X_train)), base_idx)
current_idx = base_idx.copy()
scores = []

# 先评估0.2的情况
model = LogisticRegression()
model.fit(X_train[current_idx], y_train[current_idx])
scores.append(model.score(X_test, y_test))

# 处理0.3的情况:从剩余数据里加10%
add_size = int(len(X_train)*0.1)
add_idx = np.random.choice(remaining_idx, add_size, replace=False)
current_idx = np.concatenate([current_idx, add_idx])
remaining_idx = np.setdiff1d(remaining_idx, add_idx)
model.fit(X_train[current_idx], y_train[current_idx])
scores.append(model.score(X_test, y_test))

# 后续0.4以此类推...

总结一下:如果是做通用的模型泛化能力评估,优先选重新随机抽样;如果要模拟真实的数据积累或增量训练场景,就用增量添加样本的方式。

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

火山引擎 最新活动