☰
Weka天气分类实验复现:ARFF数据准备与kNN、朴素贝叶斯、ID3算法对比
2026/10/14 12:05:27 网站建设 项目流程

简介:面向机器学习与数据挖掘初学者及需要快速掌握Weka平台应用的读者,这份PDF资料以开源Weka为环境,聚焦天气数据分类这一典型场景。文档先简介Weka这款由新西兰怀卡托大学开发的纯Java开源项目,说明其集成多种机器学习算法、可视化友好且支持数据预处理;随后系统梳理K近邻、朴素贝叶斯与决策树Id3算法的原理,以及从原始两周天气样本到arff格式数据转换、建立分类模型和测试对比的完整流程,特别指出Id3算法在样本上达到100%准确率而朴素贝叶斯略低,能直观体现算法选型对分类效果的重要性。包体为单份PDF文件,共1个文档,大小约80KB,轻量精炼,便于下载后随时查阅。目前已有140人学习下载,该资料在有限篇幅内覆盖了从工具介绍到实验分析的关键环节,搭配完整案例路径,适合课程设计、论文写作或实验前快速摸底,具有明确的专业指导价值。

1. 从开源机器学习的第一步看起:为什么复现这份Weka天气分类实验值得

如果你正在找一份不用写代码、点鼠标就能跑通的机器学习入门路线,我把话说在前面:这份关于开源机器学习Weka环境下的数据分类算法实现及应用的PDF,比很多教程更适合照做一遍。它的实验场景是最经典的天气样本,两周14条记录,涉及kNN、朴素贝叶斯和ID3三类分类算法,最后得出的结论也不复杂——Weka平台能稳定完成天气数据的分类模型构建,算法选型会直接影响分类精度。

我当初已经用scikit-learn跑过几个小项目,回头用Weka复现这个实验时,反而把“评估方式”这个最基础的环节看清楚了。所以无论你是准备课程设计的在读学生,还是刚转入数据分析岗位的新手,这套资料都能当一条独立操作主线:从ARFF数据准备开始,到搭建分类模型,再看懂评估指标,中间没有多余的环节。下面直接进入数据准备的部分。

2. 先解决“数据怎么进去”:Weka ARFF格式与天气样本的规范化

Weka主界面的数据加载方式看似简单,实际很多新手喜欢直接拖CSV进Explorer,然后在Preprocess面板发现属性类型识别错、中文列名变成乱码、逗号分隔引起的列错位,最后连怎么修都找不到头。我的习惯是:无论原始数据来自PDF、Excel还是爬虫,一律先整理成一个规范的ARFF文件再进平台。道理很简单,ARFF把属性定义、取值类型和数据记录分开写清楚,Weka解析时几乎不会产生歧义,排查成本最低。

2.1 原始天气数据到底有几列

打开这篇PDF,你会发现原文在“数据准备”那段混入了一段无关内容:“@rela BreastCancer_train”、“Contig 12345-RC”这些字样,明显是排版时把别处的剪贴内容带进来了。真正属于本实验的天气样本,是五列输入加一列目标的六列结构:

  • outlook:前景/天气状况,取值为sunny、overcast、rainy
  • temperature:温度,原文标称类型,取值为hot、mild、cool三种离散档位
  • humidity:湿度,原文标称类型,取值为high、normal两档
  • windy:是否刮风,取值为TRUE、FALSE
  • play:是否适合娱乐外出,取值为yes、no,这是最终分类目标

注意一个细节:原文把temperature和humidity都写成“标称”(nominal),这和Weka自带的weather.arff版本对应。Weka安装目录里还有一份weather.numeric.arff,把温度和湿度改成数值型,属于同一份数据的另一种编码。论文复现用nominal版更贴合原意;如果你拿到的是数值版,结论基本一致,但决策树的分裂顺序和概率估计会略有差别。这里先按论文的原始设定来。

2.2 把数据写成ARFF:格式要点与完整样例

Weka的原生数据格式是ARFF(Attribute-Relation File Format)。一个最小的ARFF文件长这样:

