Weka 机器学习工作台非常易于使用,因此进行机器学习项目会非常有趣。
在本帖中,您将端到端地完成您的第一个 Weka 机器学习项目。本次实践的初步介绍将涵盖您在 Weka 中进行机器学习项目时需要完成的关键步骤。
完成此项目后,您将了解
- 如何分析数据集并提出可使用的数据准备和建模算法的假设。
- 如何在问题上抽查一套标准的机器学习算法。
- 如何呈现最终结果。
通过我的新书《Weka 机器学习精通》,其中包含分步教程和清晰的屏幕截图,帮助您启动项目。
让我们开始吧。

Weka 多类别分类教程
照片由 Johan Neven 提供,保留部分权利。
教程概述
本教程将引导您完成完成机器学习项目所需的关键步骤。
我们将按照以下流程进行:
- 加载数据集。
- 分析数据集。
- 评估算法。
- 呈现结果。
您可以将其作为使用 Weka 进行机器学习项目的过程的最低步骤模板。
在Weka机器学习方面需要更多帮助吗?
参加我为期14天的免费电子邮件课程,逐步探索如何使用该平台。
点击注册,同时获得该课程的免费PDF电子书版本。
1. 加载数据集
在本教程中,我们将使用鸢尾花分类数据集。
鸢尾花数据集中的每个实例都描述了鸢尾花的测量值,任务是预测该观测值属于 3 种鸢尾花中的哪一种。有 4 个数值输入变量,单位相同,量级也基本相同。您可以在 UCI 机器学习知识库 中了解有关数据集的更多信息。最佳结果的准确率约为 96%。
1. 打开 Weka GUI Chooser。

Weka GUI 选择器
2. 点击“Explorer”按钮打开 Weka Explorer。
3. 点击“Open file…”按钮,导航到data/目录并选择iris.arff。点击“Open button”。
数据集现已加载到 Weka 中。

Weka 加载鸢尾花数据集
2. 分析数据集
在开始建模之前,检查数据非常重要。
检查每个属性的分布以及属性之间的交互作用,可能会为我们可能使用的数据转换和建模技术提供线索。
描述性统计
在“Current relation”窗格中查看数据集的详细信息。我们可以注意到几点:
- 数据集名为 iris。
- 有 150 个实例。如果我们稍后使用 10 折交叉验证来评估算法,那么每折将由 15 个实例组成,这相当少。我们也许可以考虑使用 5 折,每折 30 个实例。
- 有 5 个属性,4 个输入和 1 个输出变量。
属性数量较少,我们可以使用特征选择方法进一步研究。
点击“Attributes”窗格中的每个属性,并查看“Selected attribute”窗格中的摘要统计信息。
我们可以注意到我们数据的一些事实:
- 所有属性都没有缺失值。
- 所有输入变量都是数值型的,其值范围在 0 到 8 之间。
- 最后一个属性是名为 class 的输出变量,它是名义型的,有三个值。
- 类别是平衡的,这意味着每个类别中的实例数量相等。如果它们不平衡,我们可能需要考虑平衡它们。
我们可能会从数据归一化或标准化中受益。
属性分布
点击“Visualize All”按钮,让我们来查看每个属性的图形分布。

Weka 单变量属性分布图
我们可以注意到数据形状的一些特点:
- 我们可以看到每个属性上类值的重叠但不同的分布。这是一个好迹象,因为我们可能能够分离出这些类别。
- 看起来 sepalwidth 具有类似高斯分布的特征。如果我们有更多数据,它可能会更接近高斯分布。
- 看起来其他 3 个输入属性具有近乎高斯分布的特征,但存在偏斜,或者在分布的低端有大量观测值。同样,这让我认为如果我们有数量级更多的数据,这些数据可能就是高斯分布。
- 我们还可以直观地看出类别是平衡的。
属性交互
点击“Visualize”选项卡,让我们来查看属性之间的一些交互。
- 增大窗口大小,以便所有图表都可见。
- 将“PointSize”增加到 3,使点更容易看到。
- 点击“Update”按钮应用更改。

