Weka 中的交叉验证

Posted

技术标签:

【中文标题】Weka 中的交叉验证【英文标题】:Cross Validation in Weka 【发布时间】:2012-05-13 08:09:21 【问题描述】:

从我读到的内容中,我一直认为交叉验证是这样执行的:

在k-fold交叉验证中,原始样本是随机的 划分为 k 个子样本。在 k 个子样本中,单个子样本 保留作为测试模型的验证数据,并且 剩余的 k-1 个子样本用作训练数据。这 然后将交叉验证过程重复 k 次(折叠),其中 k 个子样本中的每一个都只使用一次作为验证数据。这 然后可以对折叠的 k 个结果进行平均(或以其他方式组合) 产生一个单一的估计

因此构建了 k 个模型,最后一个是这些模型的平均值。 在 Weka 指南中写道,每个模型始终使用所有数据集构建。那么 是如何工作的呢?模型是根据所有数据构建的吗?“交叉验证”意味着创建 k 折,然后对每个折进行评估,最终输出结果只是折的平均结果?

【问题讨论】:

【参考方案1】:

所以,这又是一个场景:你有 100 个标记数据

使用训练集

weka 将采用 100 个标记数据 它将应用一种算法从这 100 个数据中构建分类器 它将分类器再次应用于 这100条数据 它为您提供了 分类器(应用于相同的 100 个数据) 开发)

使用10倍CV

Weka 需要 100 个标记数据

它产生 10 个相同大小的集合。每组分为两组:90个标记数据用于训练,10个标记数据用于测试。

它使用算法从 90 个标记数据生成分类器,并将其应用于集合 1 的 10 个测试数据。

它对集合 2 到 10 做同样的事情,并产生 9 个以上的分类器

它对从 10 个相同大小(90 个训练和 10 个测试)集产生的 10 个分类器的性能进行平均

如果这回答了你的问题,请告诉我。

【讨论】:

我有 2 个问题:1)如果就像您说的那样,为什么在 Weka Guide 中写到在每种情况下(训练集和 CV),模型总是由所有数据构建的?正如您在 CV 中所写,最终模型是其他 10 个模型的平均值,对吗? 2)如果“你此时得到的模型是所有 10 个模型的平均值”,那么使用训练集和 CV 作为验证我怎么可能得到相同的模型? (希望这些问题不会显得太傻!) 1.这意味着对于每个折叠完整​​数据集都要考虑。此标准 CV 有一些变体,其中部分数据集用于单独测试。 2. “获得相同的模型”究竟是什么意思? 看看这个帖子link。所以模型在每个验证选项中都是完全相同的!如果你同意我的观点,请告诉我 所以,对于社区来说,很抱歉我不知道无论你选择训练集还是10倍CV,Weka都为你提供了相同的模型。我对我的答案和 cmets 进行了必要的更正,这样没有人会得到我之前对 Weka 的误解,尽管这是 ML 社区的惯常做法,即从 10 倍 CV 报告最佳模型或平均模型。我知道 Weka 提供了平均模型,但我完全错了。谢谢@Lazza87。 @Lazza87,你的链接失效了,你能更新一下吗?谢谢【参考方案2】:

我会在评论中回答,但我的声誉仍然不允许我这样做:

除了 Rushdi 接受的答案之外,我想强调的是,为交叉验证折叠集创建的模型在执行了性能测量并取平均值后都会被丢弃。

无论您的测试选项如何,生成的模型总是基于完整的训练集。由于 M-T-A 要求更新引用的链接,这里是:https://web.archive.org/web/20170519110106/http://list.waikato.ac.nz/pipermail/wekalist/2009-December/046633.html/。这是一位 WEKA 维护者的回答,指出了我写的内容。

【讨论】:

你知道是否有办法查看为交叉验证创建的模型吗? 是的:查看 weka 邮件列表 here 和 here 上的帖子 但是交叉验证的目的是什么?如果给用户的最终模型是基于完整数据集的,为什么我们需要交叉验证?我认为交叉验证是为了找到最好的模型 @lenhhoxung 据我了解,我们希望优化用于构建模型的算法参数。就像 SVM 或 ANN 的某些(超)参数一样。这就是为什么我们评估这些参数在不同的训练集和验证集上的表现如何(在 CV 的情况下)。对于可能用于实际预测的结果模型,使用尽可能多的训练数据通常是一个优势,因此在整个数据集上构建它是有意义的。【参考方案3】:

我想我明白了。以(例如)weka.classifiers.rules.OneR -x 10 -d outmodel.xxx 为例。这做了两件事:

    它基于完整数据集创建模型。这是写入outmodel.xxx 的模型。此模型用作交叉验证的一部分。 然后运行交叉验证。交叉验证涉及创建(在这种情况下)10 个新模型,并对数据片段进行训练和测试,如前所述。关键是交叉验证中使用的模型是临时的,仅用于生成统计信息。它们不等同于或用于提供给用户的模型。

