预测建模的问题在于创建能够在新未见数据上表现良好的模型。
因此,使用稳健的技术在可用训练数据上训练和评估模型至关重要。模型性能的估计越可靠,您就能越深入地提升性能,并确信它能转化为模型的实际应用。
在这篇文章中,您将了解在Weka中估计机器学习模型性能的各种不同方法。
阅读本文后,您将了解
- 如何使用训练数据集评估模型。
- 如何使用随机训练集和测试集分割评估模型。
- 如何使用K折交叉验证评估模型。
通过我的新书《Weka机器学习精通》**启动您的项目**,其中包括所有示例的**分步教程**和清晰的**截图**。
让我们开始吧。

如何在 Weka 中评估机器学习算法的性能
图片由Will Fisher提供,保留部分权利。
模型评估技术
有多种模型评估技术可供选择,Weka机器学习工作台提供了其中四种,如下所示:
训练数据集
在整个训练数据集上准备模型,然后用相同的数据集评估模型。这通常存在问题,尤其因为一个完美的算法可以通过简单地记忆(存储)所有训练模式并获得完美分数来“玩弄”这种评估技术,这会产生误导。
提供的测试集
使用另一个程序手动分割数据集。在整个训练数据集上准备模型,并使用单独的测试集来评估模型的性能。如果您有大量数据集(数万个实例),这是一种很好的方法。
百分比分割
每次评估模型时,随机将数据集分割成训练和测试分区。这可以提供一个非常快速的性能估计,并且与使用提供的测试集一样,仅当您拥有大量数据集时才更可取。
交叉验证
将数据集分成k个分区或折叠。在除了一个作为测试集的分区之外的所有分区上训练模型,然后重复此过程,创建k个不同的模型,并让每个折叠都有机会作为测试集。然后计算所有k个模型的平均性能。这是评估模型性能的黄金标准,但代价是创建更多模型。
您可以在Weka Explorer中加载数据集后,在“分类”选项卡中看到这些技术。

Weka算法评估测试选项
使用哪个测试选项
鉴于有四种不同的测试选项可供选择,您应该使用哪一种?
每个测试选项都有其时间和地点,总结如下:
- 训练数据集:仅在您拥有所有数据且对创建描述性而非预测性模型感兴趣时使用。因为您拥有所有数据,所以无需进行新的预测。您对创建模型以更好地理解问题感兴趣。
- 提供的测试集:当数据量非常大时,例如数百万条记录,并且您不需要全部数据来训练模型时。当测试集由第三方定义时也很有用。
- 百分比分割:非常适合用于快速了解模型性能。不应用于做出决策,除非您有非常大的数据集并且确信(例如,您已经测试过)分割充分描述了问题。常见的分割值是训练集和测试集分别为66%和34%。
- 交叉验证:默认选项。当您不确定时使用。通常比其他技术提供更准确的性能估计。当数据量非常大时不使用。k的常见值是5和10,具体取决于数据集的大小。
如果疑问,请使用k折交叉验证,其中k设置为10。
在Weka机器学习方面需要更多帮助吗?
参加我为期14天的免费电子邮件课程,逐步探索如何使用该平台。
点击注册,同时获得该课程的免费PDF电子书版本。
关于最终模型
测试选项关注于估计模型在未见数据上的性能。
这是一个需要内化的重要概念。预测建模的目标是创建一个模型,在未来带有新未知数据的情况下,在尚未完全理解的情境中表现最佳。我们必须使用这些强大的统计技术来最佳地估计模型在这种情境下的性能。
话虽如此,一旦我们选择了模型,它就必须被最终确定。这些测试选项都不用于此目的。
模型必须在整个训练数据集上进行训练并保存。模型最终确定这一主题超出了本帖的范围。
只需注意,最终模型的性能无需计算,它通过上述测试选项技术进行估计。
性能摘要
当您评估模型时,Weka会提供性能摘要。
在“分类”选项卡中,点击“开始”按钮评估算法后,结果会显示在“分类器输出”窗格中。
此窗格包含大量信息,包括:
- 运行信息,例如算法及其配置、数据集及其属性以及测试选项
- 所构建模型的详细信息(如果有)。
- 性能摘要,包括大量不同的度量。
分类性能摘要
在分类问题上评估机器学习算法时,您会得到大量性能信息需要消化。
这是因为分类可能是研究最深入的预测建模问题类型,并且有许多不同的方式来思考分类算法的性能。
分类算法的性能摘要中有三点需要注意:
- 分类准确率。这是正确预测数占所有预测数的比例,通常以百分比表示,其中100%是算法能达到的最佳结果。如果您的数据类别不平衡,您可能需要查看Kappa指标,它在考虑类别平衡的情况下呈现相同的信息。
- 按类别准确率。请注意每个类别的预测的真阳性率和假阳性率,这在问题类别分布不均匀或存在两个以上类别时具有指导意义。如果预测一个类别比预测另一个类别更重要,这可以帮助您解释结果。
- 混淆矩阵。一个表格,显示每个类别的预测数量与实际属于每个类别的实例数量的比较。这对于概览算法所犯错误的类型非常有用。