@relation weather @attribute outlook {sunny, overcast, rainy} @attribute temperature {hot, mild, cool} @attribute humidity {high, normal} @attribute windy {TRUE, FALSE} @attribute play {yes, no} @data sunny,hot,high,FALSE,no sunny,hot,high,TRUE,no overcast,hot,high,FALSE,yes rainy,mild,high,FALSE,yes rainy,cool,normal,FALSE,yes rainy,cool,normal,TRUE,no overcast,cool,normal,TRUE,yes sunny,mild,high,FALSE,no sunny,cool,normal,FALSE,yes rainy,mild,normal,FALSE,yes sunny,mild,normal,TRUE,yes overcast,mild,high,TRUE,yes overcast,hot,normal,FALSE,yes rainy,mild,high,TRUE,no

文件头部分分三段:@relation给数据集命名;@attribute按顺序声明每个列;@data之后每行是一条记录,字段之间用逗号分隔,顺序必须和上面@attribute声明完全一致。Weka是从左到右按位置分配属性,不会像SQL那样按列名匹配。换句话说,你把temperature和humidity两列写反,模型照样能跑,只是结果完全不对。

参数上注意两类写法:枚举列要把所有合法取值用花括号列出来,逗号后不带空格是惯例;数值列直接写numeric,有些教程写成integer或real,Weka几乎都按数值处理,但为了兼容性建议统一用numeric。属性名本身如果带空格或特殊字符,必须在@attribute声明处用单引号包起来,比如@attribute 'play time' {yes, no},数据行里不需要引号。Weka解析器很严格,这个引号丢了就是加载失败。

2.3 从CSV转换到ARFF:一个可复用的Python脚本

很多人的原始数据在Excel里,保存成CSV后手动改成ARFF既费时间又容易错。常见做法是写一个十几行的Python脚本自动转换。假设我从Excel导出的weather.csv长这样:

outlook,temperature,humidity,windy,play sunny,hot,high,FALSE,no sunny,hot,high,TRUE,no overcast,hot,high,FALSE,yes ...

转换脚本如下:

import csv def is_number(s): try: float(s) return True except ValueError: return False with open('weather.csv', newline='', encoding='utf-8') as f: rows = list(csv.reader(f)) header, data = rows[0], rows[1:] lines = ['@relation weather', ''] for i, col in enumerate(header): values = [r[i] for r in data] if all(is_number(v) for v in values): lines.append(f'@attribute {col} numeric') else: uniq = sorted(set(values)) lines.append(f'@attribute {col} {{{", ".join(uniq)}}}') lines += ['', '@data'] lines += [','.join(r) for r in data] with open('weather.arff', 'w', encoding='utf-8') as f: f.write('\n'.join(lines)) print('转换完成,共', len(data), '条记录')

逻辑说明:脚本先读CSV全部行,用is_number判断每一列的所有取值是不是数值;全是数值就声明成numeric,否则把这列去重后的取值拼成枚举。这样outlook、windy、play会被自动识别成枚举,temperature、humidity是还是numeric看原始CSV内容,如果CSV里写的是high/normal这类文本就同样进枚举分支。代码不依赖任何第三方库,装好Python就能跑。

参数说明:Windows下Excel保存的CSV经常是GBK编码,读取时要改成encoding='gbk'才能避免乱码。脚本默认写出的ARFF是UTF-8编码,正好满足Weka的解析要求。转换完先别急着建模,用记事本打开ARFF检查一遍数据行,尤其看末尾有没有多余空行,有的话删掉,否则Weka会把空行当成一条缺失记录。

3. 三类分类算法怎么选:kNN、朴素贝叶斯与ID3的边界和理由

数据文件准备好以后,下一步不是急着点Start,而是把PDF里提到的三类算法放在同一张桌上对比。kNN、贝叶斯、决策树代表三种完全不同的决策逻辑:一个靠距离,一个靠概率,一个靠信息增益。同样的数据,换一种算法就可能换一种结论,这正是原文想表达的核心。下面逐个说清它们的原理、适用边界和在这份天气数据上的实际表现。

3.1 kNN:作为“懒学习”的基准,但你放对了归一化吗

kNN(K-近邻)是数据挖掘里最直接的监督分类方法。它没有训练阶段,把训练实例原样存下来,预测时计算未知样本y与每个实例的距离,挑出最近的k个邻居,少数服从多数决定类别。所以它常被叫作“懒惰学习”——训练阶段几乎零开销,真正的计算全在预测那一刻。