【讨论】:

但是交叉验证的目的是什么?如果给用户的最终模型是基于完整数据集的,为什么我们需要交叉验证?我认为交叉验证是为了找到最好的模型 交叉验证被用作寻找最佳模型的一种方法,它只是一种充分利用有限数据来计算统计数据的方法(每一行在您的数据将用于测试)。【参考方案4】:

Weka 遵循您在此处提到的传统 k 折交叉验证。您拥有完整的数据集,然后将其分成不重叠的 k 个相等集(k1、k2、...、k10,例如 10 倍 CV)。然后在第一次运行时,以 k1 到 k9 作为训练集并开发一个模型。在 k10 上使用该模型来获得性能。接下来是 k1 到 k8 和 k10 作为训练集。从他们那里开发一个模型并将其应用于 k9 以获得性能。这样,将每个折叠最多使用 1 次的所有折叠作为测试集。

然后 Weka 对性能进行平均并将其呈现在输出窗格上。

【讨论】:

好的,但是这样最终模型是如何构建的呢? 10 个模型的平均值是建立在 CV 上的吗?如果是,是什么意思:总是使用所有数据集构建? 如果您在 Weka explorer 的分类选项卡上选择 10 折交叉验证,那么您获得的模型就是您获得 10 个 9-1 拆分的模型。您将不会有 10 个单独的模型,而是 1 个单独的模型。是的,你可以从 Weka(不是特别是 Weka,它适用于一般的 10 倍 CV 理论)中得到它,因为它贯穿整个数据集。 对不起,我完全看不懂……那么从模型如何选择“使用训练集”和“交叉验证”有什么区别?最终型号是一样的! 当您使用“使用训练集”时,如果您有 100 个实例,Weka 使用您定义的“分类算法”从所有 100 个实例构建模型。然后进行测试,它使用相同的 100 个实例。因此,通常在“使用训练集”上会提供良好的精确召回和 fmeasure。但是,当您使用 10 倍 CV 时,它会构建 10 个不同的模型和 10 个不同的倍数,并为您提供平均精度-召回-fmeasure。有时需要使用“训练集”,但在大多数情况下,10 倍 cv 更可取。具有这两种不同设置的最终模型永远不会相同。 那么请告诉我我是否理解得很好:使用 CV 我们构建了 10 个与真实模型“相似”的模型,这些模型是使用“相似”数据构建的,并且应该允许使用数据评估模型应该模仿未来可用的那些?【参考方案5】:

一旦我们通过将数据划分为 10 段并创建决策树并评估完成了 10 次交叉验证,Weka 所做的就是在整个数据集上第十一次运行该算法。这将产生一个我们可能在实践中部署的分类器。我们使用 10 折交叉验证来得到评估结果和估计误差,最后我们再做一次分类,得到一个实际使用的分类器。 在第 k 个交叉验证期间,我们将拥有不同的决策树,但最终的决策树是在整个数据集上创建的。 CV 用于查看我们是否存在过拟合或大方差问题。

【讨论】:

【参考方案6】:

根据怀卡托大学的“使用 Weka 进行数据挖掘”:

交叉验证是一种在反复坚持后改进的方法。 交叉验证是一种进行重复保持的系统方法,实际上通过减少估计的方差来改进它。

我们采用训练集并创建分类器 然后我们希望评估该分类器的性能,并且该评估存在一定量的差异,因为这都是统计数据。 我们希望将估计值中的方差保持在尽可能低的水平。 交叉验证是一种减少方差的方法,一种称为“分层交叉验证”的交叉验证变体可以进一步减少它。 (与“重复保留”方法相反,我们保留 10% 用于测试,然后重复 10 次。)

那么,Weka 中的交叉验证是如何工作的呢?:使用交叉验证,我们只将数据集划分一次,但我们分为 k 块,例如 10 块。 然后我们取出 9 块用于训练,最后一块用于测试。然后在同一个分区中,我们再取 9 块用于训练,留出的一块用于测试。我们做了 10 次整件事,每次都使用不同的部分进行测试。换句话说,我们将数据集分成 10 个部分,然后我们依次拿出这些部分进行测试,对其余部分进行训练,进行测试并平均 10 个结果。


这将是 10 倍交叉验证。将数据集分成 10 个部分(称为“折叠”); 依次拿出每个部分; 并对结果进行平均。 因此,数据集中的每个数据点都用于测试,9 次用于训练。 这是 10 倍交叉验证。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Weka 中的交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WEKA 中打印出交叉验证后的预测类

如何使用 Weka API 在 J48 / C4.5 上进行 10 倍交叉验证后保存最佳树

sklearn:文本分类交叉验证中的向量化

什么是分类算法中的“参数”

使用 R 对 randomForest 执行交叉验证

线性回归中的交叉验证