交叉验证和网格搜索有啥区别?

Posted

技术标签:

【中文标题】交叉验证和网格搜索有啥区别?【英文标题】:What is the difference between cross-validation and grid search?交叉验证和网格搜索有什么区别? 【发布时间】:2013-10-20 12:55:49 【问题描述】:

简单来说,交叉验证和网格搜索有什么区别?网格搜索如何工作?我应该先进行交叉验证,然后再进行网格搜索吗?

【问题讨论】:

【参考方案1】:

交叉验证是指您保留部分数据以用于评估模型。有不同的交叉验证方法。最简单的概念是只取 70%(这里只是一个数字,不一定是 70%)的数据并用于训练,然后使用剩余 30% 的数据来评估模型的表现。您需要不同数据来训练和评估模型的原因是为了防止过度拟合。当然,还有其他(涉及程度稍高)交叉验证技术,例如在实践中经常使用的 k-fold 交叉验证。

网格搜索是一种进行超参数优化的方法,即寻找超参数的最佳组合的方法(超参数的一个例子是优化器的学习率),对于一个给定模型(例如 CNN)和测试数据集。在这种情况下,您有几个模型,每个模型都有不同的超参数组合。对应于单个模型的这些参数组合中的每一个都可以说位于“网格”的一个点上。然后目标是训练每个模型并评估它们,例如使用交叉验证。然后选择表现最好的那个。

举一个具体的例子,如果您使用支持向量机,您可以为gammaC 使用不同的值。因此,例如,您可以有一个具有以下 (gamma, C) 值的网格:(1, 1), (0.1, 1), (1, 10), (0.1, 10)。它是一个网格,因为它就像[1, 0.1] 对应gamma[1, 10] 对应C 的乘积。网格搜索基本上会为这四对 (gamma, C) 值中的每一个训练一个 SVM,然后使用交叉验证对其进行评估,并选择表现最好的一个。

【讨论】:

【参考方案2】:

交叉验证是一种稳健地估计模型的测试集性能(泛化)的方法。 网格搜索是一种从一系列模型中选择最佳模型的方法,由参数网格参数化。

这里的“模型”,并不是指经过训练的实例,更多的是算法和参数,比如SVC(C=1, kernel='poly')

【讨论】:

我明白这一点。但是在 scikit-learn 的示例中,首先通过执行 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.5, random_state=0 拆分数据集,然后在网格搜索中进行 clf = GridSearchCV(SVC(C=1), tuned_parameters, cv=5, scoring=score)so 这是否意味着第一步将例如 1000 个训练集拆分为 500 个训练和 500 个测试对象,然后网格搜索将 500 个训练集拆分为“cv=5”5 折交叉验证?那么 500 个对象拆分为 250 和 250 或 400 和 100 等等?!跨度> 是的,没错。 网格搜索模型选择(使用 5 折交叉验证)之后保留一半数据用于评估。原因是他们不仅想选择最好的模型,还想对它的泛化程度(它在新数据上的表现如何)有一个很好的估计。您不能只使用网格搜索交叉验证的分数,因为您选择了得分最高的模型,因此其分数中可能存在某种选择偏差。这就是为什么他们在网格搜索结束后保留​​部分数据进行测试的原因。【参考方案3】:

交叉验证,简单地将测试和训练数据分开,并使用测试数据验证训练结果。我知道有两种交叉验证技术。

首先,测试/训练交叉验证。将数据拆分为测试和训练。

第二,k-fold 交叉验证将您的数据拆分为 k 个 bin,将每个 bin 用作测试数据,并将其余数据用作训练数据,并根据测试数据进行验证。重复该过程 k 次。并获得平均性能。 k-fold 交叉验证对小数据集特别有用,因为它可以最大化测试和训练数据。

网格搜索;系统地处理参数调整的多种组合,交叉验证每个组合并确定哪一个提供最佳性能。您可以通过多种组合进行工作,只需稍微更改参数即可。

【讨论】:

【参考方案4】:

交叉验证是一种保留数据集的特定子集的方法,您不会在该子集上训练模型。稍后,您在最终确定之前在此子集上测试您的模型。

进行交叉验证需要执行的主要步骤是:

    将整个数据集拆分为训练数据集和测试数据集(例如,整个数据集的 80% 为训练数据集,其余 20% 为测试数据集)

    使用训练数据集训练模型

    在测试数据集上测试您的模型。如果您的模型在测试数据集上表现良好,请继续训练过程

还有其他的交叉验证方法,例如

留一法交叉验证 (LOOCV)

K 折交叉验证

分层 K 折交叉验证

对抗性交叉验证策略(当训练和休息数据集彼此相差很大时使用)。

【讨论】:

这没有回答原始问题。您没有解释交叉验证和网格搜索之间的区别。【参考方案5】:

简单来说, 考虑制作意大利面作为模型:

交叉验证 - 选择意大利面的数量 网格搜索 - 选择正确的成分比例。

【讨论】:

以上是关于交叉验证和网格搜索有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习交叉验证和网格搜索

K-近邻算法交叉验证,网格搜索

机器学习交叉验证和网格搜索案例分析

交叉验证与网格搜索

在 scikit learn 中结合网格搜索和交叉验证

机器学习之交叉验证和网格搜索