不过这里有两个坑。第一是量纲问题:如果数据里有数值型属性,比如温度按华氏度80到90、湿度按百分比60到100,直接算欧氏距离时,数值范围大的列会主导距离计算,最后相当于只比较了湿度。第二是“懒”的代价:每次预测都要遍历全部训练样本,样本一多,响应时间和内存开销都撑不住。所以在Weka里用kNN时先看数据要不要归一化,用Preprocess中的Normalize或Standardize做处理,并且在样本规模较大时谨慎选它。在这份14条天气数据上跑kNN,能看出算法流程但说明不了太多泛化能力,更合适的定位是基准对照。

3.2 朴素贝叶斯:条件独立让计算可负担,也让错误有了来源

贝叶斯分类的本质是用概率做决策:对每个可能的类别c,计算给定样本x下属于c的后验概率,选最大的那个作为输出。理论上要算联合概率P(c|x1,x2,...,xn),属性多时根本无法精确估计,朴素贝叶斯于是引入一个强假设:各属性在给定类别下条件独立。有了这个简化,后验概率就能拆成先验概率乘各个条件概率的连乘,计算量一下子降到线性级别。

Weka里的NaiveBayes,对离散属性统计频率,对数值属性则按高斯分布拟合。天气样本中outlook和humidity并不独立——下雨天往往湿度更大——如果算法硬把它们当独立事件,概率估算就会跑偏。这也是朴素贝叶斯在这份小样本上准确率低于ID3的原因之一。但别急着否定它:在文本分类这类高维稀疏场景里,独立性假设反而让模型稳定。原文说贝叶斯算法能较好地预测待定样本类别,前提是数据特征近似独立。实际使用时,先把强关联的冗余特征去掉再交给朴素贝叶斯,效果会可靠很多。

3.3 ID3决策树:为什么在14条数据上能拿到100%

ID3的选属性标准是信息增益。它从根节点出发,逐个计算每个属性的信息增益,挑增益最大的属性做分裂,然后递归对子集重复,直到叶子节点样本类别完全一致或属性用完为止。手工算一次更直观:14条样本里play=yes有9条、play=no有5条,数据集熵约0.940。按outlook分裂后,sunny子集2 yes/3 no,overcast子集4 yes/0 no,rainy子集3 yes/2 no,加权熵约0.694,信息增益约0.246。按humidity分裂增益约0.151,按windy约0.048,按temperature约0.029。所以ID3第一步就会选outlook做根节点。这个手算过程恰好说明了ID3为什么能一直分下去,也解释了它为什么在这份数据上能拿100%。

14条样本、5个属性,ID3不断分裂直到每个叶子都纯,全部训练记录都被“背”进了一棵树。这个100%只说明模型在训练样本上记忆成功,并不代表它对未来天气有同等预测力。论文里“算法选择影响分类精准度”的判断没错,但要补一个限定词——“在训练集评估下”。对从业者而言,真正值得记的是:ID3是最早的启发式决策树版本,后来C4.5用信息增益率改进分叉偏好,Weka里的J48就是C4.5的Java实现。教学复现用Id3没毛病,真实项目我一般直接换J48或随机森林。

4. 在Weka里跑一遍分类:从Classify面板到准确率的判读

理论说完了,接下来是平台操作。很多教程只告诉你“点这里、点那里”,跑完不知道数字从哪来。我按Weka 3.8的默认界面,把从加载ARFF到读结果全流程拆开讲,每一步对应一个判断依据。

4.1 进入Explorer并检查你的ARFF

启动Weka后,在GUI Chooser界面点击“Explorer”,进入后默认停在Preprocess标签页。点“Open file...”选择weather.arff,左侧Attributes列表会出现5个属性;点击每个属性,右侧Selected attribute区域会显示类型、缺失值数量、唯一值数量以及min/max/mean/stddev等统计量。先在这里做一次核对再进Classify:缺失值看到0,类型显示Nominal/Numeric符合预期,说明ARFF解析没有缺漏,后续实验才是可信的。

原论文说天气数据“一共有14组”,你对比左下角Instances数应该正好是14。如果这里显示0或者报错,多半是ARFF文件本身有问题,回到第2章去查逗号和引号。千万别跳过这步直接建模,Preprocess面板相当于仪表盘,数据长什么样、有没有异常值,都在这里先暴露出来。

4.2 Choose分类器与Test options的含义

