
简介面向初学数据挖掘、准备上手 WEKA 的读者这份文档围绕“weak 操作入门”梳理平台的基本概念与操作路径适合作为课程实验、自学入门或数据分析的前置阅读。压缩包仅含 1 个 doc 文件约 172KB篇幅集中便于快速通读和打印标注。内容从 WEKA 的怀卡托智能分析环境背景讲起说明其开源接口、算法集合与可视化能力并重点解释实例、属性、关系等术语以及 ARFF 文件的头信息、数据信息、属性声明顺序和数据类型同时给出 CSV、Excel、Matlab 数据转换与属性名补全的思路配合 weather.arff 示例帮助理解二维表格的组织方式。已有 794 人学习可作为了解数据挖掘工具、建立数据格式概念的轻量入门材料。1. 搜 weak 的人多半在找 WEKA一个开箱即用的数据挖掘工作台把「weak 操作入门」敲进搜索框的十个里有八个真正想找的是 WEKA。名字被记错是常有的事反正念起来差不多能搜到就行。它是跑在 JVM 上的一个数据挖掘工作台装完双击打开就是图形界面不用写一行建模代码也能把一份表格跑出分类结果、聚类结果和关联规则。它把数据预处理、分类、回归、聚类、关联规则、可视化这几件事塞进了同一个窗口数据集统一用一种叫 ARFF 的纯文本格式描述出了问题能一行一行对着看。它适合两类人一类是要在半天内跑出一个可用基线、但不想先啃完整个机器学习课程的人另一类是已经会用脚本调库但需要一个能对着点、能截图、能当场讲给别人听的工具的人。它的边界也很清楚数据量到几十万行以后交互式界面的响应会明显变慢参数调优也不如脚本灵活。先把这条线记住后面的操作就不会走歪。2. 把 Excel 表格变成 ARFF文件结构逐行拆开看2.1 为什么 WEKA 不直接吃 Excel非要一个 ARFFWEKA 内部所有算法共用一套内存结构属性名、属性类型、取值集合、目标列是哪一列全部在数据结构里定死。ARFF 就是这套结构的文本投影读文件的过程等于把类型信息一次性对齐对齐失败就直接报错不会带着半残的数据往下跑。这个设计很笨但它把问题挡在了最前面。对比一下CSV 里一列85到底是数值还是编号完全靠猜一列yes/no里混进一个YES脚本里可能被静默当成新的取值。ARFF 要求你把这层信息显式写出来写错就报错报错位置精确到行。代价是三件事必须记住属性声明的顺序就是数据列的物理顺序最后一个属性默认是分类任务的目标变量所有类型必须人工声明。日常最常遇到的三个现象都可以归结到这三条上——列错位、目标变量读成了普通特征、数值列被当成类别。知道根源在这里排查会快很多。2.2 relation、attribute、data 三段式怎么写一份 ARFF 从头到尾只有三段关系声明、属性声明、数据块。中间用空行隔开只是给人看的解析器不在意。以 WEKA 自带的天气样本为例% weather 数据集14 个实例、5 个属性 % 以 % 开头的行是注释解析时整体跳过 relation weather attribute outlook {sunny, overcast, rainy} attribute temperature real attribute humidity real attribute windy {TRUE, FALSE} attribute play {yes, no} data sunny,85,85,FALSE,no sunny,80,90,TRUE,no overcast,83,86,FALSE,yes rainy,70,96,FALSE,yes rainy,68,80,FALSE,yes逐段看。relation只能出现一次后面跟数据集名字如果名字里带空格必须用英文引号包起来中文引号会直接导致解析失败。attribute一行一个属性顺序决定了数据块里第几列是什么这里humidity是第三个声明的属性所以数据里第三个数就是湿度。最后一行attribute play {yes, no}同时干了两件事声明了一个两取值的分类属性并把它设成了默认目标变量。data之后每一行是一条实例字段之间用英文逗号分隔条数不设上限缺失值写一个问号。一个容易被忽略的细节属性名必须以字母开头不可以用数字打头也不可以用空格开头。见过有人把表头导出成1_age、2_income整份文件读完直接报错改起来就是批量替换一下前缀。2.3 四种数据类型怎么选numeric / nominal / string / dateWEKA 只认四种数据类型选错类型的后果比写错值更麻烦因为它不会报错只会让算法表现异常。类型写法适用范围常见误用numericreal或numeric连续数值、计数把编号当数值参与距离计算nominal{a, b, c}有限的类别取值取值大小写不统一凭空多出类别stringstring自由文本直接喂给分类器多数算法不接受datedate yyyy-MM-dd时间戳格式串和数据实际格式不一致nominal 是最容易踩的。花括号里的取值集合就是全部合法值数据里出现集合外的字符串会直接抛「nominal value not declared」。大小写、前后空格、全角逗号都算不同的值。我见过一份文件里同时出现YES、yes、yes三种写法结果目标变量被解析成三个类别训练出来的模型怎么看都不对。string 类型的定位要清楚它是给文本预处理用的原料不是给分类器用的特征。真要做文本分类得先过一遍StringToWordVector把它拆成词频向量这一步在 Filter 树里能找到。date 类型的格式串必须和数据里的实际写法严格对应默认是 ISO-8601 那个带 T 的组合格式如果原始数据是2024/03/15就得在声明里把格式改成yyyy/MM/dd否则整列都是缺失值。2.4 三条把 CSV、XLS、矩阵喂进来的路数据在别人手里格式通常不是 ARFF。三条路按成本从低到高排。第一条从 Excel 出发。打开工作簿切到需要的那张表另存为 CSV过程中会弹两次提示确认就行。注意一张工作表对应一个 CSV 文件多张表就得存多次别指望一次导出全部。存完用文本编辑器看一眼第一行是不是表头有没有多出来的空列。第二条从数值计算环境出发。矩阵落盘成 CSV 通常只有一行命令但多数工具写出来的是纯数字没有表头。WEKA 会老老实实把第一行数值当属性名读进去于是所有属性名变成85、70这种非法字符串。补救办法很简单用编辑器在最顶上手工补一行属性名个数必须和数据列数一致同样用逗号分隔。age,income,children,pep 34,52000,1,yes 28,41000,0,no第三条直接命令行转换也是最省事的一条。打开 WEKA 主界面点下方的 Simple CLI在下方的输入框里执行# 在 Simple CLI 的输入框里执行输出重定向到启动目录 # 第一个参数是源 CSV箭头右边是目标 ARFF java weka.core.converters.CSVLoader bank-data.csv bank-data.arff如果是在系统终端里跑需要显式告诉 JVM 去哪里找类库# -cp 后面是 weka.jar 的实际路径按自己的安装位置改 java -cp /opt/weka/weka.jar weka.core.converters.CSVLoader \ bank-data.csv bank-data.arff这一步之后最好立刻用文本编辑器打开生成的 ARFF 检查两件事attribute的行数是否等于数据列的个数数值列有没有被误判成 nominal。CSVLoader 靠采样推断类型样本里恰好全是整数它就可能把带小数的列也判成 nominal后面用过滤器时会报类型不匹配。提示转换后的第一版 ARFF 一定要人工过一遍别直接拿去做建模。这一步多花两分钟能省掉后面半小时的排查。3. Explorer 八个区域预处理面板的实操路线3.1 八个区域各自的职责Explorer 是整套工具里用得最多的模块界面看着密其实按功能切成八块认一遍就够。区域控件作用什么时候用1顶部选项卡切换 Preprocess / Classify / Cluster / Associate / Select attributes / Visualize换任务类型时2Open / Save / Edit / Undo打开、保存、查看原始数据、撤销上一步每次操作前后3Choose 下拉框选择 Filter右侧文本框显示当前参数所有预处理4Current relation显示实例数、属性数、关系名确认数据读全了没有5Attributes 列表列出全部属性配合下方按钮做勾选和删除删列、改类型6Selected attribute显示选中属性的类型、缺失数、唯一值数、统计量判断类型对不对7直方图选中属性的分布可按类别着色快速看类别是否均衡8Status 栏显示日志右下角的鸟在动表示正在计算出错时看这里新手最容易忽略的是区域 6。选中任意一个属性第一行就是 Type写着 Numeric 还是 Nominal。整个预处理过程其实就是反复确认这一行改完再看一眼确认改对了再往下走。区域 7 的价值在于快速判断类别分布如果直方图按目标变量着色后某一色块几乎看不见说明类别严重不平衡后面评估指标就不能只看准确率。3.2 删 id、改 children两种改法的取舍拿到一份业务数据第一件事通常是删掉主键。主键对建模没有任何信息量留着反而会让模型记住样本交叉验证的准确率能虚高到离谱。在区域 5 勾选id点下方的 Remove列就没了。这里有个细节Remove 是立即生效的Undo 只能回退一步连着做几次操作后最早那一步就救不回来了。所以我的习惯是每删一列就立刻 Save 一次文件名带上序号比如bank-v1.arff、bank-v2.arff出问题直接回到上一个版本比反复点 Undo 靠谱。删完之后属性编号会整体前移这一点在后面用过滤器时非常关键。原本age是第 2 个属性删掉id之后它就变成第 1 个了。第二件事是处理那个只取 0 到 3 四个值的children。它现在是 numeric但本质上是计数型类别。有两种改法改法一直接改文件。保存一次用文本编辑器打开把那一行换掉# 改之前 attribute children numeric # 改之后花括号里按升序列出全部合法取值 attribute children {0,1,2,3}改完存盘回到 Explorer 重新 Open 一次选中children区域 6 的 Type 应该变成 Nominal。注意必须重新打开Explorer 操作的是内存里的那份数据磁盘上改了它不会自动更新。改法二用过滤器。在区域 3 找到weka.filters.unsupervised.attribute.NumericToNominal把参数里的属性索引改成children所在的位置Apply。这条路的优点是不用离开界面缺点是连续值会被拆成一堆离散档位语义上不如手工写清楚。我一般用改法一因为它是可复现的——别人拿到这份 ARFF看到的就是明确定义。3.3 Discretize 过滤器参数串怎么读age和income是真正的连续量直接喂给只接受离散属性的算法会报类型错误需要离散化。删掉id之后它们在属性列表里是第 1 个和第 4 个。在区域 3 点 Choose展开 Filter 树找到weka.filters.unsupervised.attribute.Discretize点中它。此时文本框里会显示一串默认参数形如Discretize -B 10 -M -0.1 -R first-last。点这个文本框会弹出参数编辑窗口。选项含义调整建议-B分箱数量默认 10业务分档通常 3 到 5-R作用的属性索引1 起始改成1,4也可以写first-3-M使用 MDLP 分裂准则开关型选项不是所有版本都支持-Y等频分箱数据长尾严重时比默认的等宽更稳-D输出分箱边界信息想知道每档落在哪个区间时打开改法就是在窗口里把attributeIndices那一栏写成1,4把bins改成3其余不动点 OK再点 Choose 右边的 Apply。此时回到区域 5 上看age和income的 Type 已经变成 Nominal取值形如(-inf-34.333333]。这串标签确实难读可以保存之后用编辑器全局替换成业务语言。替换时注意标签里的括号和引号在不同版本下转义方式不一样直接按字符串精确匹配、整段替换最稳别手工敲一半留一半。注意参数串是空格分隔的改的时候建议整段重写不要在中间随便删一个数字。删掉一个数字它后面那个值就会被当成前一个选项的参数报出来的错和你的意图完全对不上。3.4 保存、再打开、再确认预处理做完点区域 2 的 Save文件名用.arff后缀。用.csv后缀骗自己是最没必要的操作后面命令行工具会按后缀猜格式猜错了又是一轮排查。我的固定动作是三遍确认保存后重新 Open 一遍看区域 4 的实例数、属性数对不对选中目标变量看区域 6 的 Type 是不是 Nominal切到 Visualize 选项卡挑两三个属性看一眼散点分布确认没有出现明显异常的空值或离群点。三遍都过了再往下走。这套动作看着慢但比在建模阶段发现数据有问题再回头划算得多。4. 避坑与排查ARFF 读不进去的五个现场4.1 读取阶段文件根本没打开排在第一位的是属性名问题。现象是点 Open 之后弹窗报attribute names are not unique文件压根没读进来。原因通常是 CSV 首行有重复列名或者某几列的名字是空的——Excel 里合并单元格导出的表头特别容易出这种事。解决方式是把 CSV 用文本编辑器打开把首行改成一列一个唯一名字空列名补上col_1这类占位符再重新转换。第二类是取值域不匹配。现象是报nominal value not declared后面还会带着具体是哪个属性的第几个值。原因就是数据里出现了{yes, no}之外的东西绝大多数情况是大小写不一致或者带了尾随空格。解决方式是在编辑器里开区分大小写搜索把YES、Yes统一成yes再用正则把行尾的空白字符清掉。数据量大的话直接在源 CSV 里处理完再转一遍比改 ARFF 快。第三类是列数对不上。现象是报number of values is not the same as the number of attributes而且通常只报在某一行。原因是某个字段的文本里混进了逗号比如地址写成某市,某区解析器把它当成了两列。解决方式是在导出 CSV 时给文本字段加引号或者干脆换一个不常见的分隔符。手工定位的办法是看报错里给的行号去那一行数一下逗号个数。4.2 预处理与建模阶段跑起来了但结果不对第四类是过滤器索引错位。现象是 Apply 之后报Filter didnt make the instances或者明明选了两个属性却只离散化了一个。原因几乎都是属性编号没跟上——删掉id之后所有属性前移一位你还按删之前的编号填参数作用对象自然就偏了。解决方式是先把属性列表从上到下数一遍确认目标属性的当前序号再填-R。另外记住编号从 1 开始写 0 会被当成非法。第五类是准确率虚高。现象是十折交叉验证出来 95% 以上换个测试集直接掉到 60%。三个常见来源主键或强相关字段没删模型等于在背答案测试选项用了Use training set在训练集上评估自己类别严重不平衡而指标只看准确率。解决方式是先删掉所有跟结果强相关的标识类字段改用十折交叉验证然后同时看混淆矩阵和 Kappa 统计量。顺手记一个语言层面的坑数据量上去以后交互界面会变得很卡甚至直接抛内存溢出异常。原因是 JVM 默认堆比较小几万行高维 nominal 数据顶不住。解决方式是在启动脚本里把最大堆调大比如加-Xmx2g具体放哪取决于你怎么启动的 WEKA。5. 从 Preprocess 到 Classify跑通一次完整基线5.1 为什么第一枪用 J48切到 Classify 选项卡点 Choose算法树的顶层就有trees分类J48排在很前面。第一枪选它有三个理由输出的是决策树规则可以直接读能反查数据本身的逻辑对不对对 numeric 和 nominal 混合的数据容忍度高不用额外编码参数少默认值就能出一个像样的结果。它的默认参数串是J48 -C 0.25 -M 2。-C是剪枝时的置信度阈值调小会让树长得更大更细调大会剪得更狠、树更小更泛化。-M是叶子节点最少要包含多少条实例默认 2调到 10 以上能明显抑制过拟合。-U是关掉剪枝只在想观察未剪枝树长什么样的时候用。我一般先用默认参数跑一遍拿到基线数字之后再动这两个值。上来就调参等于在没有参照物的情况下瞎猜。5.2 Test options 四个选项选错等于白跑算法选完旁边一排 Test options 往往被随手划过但这里选错后面所有数字都不作数。选项含义适用场景Use training set用训练集本身评估只看能不能拟合不反映泛化Supplied test set指定一份独立测试集有明确划分的数据时最严谨Cross-validation交叉验证需指定折数数据量中等时的默认选择Percentage split按比例切分数据量大、想快速看趋势我一般用 Cross-validation折数填 10随机种子保持 1。种子这个值看着不起眼但它是结果可复现的关键——种子一变切分方式就变结果跟着抖动别人拿同样的数据跑不出同样的数。种子固定成 1任何人都能在自己机器上复现你这一步。数据量很小的时候折数调到 5甚至 3因为每折里样本太少结果没意义。数据量上万之后用 Percentage split 切 66% 训练、34% 测试会更快适合调参阶段反复跑。5.3 结果面板怎么读点 Start右边的 Result list 多一条记录下面就是评估输出。第一屏的数字里先看Correctly Classified Instances后面那个百分比这是整体准确率。但只看它会被带偏得配合三个东西一起看。Kappa statistic衡量的是「比随机猜测好多少」取值通常在 0 到 1 之间0.6 以上算说得过去0.2 以下基本等于没学到东西。类别不平衡时这个数比准确率可靠得多。Confusion Matrix是矩阵行代表实际类别列代表预测类别对角线是分对的非对角线是分错的。哪一类错得最多从这个矩阵一眼就能看出来。经常出现的情况是总准确率 85%但少数类全被预测成了多数类矩阵的非对角线上一整行数字。下面的TP Rate、FP Rate、Precision、Recall、F-Measure、ROC Area是按类别分别算的。ROC Area到 0.9 以上说明排序能力不错接近 0.5 就是瞎猜。注意 ROC Area 只对有概率输出的分类器有意义J48 会给每个叶子的分布所以能算。5.4 保存模型与命令行复用确认结果可用之后在 Result list 那条记录上点右键选 Save model存成.model文件。这个文件里带着完整的树结构和属性声明可以直接拿去对新数据打分不用重新训练。# -l 载入已保存的模型-T 指定待预测的 ARFF-p 0 输出每条实例的预测明细 # 待预测文件的属性声明必须和训练时完全一致顺序、类型、取值集合都不能变 java -cp weka.jar weka.classifiers.trees.J48 \ -l bank-j48.model \ -T bank-data-new.arff \ -p 0这一步最容易翻车的地方是属性顺序。训练时的 ARFF 和预测时用的 ARFF 只要列顺序不一致模型不会报错它会照着位置把income当成age算结果全错还看不出来。所以预测前先比对两份文件的attribute声明最保险的做法是拿训练集那份 ARFF 做模板只替换数据块。6. 进阶把预处理固化成一条能复现的命令图形界面适合探索但每次点一遍不可复现也没法交给别人。真要把这套流程用起来得把关键步骤落到命令行上。# 第一步CSV 转 ARFF输出重定向到指定文件 java -cp weka.jar weka.core.converters.CSVLoader \ bank-data.csv bank-data.arff # 第二步只对第 1 和第 4 个属性做等宽离散化分 3 档 # -i 是输入文件-o 是输出文件这一步不修改原文件 java -cp weka.jar weka.filters.unsupervised.attribute.Discretize \ -B 3 -R 1,4 -i bank-data.arff -o bank-data-disc.arff # 第三步固定十折与随机种子跑 J48结果可复现 java -cp weka.jar weka.classifiers.trees.J48 \ -t bank-data-disc.arff -x 10 -s 1 -C 0.25 -M 2三条命令对应界面上的三件事含义一一对上-i/-o相当于 Open 和 SaveSave as ARFF-x是交叉验证折数-s是随机种子-t是训练文件。把它们写进一个run.sh下次换数据只改文件名其余不动。改参数看结果的关系用这几条命令对照着跑一遍就清楚了改动观察点正常表现-M从 2 调到 10树的叶子数叶子变少训练集准确率降交叉验证可能升-C从 0.25 调到 0.1树的深度树变深规则更多更碎过拟合风险上升-x从 10 调到 5结果的抖动幅度折数少方差大同一份数据跑两次差异更明显-s换一个值整体准确率在原值附近浮动浮动过大说明数据量偏小有一个验证技巧值得养成任何一次觉得「效果好得不像话」的结果都把随机种子换成 2、3、4 再跑三遍。三次都稳定在同一水平才是数据本身撑得住抖超过五个点多半是切分方式或者样本量的问题跟算法没关系。血泪经验是从一次教训里来的当时拿一份带主键的数据直接跑十折交叉验证 98%兴冲冲写进报告换成真实测试集掉到 61%。回头一看主键是自增的模型学的是「编号越大越可能是正例」。从那以后我每跑完一轮预处理都会把上面那三条命令存进一个脚本把种子、折数、属性索引全部写死再跑一次对照界面结果。数字对不上就说明中间有一步在界面上做了但没落到命令里那一处往往就是问题所在。希望帮到你。本文还有配套的精品资源点击获取