Python 验证曲线如何计算考试分数

Python 验证曲线如何计算考试分数,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我正在浏览sci工具包学习文档中的验证曲线,发现它返回了两组不同的数据: 返回 训练分数:训练集上的形状(n个记号、n个cv折叠)分数数组 测试分数:测试集上形状(n个记号、n个cv折叠)分数的数组 在给定的函数中,我们只传递一个X和y数组,它如何根据传递的训练数据计算测试分数,它是否执行固有的训练测试分割 sklearn.model_selection.validation_curve(estimator, X, y, *, param_name, param_range, groups=N

我正在浏览sci工具包学习文档中的
验证曲线
,发现它返回了两组不同的数据:

返回

训练分数:训练集上的形状(n个记号、n个cv折叠)分数数组

测试分数:测试集上形状(n个记号、n个cv折叠)分数的数组

在给定的函数中,我们只传递一个X和y数组,它如何根据传递的训练数据计算测试分数,它是否执行固有的
训练测试分割

sklearn.model_selection.validation_curve(estimator, X, y, *, 
param_name, param_range, groups=None, cv=None, scoring=None,
n_jobs=None, pre_dispatch='all', verbose=0, error_score=nan)
这种情况的例子

>>> import numpy as np
>>> from sklearn.model_selection import validation_curve
>>> from sklearn.datasets import load_iris
>>> from sklearn.linear_model import Ridge

>>> np.random.seed(0)
>>> X, y = load_iris(return_X_y=True)
>>> indices = np.arange(y.shape[0])
>>> np.random.shuffle(indices)
>>> X, y = X[indices], y[indices]

>>> train_scores, valid_scores = validation_curve(Ridge(), X, y, "alpha",np.logspace(-7, 3, 3), cv=5)
>>> train_scores
array([[0.93..., 0.94..., 0.92..., 0.91..., 0.92...],
       [0.93..., 0.94..., 0.92..., 0.91..., 0.92...],
       [0.51..., 0.52..., 0.49..., 0.47..., 0.49...]])
>>> valid_scores
array([[0.90..., 0.84..., 0.94..., 0.96..., 0.93...],
       [0.90..., 0.84..., 0.94..., 0.96..., 0.93...],
       [0.46..., 0.25..., 0.50..., 0.49..., 0.52...]])
由于我们使用3个不同的参数值和5倍交叉验证,维度和值对于训练分数是有意义的,但是有效的训练分数是如何计算的呢?

是的,是这样的 在像
validation\u curve()
GridsearchCV()
这样的函数中,我们应该生成所有的数据和它们的标签,而函数本身会将它们拆分,有时会有一个参数,比如在
GridsearchCV()

在您正在使用的函数中:
sklearn.model\u selection.validation\u curve()
有一个参数
cv
,文档中对此进行了说明

确定交叉验证拆分策略。可能的投入 有关cv,请参见:

无,要使用默认的5倍交叉验证

int,指定(分层)KFold中的折叠数

CV拆分器

一个可分的屈服(训练、测试)分裂为指数数组

注:

一个可分的屈服(训练、测试)分裂为指数数组

为了了解验证分数是如何计算的,我们需要了解验证设置了什么。 当我们在上述函数中训练我们的模型时,我们的数据集被划分为训练集、测试集和验证集

验证集: 验证数据集是用于调整分类器超参数(即架构)的示例数据集。它有时也称为开发集或“开发集”。人工神经网络的超参数示例包括每层中隐藏单元的数量。它以及测试集(如上所述)应遵循与训练数据集相同的概率分布


验证分数可能是使用与测试分数相同的方程式计算的,其全部内容是每次更改测试和训练集,这样模型就不会变得有偏差,因为数据可能会出现偏差

从技术上讲,它是在计算验证分数,而不是测试集。这是通过k折叠交叉验证拆分完成的

您可以指定函数的
cv
参数,该参数告诉函数要创建多少折叠。如果未指定
cv
(保留
None
),则使用默认值5

cv int,交叉验证生成器或iterable,默认值=无 确定交叉验证拆分策略。可能的投入 有关cv,请参见:

  • 无,要使用默认的5倍交叉验证
  • int,指定(分层)KFold中的折叠数
  • CV拆分器
  • 一个可分的屈服(训练、测试)分裂为指数数组

摘自

我用一个例子更新了这个问题,这可能有助于进一步解释我的问题。我很想知道为什么会产生两个不同的集合。看看这是否有帮助[1]:我用我的查询的一些进一步解释和示例更新了这个问题,我很想知道如何生成两个不同的集合,这两个不同的集合是通过k折叠拆分生成的(在你的例子中,你使用的是默认的5倍)。是的,这将导致数据集(位于
train_scores
数组中)出现5个不同的分割和5个不同的train分数,如何计算
有效_分数
数组?这不是它的工作方式。它将产生5个折叠,4个折叠执行训练,1个折叠执行验证,重复5次,以便每个折叠选择一次进行验证,并对结果进行平均。应该只有1个数组具有验证分数值,为什么有两个单独的训练和验证分数。那么训练成绩是如何计算的呢?是否通过使用训练数据检查4倍训练模型来计算训练分数,是否通过使用训练模型预测最终折叠来检查验证数据?