进入Classify标签页,顶部Classifier区域默认显示的是ZeroR——一个只会预测多数类的基线模型。点击“Choose”按钮,在弹出的树形菜单里按路径找:

  • weka → classifiers → bayes → NaiveBayes
  • weka → classifiers → trees → Id3

选完后,Choose按钮右侧会出现算法名和默认参数,比如weka.classifiers.trees.Id3。鼠标点这串文字会弹出参数设置窗口。ID3的选项很少,基本不用动;NaiveBayes可以设置是否用核密度估计等,初学阶段保持默认即可。

Test options四个单选项是本实验最关键的决策点:

测试选项行为适合场景
Use training set全部样本同时用于训练和测试教学演示,衡量“记住数据”的程度
Supplied test set用外部独立的ARFF文件测试数据充足,建模时预先留出测试集
Cross-validation默认10折,每轮用9份训练、1份验证小样本最推荐,结果更接近泛化水平
Percentage split按比例随机拆成训练集和测试集数据量大、测试集固定

原论文选择Use training set做实验,复现论文结果必须照做;但你自己做练习时如果只用它,很容易被虚高的准确率迷惑。后面第5章会专门讲这个坑。

4.3 Start运行与结果区判读

选好分类器和测试选项,点Start,右侧会输出一串运行日志。这一段就能判断实验信息正确与否:Scheme显示的是算法全名,Relation显示weather,Instances显示14,Test mode显示你刚选的测试方式。如果Test mode和你的设置对不上,先回头看选项。

往下看Summary区域,ID3在Use training set下会显示:

  • Correctly Classified Instances:14,百分比100%
  • Incorrectly Classified Instances:0
  • Kappa statistic:1
  • Mean absolute error / Root mean squared error:0

换NaiveBayes再跑一次,正确分类数会变低。Detailed Accuracy By Class区域给出每个类别的TP Rate、FP Rate、Precision、Recall和F-Measure;最后是Confusion Matrix两行两列,对角线是正确分类,非对角线是错分。ID3的对角线会是9和5,对应yes和no两个类;NaiveBayes的矩阵里会出现非零的非对角线值,能直接看出哪个类被误判成了哪个类。

我一直觉得混淆矩阵比准确率数字更有信息量。准确率只告诉你整体猜对多少,矩阵告诉你错在何处。比如贝叶斯容易把“湿度高”的样本误分类成no,这种规律从矩阵里一眼就能看出。

4.4 用结果列表做对比实验

Classify面板左下角的Result list会记录每一次运行的输出。跑完ID3后再跑一次NaiveBayes,列表里就有两条结果,点不同条目可以在右侧切换查看。想留档就右键条目,选“Save result buffer”把文本存下来,选“Save model”把训练好的模型存成文件。

我自己的习惯是把ID3和NaiveBayes两个结果摆在一起,逐行核对Correctly Classified、Kappa、Precision三项。PDF里的做法也是这样:用两种算法测同一份数据,根据评估值选最合适的算法。当你亲眼看到不同算法的Summary数据并排出现时,“算法选择影响分类精度”这句话就不再是课本上的论断,而是你自己跑出来的差值。

5. 常见问题排查:五个让新手翻车的Weka实操点

这一章写我在复现过程中踩过、也见别人反复踩过的坑。每条按“现象→原因→解决”梳理,按顺序排查,大部分问题五分钟内能定位。

5.1 ARFF加载失败,提示wrong number of values

现象:Explorer里点Open file后直接弹错,或者数据行被解析成0行。

原因:最常见的是某一行数据多打了一个逗号,导致实际字段数和@attribute声明不一致;其次是文件结尾多了空行或空值行,Weka对行记录的数量要求很严格。

解决:先数CSV或手工文件里每一行的逗号数量,必须等于属性数减一。其次用Notepad++这类能看到行尾符的编辑器打开ARFF,删除文件末尾多余空行。属性名里带空格或括号时,检查@attribute声明处是否用了单引号,例如@attribute 'temperature (C)' numeric,数据行不用加引号但声明处必须加。这类问题占ARFF报错的大半。

5.2 CSV导入后列类型全错位

现象:直接导入CSV时,outlook或windy被识别成numeric,或者class列明明是枚举却被当成数值。

原因:Weka的CSV导入依靠列内取值推断类型,如果某列恰好全部由数字组成,比如温度列全是80、85这类整数,就会被识别成数值;日期格式也容易误判。

