交叉验证如何在学习曲线中发挥作用?蟒蛇学习

Posted

技术标签:

【中文标题】交叉验证如何在学习曲线中发挥作用?蟒蛇学习【英文标题】:how does the cross-validation work in learning curve? Python sklearn 【发布时间】:2020-09-18 10:51:00 【问题描述】:

假设我的学习曲线是sklearn learning curve SVM。而且我还在进行 5 折交叉验证,据我了解,这意味着将您的 训练 数据分成 5 份,对其中的四个进行训练并在最后一个上进行测试。

所以我的问题是,由于LearningCurve中的每个数据点,训练集的大小都是不同的(因为我们想看看模型随着数据量的增加会如何表现),那么交叉-在这种情况下验证工作?它仍然将整个训练集分成 5 个相等的部分吗?还是将当前点训练集分成五个不同的小块,然后计算测试分数?是否可以获得每个数据点的混淆矩阵? (即真阳性、真阴性等)。我还没有看到基于 sklearn 学习曲线代码的方法。

交叉验证的折叠次数与我们在train_sizes = np.linspace(0.1, 1.0, 5) 中拆分多少训练集有关吗?

train_sizes, train_scores, test_scores, fit_times, _ = learning_curve(estimator,
                                                                      X, y, cv, 
                                                                      n_jobs, scoring, 
                                                                      train_sizes)

谢谢!

【问题讨论】:

【参考方案1】:

不,它再次将训练数据分成 5 折。相反,对于训练折叠的特定组合(例如 - 折叠 1、2、3 和 4 作为训练),它将仅从这 4 个训练折叠中选择 k 个数据点(x-tick)作为训练。测试折叠将用作测试数据。

如果您查看代码here,您会更清楚。

for train, test in cv_iter:
     for n_train_samples in train_sizes_abs:
          train_test_proportions.append((train[:n_train_samples], test))

n_train_samples 将类似于 [200,400,...1400] 对于您提到的情节。

交叉验证的折叠次数与我们在 train_sizes = np.linspace(0.1, 1.0, 5) 中拆分的训练集的数量有关吗?

我们不能为某个train_sizes 分配任意数量的折叠。它只是来自所有训练折叠的数据点的一个子集。

【讨论】:

滴答声是什么意思?我还看到学习曲线页面上写着“train_scores array of shape (n_ticks, n_cv_folds)”。你也介意解释一下吗? ticks 是绘图 x 轴上唯一值的数量。在我的回答中,这不过是n_train_samplestrain_scores 是二维数组,行代表n_train_samples,列代表 CV 折叠的每个组合。如果您使用 5 折交叉验证,那么您将获得 5 种不同的训练和测试数据拆分组合。这些将在train_scores 的列中表示。

以上是关于交叉验证如何在学习曲线中发挥作用?蟒蛇学习的主要内容,如果未能解决你的问题,请参考以下文章

观察学习曲线

观察学习曲线

数据挖掘机器学习[三]---汽车交易价格预测详细版本{特征工程交叉检验绘制学习率曲线与验证曲线}

机器学习:验证数据集与交叉验证

如何在 Scikit-Learn 中绘制超过 10 倍交叉验证的 PR 曲线

机器学习中学习曲线的 bias vs variance 以及 数据量m