Weka 属性散点图矩阵
查看输入变量的图表,我们可以看到类别在散点图上有很好的分离。例如,petalwidth 与 sepallength 以及 petal width 与 sepalwidth 是很好的例子。
这表明线性方法,以及决策树和基于实例的方法可能在此问题上表现良好。这也表明我们可能不需要花太多时间来调整或使用高级建模技术和集成。这可能是一个简单的建模问题。
3. 评估算法
让我们设计一个小型实验来评估一组标准的分类算法在该问题上的表现。
1. 关闭 Weka Explorer。
2. 点击 Weka GUI Chooser 上的“Experimenter”按钮启动 Weka Experiment Environment。

Weka实验环境
3. 点击“New”开始新实验。
4. 在“Experiment Type”窗格中,将“Number of folds”从“10”更改为“5”。
5. 在“Datasets”窗格中点击“Add new…”,然后在 Weka 安装目录中选择data/iris.arff。
6. 在“Algorithms”窗格中点击“Add new…”,并添加以下 8 种多类别分类算法:
- rules.ZeroR
- bayes.NaiveBayes
- functions.Logistic
- functions.SMO
- lazy.IBk
- rules.PART
- trees.REPTree
- trees.J48
7. 在算法列表中选择 IBK,然后点击“Edit selected…”按钮。
8. 将“KNN”从“1”更改为“3”,然后点击“OK”按钮保存设置。

Weka 设计的算法比较实验
9. 点击“Run”打开 Run 选项卡,然后点击“Start”按钮运行实验。实验应在几秒钟内完成。

Weka 执行 Weka 算法比较实验
10. 点击“Analyse”打开 Analyse 选项卡。点击“Experiment”按钮加载实验结果。