解决:不要在CSV导入阶段省事。用第2.3节的Python脚本把CSV转成ARFF,属性类型在文件头写死,Weka就不会再自动推断。转换后打开ARFF核对一遍类型再继续。ARFF的属性类型是声明式的,比CSV自动推断稳定得多。

5.3 Classify面板里找不到Id3分类器

现象:展开trees节点,只看到J48、RandomForest、REPTree,就是没有Id3。

原因:Weka不同发行版包含的算法集合有差异,精简包或部分旧版本把演示性算法裁掉;用手机端或二次修改过的包也常出现菜单不完整。

解决:去怀卡托大学的Weka发布页下载官方完整安装包,3.8系列和3.9系列里都能找到weka.classifiers.trees.Id3。如果只是看重决策树的可解释性,临时用J48跑同一条数据也能得到类似树形结果,但论文复现要求Id3,还是要装全对应版本。

5.4 用训练集评估报告100%,换交叉验证就掉

现象:Test options选Use training set,准确率100%;改成Cross-validation后,准确率明显下降甚至掉到八成以下。

原因:训练集评估衡量的是模型“记住”数据的能力,不是对新数据的泛化能力。14条小样本加一棵不剪枝的决策树,可以在训练阶段做到100%全对,这属于过拟合的典型表现。

解决:复现论文结果时保留Use training set的输出,但自己做结论时至少切到Cross-validation,默认Folds=10跑一遍。对比两次的准确率差值,差值越大说明模型过拟合越严重。以后凡是看到“小样本+100%准确率”的结论,先问一句它用的是哪种测试方式,再决定要不要采信。

5.5 中文属性名乱码,界面显示成“锟斤拷”

现象:打开含中文属性名的ARFF,Explorer里属性名和取值显示为乱码。

原因:文件被存成了ANSI或GBK编码,而Weka按UTF-8读取,编码不匹配导致字节被错误解析。

解决:在Notepad++里用“编码→转为UTF-8编码”菜单转换后再保存。稳妥的做法是ARFF里尽量不用中文属性名,属性名和取值都用英文;分类目标用yes/no这种无歧义的短词。做课程设计时老师要求中文界面展示没问题,但底层文件用英文,乱码概率几乎为零。

6. 别让“100%”骗了你:交叉验证与小样本实验的收尾习惯

6.1 在weather.arff上改用交叉验证

论文原实验用的是Use training set,这会得到一个好看但不够严谨的100%。我这里做一个反直觉验证:回到Classify面板,把Test options改成Cross-validation,Folds保持10,分别重跑Id3和NaiveBayes。

这时候Summary不再全绿,ID3的Correctly Classified Instances会变成12到13条之间,准确率在85%到93%上下浮动;NaiveBayes也有变化。原因很简单,10折交叉验证每轮都要拿掉一部分数据当验证集,模型没见过这些样本,测试结果才接近真实预测能力。对14条样本甚至可以用Leave-One-Out策略,Weka的Cross-validation里把Folds设为14,效果等同于留一法,每次只留一条验证。这种方法和训练集评估对比,你能直观看到过拟合的幅度。

命令行验证也可以做。Weka支持非GUI方式跑同一个实验,在终端执行:

java -cp weka.jar weka.classifiers.trees.Id3 -t weather.arff -i

-cp指定weka.jar所在路径,-t指定ARFF训练文件,-i输出评估明细。加-d id3.model可以把训练好的模型写盘。和GUI跑出来的是同一个算法,适合批量复现或写脚本时用。

6.2 把一次实验变成可复现的记录

小样本实验最怕的就是“跑完即忘”。我的习惯是每次都把三类文件留全:weather.arff或weather.csv原始数据、转换脚本、结果文本。Result list里右键保存的result buffer是txt格式,存到和ARFF同一个目录;模型文件用Save model导出,下次想用新数据预测时,在Test options里选Supplied test set加载新ARFF,再从工具菜单载入之前保存的模型,就能直接复现推理过程。

从那以后,我每次拿Weka做小数据实验,都会强制自己走“ARFF核对→训练集评估→交叉验证评估→保存模型”这一整条流程。小样本上的100%太容易迷惑人,真正能说服别人的是那个看起来没那么好看的交叉验证数字,以及你对它为什么不好看的解释。希望这篇笔记能帮你在同样的小样本上少花一点试错时间。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询