Weka分类性能摘要
回归性能摘要
在回归问题上评估机器学习算法时,您会得到许多不同的性能度量来审查。
值得注意的是,回归算法的性能摘要中有两点:
- 相关系数。这表示预测与实际输出值关联或变化的程度。0是最差的值,1是完美关联的预测集。
- 均方根误差。这是在测试集上以输出变量单位计算的平均误差量。此度量可帮助您了解给定预测平均可能错误的量。

Weka回归性能摘要
总结
在这篇文章中,您了解了如何在Weka中估计机器学习模型在未见数据上的性能。
具体来说,你学到了:
- 关于估计机器学习模型在未见数据上性能的重要性,这是预测建模的核心问题。
- 关于4种不同的测试选项以及何时使用它们,特别关注训练集和测试集分割以及K折交叉验证。
- 关于分类和回归问题的性能摘要以及需要关注的指标。
您对在Weka中估计模型性能或此帖子有任何疑问吗?请在评论中提出您的问题,我将尽力回答。
嗨,Jason,
我对使用交叉验证进行测试有点困惑。是不是我们将原始数据集分成训练子集和测试子集。然后我们在训练子集上使用交叉验证进行模型选择,并使用测试子集进行交叉验证来估计所选模型的性能?
谢谢
通常,在探索不同模型时,使用交叉验证来评估模型的性能就足够了。
为了增加稳健性,一个好主意是首先将数据集分成训练数据集和验证数据集,在训练数据集上进行交叉验证,一旦最终确定,在独立的验证集上评估数据集,作为防止过拟合的最后检查。
非常感谢!
不客气。
嗨,Jason,
我想通过分类的交叉验证来评估我提出的算法。我将数据分成两部分。测试数据是无标签数据,训练数据是有标签数据。然后通过回归测试对数据应用10折交叉验证,并根据训练数据预测测试数据中的标签数据。我已经计算了均方误差(MSe)和混淆矩阵的准确率。但我仍然困惑如何通过这些结果来评估我提出的算法?
嗨,Jason,
我对计算预测准确率有疑问。通常,对于分类,我们会在weka中获得准确率,但对于回归,如何计算准确率?请帮忙
你不能在回归中计算准确率。没有类别。
你必须使用其他度量,如RMSE或MAE或类似的。
但仍然有办法评估算法。不确定,但我认为与聚类类似。
是的,通过评估预测的误差(例如均方误差或类似)。
嗨 Jason
你说我们不能计算回归的准确性,但我需要那个……
不,我们计算误差。
再次嗨
如何计算误差???
误差 = 预测值 - 期望值
WEKA在分类器输出中给出的平均绝对误差是误差吗?那么RMSE呢??
MAE和RMSE对于分类(例如,类别标签)没有意义,除非它们报告的是预测概率的误差。
嗨,Jason,
比如说,我有1000个数据,我将其分成80%(训练数据集)和20%(测试数据集)。然后我将使用训练数据集执行10折验证,内部会将训练数据集进一步分成10%(1000个中的8%)验证数据和90%(1000个中的72%)训练数据,并轮流每个折叠,然后根据生成的准确率选择我的模型(模型选择)。一旦模型被选择,我将使用保留的20%测试数据(1000个中的20%)进行测试。
这种方法正确吗?因为根据一些文献,这是我理解的。因此,出现了训练、验证和测试数据这些术语。
另一个问题
据我理解,计算K折准确率的公式是:
K折准确率 = 各个K折的总准确率 / K = 各个K折的总准确率的平均值
然而,我能否应用每个类别的准确率来计算每个K折的准确率?
这样,如果我的数据有6个不同的类别,公式将是:
单个类别准确率 = 类别的正确预测数 / 总数据量
单个K折准确率 = 单个类别准确率总和 / 6 = 单个类别准确率总和的平均值(在每个折叠中)
K折准确率 = 单个K折的总准确率 / K
其中每个类别的准确率都是从混淆矩阵得出的。
我正在处理超过254,000个数据集,当我运行代码时。Python执行了很久,但仍然没有结果。这是正常现象吗?请指教。
非常感谢
也许吧,这真的取决于数据集和你的硬件。
也许可以尝试使用较小的数据样本?
你好,我想问一下,如果我有关于属性百分比的数据,例如城市A、城市B特定位置的空气百分比,即氧气、二氧化碳、一氧化碳等,哪种技术和算法适合这种数据?
请看这篇文章
https://machinelearning.org.cn/a-data-driven-approach-to-machine-learning/
嗨,Jason,
我应该在weka的默认数据集中使用训练数据、提供的测试集还是交叉验证来处理soybean.arff文件?
请帮忙
Weka会自动为您分割数据。
如何选择最终的回归模型?例如,如果我使用RMSE作为度量,并且我有两个模型A和B。如果RMSE(A, train)RMSE(B, test),那么您更喜欢哪个模型?A还是B?
也许是RMSE最低且标准差最小的那个。
真的很有帮助!非常感谢。
谢谢,很高兴听到这个。
如果我使用提供的测试集,分类器的准确性会降低。在此之前,我使用交叉验证对单个arff文件进行测试,准确性为92%,但在提供的测试集情况下,准确性只有82%。我不知道这是对还是错。请指导我。
这真的取决于数据集。
一般来说,交叉验证是更准确的性能估计,而训练/测试评估则过于乐观,除非测试集非常大。
嗨……我想为1000个数据集找到聚类精度,我可以使用纯度吗?我的错误实例很高……我该怎么做?
抱歉,我没有任何关于聚类的教程。
如何在weka中提供测试数据集?只能通过使用提供的测试集吗?还有其他方式提供测试数据集吗?
您也可以使用数据的自动分割或数据的自动交叉验证。
嗨,Jason,我积极关注你的博客。我没有找到关于如何计算算法(比如RNN)的训练和测试时间的博客。你能指导我如何计算算法的测试时间吗?期待你的回复。
你说的训练和测试“时间”是什么意思,是指epoch的数量吗?
如果是这样,请将其设置为一个非常大的数字,并使用早期停止来结束训练过程
https://machinelearning.org.cn/how-to-stop-training-deep-neural-networks-at-the-right-time-using-early-stopping/
如何找出哪种算法最适合特定结果?如果我使用决策树和朴素贝叶斯,哪种在两者之间表现最好,如何通过分类器输出来检查?
好问题,这可能有所帮助
https://machinelearning.org.cn/faq/single-faq/what-algorithm-config-should-i-use
我有数千个CSV数据集文件,特别是与网络数据包相关的。如果我使用百分比分割并填充50%的值,weka会自动将我的数据用于50%的训练和50%的测试吗?我们能应用交叉验证吗?
我相信在使用Weka时,您可能需要首先将所有数据放在一个文件中,或者放在训练/测试文件中。
你好……如果我有一个复杂的决策树但准确率很高,这意味着什么?
你到底担心什么?
嗨,Jason,当使用66%的百分比分割时,准确率低于50%正常吗?我正在使用大约40个数据集,它们在属性和实例数量上都有所不同,其中大多数的准确率都在75%以上,只是想知道为什么这些值低这么多,以及它们是否可以更低。
这真的取决于数据集和模型的选择。
也许可以将结果与零规则进行比较,看看在相同数据分割下结果是否有效?
你好Jason,我如何获得每个类别正确分类实例的百分比?
— 我正在尝试找出对于给定的分类器,与其余类别相比,哪个类别被更好地正确分类了。
准确率是所有类别的全局度量。
相反,您可能需要查看每个类别的精确率和召回率,这可以帮助您理解其含义
https://machinelearning.org.cn/framework-for-imbalanced-classification-projects/
嗨 Jason
我想问一下误差度量:MMRE(相对误差的幅度均值)和PRED(30)(相对误差偏差百分比)
我在WEKA中哪里可以找到或者如何将其添加到WEKA中?
提前感谢
抱歉,我不确定。您可能需要编写自定义代码。
我是否可以使用仅交叉验证而无需训练测试,因为完美的算法可能会玩弄这种评估技术,非常感谢,我正在使用(XGBoost)集成
您可以使用训练/测试分割或K折交叉验证,无需同时使用两者。
嗨,Jason,
我将整个数据集分成80/20%。80%用于交叉验证,其余20%用于模型评估的最终测试。那么,您能帮我解决如何在WEKA中用k折交叉验证训练模型后,在测试(未见)数据上测试模型吗?比如我们如何保存模型,或者模型在WEKA中训练后会自动保存,然后我们可以在提供的测试集中提供其余20%的数据来评估模型?
谢谢你
阿里
一种方法是使用所有数据进行k折交叉验证。
另一种方法是先分割数据,将训练集和测试集保存为单独的文件,然后将它们加载到Weka中作为训练集和测试集。
嗨 Jason
我想手动使用weka执行10折交叉验证。我应该对训练折叠使用SMOTE技术,并让测试折叠保持原始状态,然后重复此过程10次。我如何使用weka做到这一点?
你好Farzin……你可能会对以下内容感兴趣
https://experienceweka.wordpress.com/