Weka 加载算法比较实验结果
11. 点击“Perform test”按钮,执行一项成对检验,将所有结果与 ZeroR 的结果进行比较。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Tester: weka.experiment.PairedCorrectedTTester -G 4,5,6 -D 1 -R 2 -S 0.05 -result-matrix "weka.experiment.ResultMatrixPlainText -mean-prec 2 -stddev-prec 2 -col-name-width 0 -row-name-width 25 -mean-width 0 -stddev-width 0 -sig-width 0 -count-width 5 -print-col-names -print-row-names -enum-col-names" 分析: Percent_correct 数据集: 1 Resultsets: 7 置信度: 0.05 (双尾) 排序方式: - Date: 10/06/16 8:02 AM Dataset (1) rules.Ze | (2) bayes (3) funct (4) funct (5) lazy. (6) trees (7) trees ---------------------------------------------------------------------------------------------------- iris (50) 33.33 | 95.47 v 96.33 v 96.33 v 95.20 v 94.27 v 94.53 v ---------------------------------------------------------------------------------------------------- (v/ /*) | (1/0/0) (1/0/0) (1/0/0) (1/0/0) (1/0/0) (1/0/0) 键 (1) rules.ZeroR '' 48055541465867954 (2) bayes.NaiveBayes '' 5995231201785697655 (3) functions.Logistic '-R 1.0E-8 -M -1 -num-decimal-places 4' 3932117032546553727 (4) functions.SMO '-C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K \"functions.supportVector.PolyKernel -E 1.0 -C 250007\" -calibrator \"functions.Logistic -R 1.0E-8 -M -1 -num-decimal-places 4\"' -6585883636378691736 (5) lazy.IBk '-K 1 -W 0 -A \"weka.core.neighboursearch.LinearNNSearch -A \\\"weka.core.EuclideanDistance -R first-last\\\"\"' -3080186098777067172 (6) trees.REPTree '-M 2 -V 0.001 -N 3 -S 1 -L -1 -I 0.0' -9216785998198681299 (7) trees.J48 '-C 0.25 -M 2' -217733168393644444 |
我们可以看到所有模型都有技能。每个模型的得分都优于 ZeroR,而且差异在统计学上是显著的。
结果表明,逻辑回归和 SVM 都达到了最高的准确率。如果要在两者之间选择,我们将选择逻辑回归,即使仅仅是因为它是一个更简单的模型。让我们将所有结果与逻辑回归结果进行比较,作为测试基准。
12. 在“Test base”中勾选“Select”,选择“functions.Logistic”,然后点击“Select”按钮选择新的测试基准。再次点击“Perform test”按钮执行新的分析。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Tester: weka.experiment.PairedCorrectedTTester -G 4,5,6 -D 1 -R 2 -S 0.05 -result-matrix "weka.experiment.ResultMatrixPlainText -mean-prec 2 -stddev-prec 2 -col-name-width 0 -row-name-width 25 -mean-width 2 -stddev-width 2 -sig-width 1 -count-width 5 -print-col-names -print-row-names -enum-col-names" 分析: Percent_correct 数据集: 1 Resultsets: 7 置信度: 0.05 (双尾) 排序方式: - Date: 10/06/16 8:05 AM Dataset (3) function | (1) rules (2) bayes (4) funct (5) lazy. (6) trees (7) trees ---------------------------------------------------------------------------------------------------- iris (50) 96.33 | 33.33 * 95.47 96.33 95.20 94.27 94.53 ---------------------------------------------------------------------------------------------------- (v/ /*) | (0/0/1) (0/1/0) (0/1/0) (0/1/0) (0/1/0) (0/1/0) 键 (1) rules.ZeroR '' 48055541465867954 (2) bayes.NaiveBayes '' 5995231201785697655 (3) functions.Logistic '-R 1.0E-8 -M -1 -num-decimal-places 4' 3932117032546553727 (4) functions.SMO '-C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K \"functions.supportVector.PolyKernel -E 1.0 -C 250007\" -calibrator \"functions.Logistic -R 1.0E-8 -M -1 -num-decimal-places 4\"' -6585883636378691736 (5) lazy.IBk '-K 1 -W 0 -A \"weka.core.neighboursearch.LinearNNSearch -A \\\"weka.core.EuclideanDistance -R first-last\\\"\"' -3080186098777067172 (6) trees.REPTree '-M 2 -V 0.001 -N 3 -S 1 -L -1 -I 0.0' -9216785998198681299 (7) trees.J48 '-C 0.25 -M 2' -217733168393644444 |
现在我们看到了一个截然不同的情况。尽管逻辑回归的结果更好,但分析表明,这些结果与其他所有算法的结果之间的差异在统计学上并不显著。
从这里开始,我们可以根据可理解性或复杂性等其他标准来选择算法。从这个角度来看,逻辑回归和朴素贝叶斯是很好的选择。
我们还可以尝试进一步改进一个或多个算法的结果,看看是否能获得显著的改进。如果我们更改“Significance”为不太严格的值 0.50,我们会发现树和 KNN 算法开始下降。这表明我们可以花更多时间在其余方法上。将“significance”改回“0.05”。
我们选择坚持使用逻辑回归。我们可以收集一些数字,用于描述模型在未见过的数据上的性能。
13. 勾选“Show std. deviations”以显示准确率分数的标准差。
14. 在“Displayed Columns”中点击“Select”按钮,选择“functions.Logistic”,然后点击“Select”按钮接受选择。这将只显示逻辑回归算法的结果。
15. 点击“Perform test”重新运行分析。
现在我们有了一个最终结果,可以用来描述我们的模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Tester: weka.experiment.PairedCorrectedTTester -G 4,5,6 -D 1 -R 2 -S 0.05 -V -result-matrix "weka.experiment.ResultMatrixPlainText -mean-prec 2 -stddev-prec 2 -col-name-width 0 -row-name-width 25 -mean-width 2 -stddev-width 2 -sig-width 1 -count-width 5 -show-stddev -print-col-names -print-row-names -enum-col-names" 分析: Percent_correct 数据集: 1 Resultsets: 7 置信度: 0.05 (双尾) 排序方式: - Date: 10/06/16 8:12 AM Dataset (3) functions.Logist ---------------------------------------------- iris (50) 96.33(3.38) | ---------------------------------------------- (v/ /*) | 键 (3) functions.Logistic '-R 1.0E-8 -M -1 -num-decimal-places 4' 3932117032546553727 |
我们可以看到,模型在未见过的数据上的估计准确率为 96.33%,标准差为 3.38%。
4. 定型模型并呈现结果
我们可以创建模型的最终版本,该模型在所有训练数据上进行训练,并将其保存到文件中。
1. 关闭 Weka Experiment Environment。
2. 打开 Weka Explorer 并加载data/iris.arff数据集。
3. 点击 Classify 选项卡。
4. 选择 functions.Logistic 算法。
5. 将“Test options”从“Cross Validation”更改为“Use training set”。
6. 点击“Start”按钮创建最终模型。

Weka 在整个训练数据集上训练最终模型
7. 右键单击“Result list”中的结果项,然后选择“Save model”。选择一个合适的位置并输入一个合适的名称,例如“iris-logistic”。
此模型稍后可以加载并用于对新的花卉测量进行预测。
我们可以使用上一节收集的模型准确率的均值和标准差来量化模型在未见过的数据上的估计准确率的预期变异性。
例如,我们知道 95% 的模型准确率将落在均值准确率的两个标准差范围内。或者,换一种更易于向他人解释的方式,我们可以普遍预期模型在未见过的数据上的性能将是 96.33% 加上或减去 2 * 3.38,即 6.76,准确率在 87.57% 到 100% 之间。
您可以在维基百科页面 68–95–99.7 rule 中了解更多关于使用高斯分布的均值和标准差的知识。
总结
在本帖中,您已端到端地完成了使用 Weka 机器学习工作台的第一个机器学习项目。
具体来说,你学到了:
- 如何分析您的数据集,并为可能有用的一些特定数据转换和建模技术提出建议。
- 如何在问题上抽查一套算法并分析其结果。
- 如何定型模型以对新数据进行预测,并呈现模型在未见过数据上的估计准确率。
您对在 Weka 中运行机器学习项目或对此帖有任何疑问吗?请在评论中提问,我将尽力回答。
非常感谢您的帖子。我从中获益良多。
您能告诉我是否可以使用 Weka 对脑电图信号进行多类别分类吗?我有三个包含健康人脑信号的数据集,其余是癫痫发作和未癫痫发作的患者信号。
我之前对上述分析进行了二分类,使用了“正常”和“癫痫发作”类别。现在我想通过多类别分类进一步发展。鉴于我对数据挖掘和机器学习没有背景,我应该考虑哪种算法?作为一个新手,我将非常感谢任何建议或帮助。
很高兴听到这个消息,Pragya。
Weka 支持多类别分类。我不确定您问题的具体细节,您可能需要准备数据,使其成为合适的监督学习问题,并将数据组织成 CSV 或 ARFF 文件。
我们无法知道哪种算法最适合某个问题,我们必须通过试错来发现最有效的方法。有关更多信息,请参阅此帖。
https://machinelearning.org.cn/a-data-driven-approach-to-machine-learning/
嗨,Jason,
感谢您这篇有用的文章。您的博客对于入门机器学习非常好。
本文中唯一我不理解的是第 3.12 步,或者说您从中得出的结论。您能多解释一下吗?
Matt,您具体有什么问题?
“现在我们看到了一个截然不同的情况。尽管逻辑回归的结果更好,但分析表明,这些结果与其他所有算法的结果之间的差异在统计学上并不显著。”
我如何看出这是一个完全不同的情况?对我来说,它看起来非常相似。我在哪里可以看到统计显著性?
您好 Matt,这篇帖子可能有助于您更好地理解实验和结果中报告的统计显著性。
https://machinelearning.org.cn/compare-performance-machine-learning-algorithms-weka/
先生,
我是机器学习技术的新手。我使用了 Weka 3.9.0 进行多类别分类并获得了结果。我保存了训练好的模型。但我实际上需要在我的项目(使用 Visual Studio C++)中使用训练好的模型。我有一些图像,每张图像被分成不同的块。我需要做的是选择第一个块,然后使用训练好的模型找出它属于哪个类别,然后选择下一个块并执行相同的操作,依此类推。
先生,您能为我提供解决方案吗?我在这方面完全卡住了。我搜索了很多但没有找到解决方案。
您好 Preethi,
一些想法
– 也许可以使用 Weka 的 Java API 并将其集成到您的 Cpp 项目中。
– 或者使用 cpp 机器学习 API。
– 或者在您的 Cpp 项目中从头实现您想要的模型。
希望这些能作为一个开始有所帮助。
感谢您的考虑和回复。先生,我现在正尝试使用其他 C++ 包进行机器学习。
希望它能起作用。
再次感谢……
我很想听听您的进展,Preethi,以及您选择了哪些包。
嗨,先生……
我只是在谷歌上搜索了一下,找到了一些关于 dlib、shogun 和 shark 等包的信息。但现在我正在使用 OpenCV 进行机器学习。
我正在做一个简历排名项目。我使用了 Weka 进行机器学习,即简历的训练。
我最初为一种工作类型制作了一个包含 100 份简历的模型。
我的类变量是 suitability,它将简历排名为“good”、“average”或“poor”。
现在,如果我想为不同的工作类型制作一个单一模型,我需要多类别分类吗??
我如何在 Weka 中定义多个类别标签?
抱歉,我不认为 Weka 支持多标签分类。
干得好,Jason 博士。我发现您的帖子对我来说很有帮助,因为我是机器学习新手。我的问题是,我尝试保存结果模型但无法保存。它总是显示命令 java.io.FileNotFoundException: C:\Program File ………… (Access is denied)。先生,我需要您的帮助来解决这个问题。
我很遗憾听到这个消息,也许您可以尝试重新安装 Weka?
您好 Jason,讲解得很好。
我想问一下,是否可能从只有一个实例的每个类别的数据集(这是一个多类别分类问题)在 Weka 中构建模型?
其次,我们可以有一个数据集,其中一个实例有 n 个属性,而另一个实例有少于或多于 n 个属性,并从中构建模型吗?
您能否推荐一个网站,我可以获取将一组症状与其相关疾病映射的数据集?我查看了 UCI ML Repository 和 Kaggle,但没有找到。
提前感谢。
不,我认为这不够。
不,实例需要归一化,以具有相同类型和相同顺序的特征。
希望这能有所帮助。
谢谢你。
您能建议如何进行实例归一化吗?
请看这篇文章
https://machinelearning.org.cn/normalize-standardize-machine-learning-data-weka/
谢谢
很高兴它有帮助。
你好
我有一个不平衡的多类别(3个类别)数据集,我想使用 Weka 来平衡它。我该怎么做?我应该使用 one versus one 或 one versus all 算法吗?还是应该使用 smote 或 random undersampling 算法。我是机器学习和 Weka 的新手。如果您能帮助我,我将非常高兴。先谢谢您。
我在这篇帖子中提供了一些可能有帮助的想法。
https://machinelearning.org.cn/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
嗨,Jason,
我想问一下,是否可以通过应用 column1 上的某个条件来转换二分类器的标签(y),以获得第三种情况。
即,除了只有“Easy”和“Difficult”这两种情况作为输出之外,我需要根据附加特征应用一个条件,才能得到“Easy”、“Normal”、“Difficult”作为输出。
是的,这被称为多类别分类问题。
您可以在这里看到一个完成多类别分类问题的示例。
https://machinelearning.org.cn/how-to-run-your-first-classifier-in-weka/
你好
我发现多类别通常应用于监督学习。是否可以在无监督学习(聚类)的框架下执行多类别?
我需要将我的数据分类为多类别。
您能否指引我找到一篇科学文章或一个示例?
谢谢你
并不是真的。
有没有办法可视化分配给样本的类别?
(这仅提供聚类评估)
我们可以从GUI生成Java代码吗?
是的,您可以一次创建一个散点图来显示两个变量,并按类别为点着色。
您还可以使用PCA投影特征,并按类别为点着色。
您是否有关于多类别聚类的科学文章或示例?
抱歉,我没有,也许可以在Google Scholar上搜索一下?
嗨
我有一个多类别问题。我想使用层次分类的LCPN(每个父节点局部分类器)方法来解决这个问题。因此,我手动将原始数据集划分为2个级别的层次结构。级别1有4个父类别,每个父类别都有子类别。
我构建了级别1分类的模型,并取得了相当不错的结果。基于级别1的预测,现在我想将分类为类别1的实例发送给第二个分类器,该分类器区分类别1的子标签。同样,我想为其他父类别也重复此过程。我主要是这样做的,以避免LCPN相关的 the inconsistency problem。
这主要是我目前所做的。
X = data_frame.drop([‘region’], axis = 1) # 特征
y = data_frame[‘region’] # 标签
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
sm = SMOTE()
X_resampled, y_resampled = sm.fit_sample(X_train, y_train)
model = DecisionTreeClassifier().fit(X_resampled, y_resampled)
print(classification_report_imbalanced(y_test, predictions))
我有点纠结于如何根据级别1的预测继续进行第二级分类。您能给我一个建议吗?
谢谢
San
抱歉,我没有多级分类的示例。
在这种情况下,父分类器下有4个子分类器。每个子分类器的特征和标签都会不同。子分类器的标签也可能不平衡。
在父分类器阶段,我已经完成了训练测试拆分,并对X_train和y_train进行了过采样。我的问题是关于每个子分类器:
1.我是否需要再次进行训练测试拆分?
2.或者,在不进行训练测试拆分的情况下,我是否应该使用先前在父分类器阶段进行过采样的
数据集?
3.如何定义每个子分类器的特征、标签和测试集?
4.我是否需要再次对标签进行过采样,因为它们是不平衡的?
我想做的是将父分类器分类为类别1的实例发送到子分类器1,依此类推。
谢谢
San
我认为您描述的是模型的集成。
不,训练/测试拆分发生在最高级别,特征选择和任何其他数据转换也是如此。
谢谢。实际上,我想解决的是层次分类问题。我的方法是:
1.为层次树中每个节点的子节点训练一个分类器。例如,分类器
1对父类别1和父类别2之间的项目进行分类。
2.然后,用父类别1的项目训练一个分类器,该分类器对
子类别1、子类别2和子类别3之间的项目进行分类。等等。
在第2步中,为了用父类别1的项目训练一个分类器,我应该从哪里获取属于父类别1的实例?是从之前过采样的数据集还是从原始的X_train?
谢谢
San
我不确定Weka是否足够灵活来处理这种类型的问题。也许可以发布到Weka用户组?
谢谢。我想用Python来做。您知道如何用Python来做吗?
是的,我相信您可以在Python中编写类似的代码。
这样解决上述问题是否可以?
1.将整个数据集分为训练集(70%)和测试集(30%)
2.对训练集进行过采样(因为它不平衡)
3.使用过采样后的训练集训练父分类器,并在整个测试集上进行测试
对于父分类器下的4个子分类器中的每一个,
4.获取过采样后的训练集(在步骤2中过采样后获得的数据集)
5.过滤仅属于特定子分类器的实例。因为过采样后的
数据集中包含属于所有4个子分类器的实例。
6.使用这些实例创建一个数据集。包括特征和标签。
7.将创建的数据集分为子训练集(70%)和子测试集(30%)
8.对子训练集进行过采样(因为类别不平衡)
9.使用步骤8中的过采样后的子训练集训练模型,并在子测试集上进行测试
我无法调试您的流程。也许可以尝试一下?