
简介面向数据挖掘与机器学习初学者的一份 WEKA 操作入门文档帮助读者认识这款开源工作平台能解决什么问题、适合哪些基础练习。正文从二维数据表切入解释实例、属性、关系及属性数据类型等核心术语并细讲 ARFF 文件的头信息、数据信息、关系声明、属性声明顺序和默认目标变量以及从 CSV、电子表格等常见来源准备数据的思路。功能层面覆盖数据预处理、分类、回归、聚类、关联规则与交互式可视化也提到开放接口、算法集成方式和平台发展背景便于把术语概念与上机操作对应起来。压缩包共 1 个 doc 文件约 172KB内容精炼适合课前预习、实验查阅或术语速查已有 794 人学习可作为数据挖掘工具入门的第一份参考资料。1. 先弄明白搜的是什么你打的「weak」其实叫 WEKA不少人是在搜索框里敲下「weak 操作入门」才发现自己要找的东西其实叫 WEKA——一个拼写像小写单词、念起来像鸟名的数据挖掘工作台。它把数据挖掘项目里几乎所有的环节都塞进了同一个窗口读数据、清洗、转换、分类、回归、聚类、找关联规则最后还能画图看结果。所以数据挖掘入门这件事在它这里变得很具体你不用先装一堆库、写几十行代码把流程串起来先学会在这个窗口里点对几个按钮就能看见一条完整链路跑通。它适合完全零基础、想先摸清「数据挖掘到底在干嘛」的人也适合手头有一份表格数据、想快速验证一个想法的人。2. 为什么零基础也值得学它把数据挖掘压成「会点鼠标就能跑」2.1 一条完整的数据挖掘流水线装在一个窗口里先把「数据挖掘」这个词拆开看。你手里有一张表比如某公司过去半年给客户发的营销记录每一行是一个客户每一列是年龄、收入、有没有房、上次活动有没有买。你想知道的是什么样的客户下次更可能买。这件事往下走会遇到一串很琐碎的步骤——数据要读进来、没用的列要删掉、类型不对的要改、有的算法还要求先把连续数字切成几段然后才轮得到「选一个算法跑一遍」最后还要看懂跑出来的结果。WEKA 的价值就在于它把这一整串步骤做成了同一个界面里的几个面板按钮。预处理在 Preprocess 面板分类和回归在 Classify 面板聚类在 Cluster 面板关联规则在 Associate 面板每个面板里再挂着一堆现成的算法。你不需要先把流程用代码串起来先在界面上点一遍就能看见每一步数据长什么样、前后发生了什么变化。对新手来说这一点比「算法多不多」重要得多。数据挖掘真正的门槛不在公式而在于你根本不知道第一步该干什么、第二步为什么必须干。WEKA 把这条链路摊开给你看你犯错的时候它也会明确告诉你错在哪一行、哪个属性类型不对。这份资源里还提到它的接口是开放的可以查看接口文档、集成自己的算法甚至借鉴它的做法自己做一套可视化工具。也就是说它不是一个学完就扔的玩具你现在用它建立直觉以后写代码时再用同一套概念不会白学。我第一次接触的时候有个很朴素的感受装了它之后自带一份示例数据双击打开就能看见一张表被拆成「属性列表 摘要 直方图」三块那种「原来数据在程序眼里长这样」的瞬间比看十页教材都管用。2.2 先记住三个词实例、属性、关系这一节是全篇最值得慢读的地方。WEKA 里所有按钮、所有报错、所有摘要用的都是同一套词你现在花十分钟把这套词吃透后面能省掉大量「这报错说的是啥」的困惑。WEKA 处理的数据集就是一张二维表格。表格里的一个横行叫一个实例Instance相当于统计学里的一个样本或者数据库里的一条记录。一个竖列叫一个属性Attribute相当于一个变量或者数据库里的一个字段。整张表格在 WEKA 看来呈现的是属性之间的一种关系Relation。拿它自带的那份天气数据举例这张表一共 14 个实例、5 个属性关系名称叫 weather。5 个属性分别是 outlook天气状况、temperature温度、humidity湿度、windy有没有风、play要不要出去玩。前四列是「已知条件」最后一列 play 是「答案」。你在界面上会看到 Instances: 14、Attributes: 5 这样的字样就是这几个数。这里有一个必须提前点破的细节最后一个被声明的属性默认被当作 class 属性也就是分类或回归任务里的目标变量。你想要预测什么那一列就必须排在最后。新手最常见的翻车方式之一就是把答案列放在中间然后困惑为什么算法跑出来的结果跟自己想的完全不是一回事。这个规则在下一章讲 ARFF 文件时会再出现一次到时候你会明白它为什么这么重要。2.3 新手第一周该干什么顺序错了会白费很多力气很多人一上手就想直接跑分类结果数据里全是 ID 列、类型识别错的列、还有一堆问号跑出来一串看不懂的数字信心当场碎掉。我给零基础的人排的顺序是这样第一步只做一件事——把一份 ARFF 文件逐行读懂知道每一段在说什么。第二步把自己手头的表格转成 ARFF能成功打开、属性类型对得上。第三步在 Preprocess 面板做最基础的两件事删掉没用的列、把类型不对的列改对。第四步才去 Classify 面板跑一个最简单的算法看报告。第五步回头理解报告里的数字是什么意思。前四步全部是「看得见摸得着」的操作不需要你懂任何公式。到了第五步才开始涉及评估指标那时候你已经有了具体的数据和具体的结果理解起来会快得多。反过来如果你第一天就去啃算法原理大概率会在第三天放弃。3. 第一步不是写代码把 ARFF 这个文件逐行看明白3.1 为什么它坚持用一种纯文本格式WEKA 存数据的格式叫 ARFF全称是 Attribute-Relation File Format直译过来就是「属性—关系文件格式」。它本质上是一个 ASCII 文本文件你用记事本就能打开、就能改。这件事对新手的意义被严重低估了。纯文本意味着数据出问题的时候你能一眼看见问题在哪一行类型标错的时候你能直接改那一个词甚至你可以不打开任何软件就靠一个文本编辑器把数据准备完。它不像某些二进制格式错了只能靠猜。我见过太多人卡在「明明导入成功了为什么跑出来不对」最后发现就是文本里某个属性的花括号写错了位置——如果格式是黑盒这个错能查一整天。这份资源里提到的示例数据 weather.arff就放在安装目录的 data 子目录下。你装好之后可以直接找到它用文本编辑器打开对照着看。这种「能看见内部」的体验是它作为教学工具最大的优势之一。3.2 拆开一份最小的 ARFF三段结构缺一不可把这份天气数据打开你会看到类似这样的内容% 以百分号开头的行是注释WEKA 会直接跳过 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 rainy,65,70,TRUE,no overcast,64,65,TRUE,yes sunny,72,95,FALSE,no sunny,69,70,FALSE,yes rainy,75,80,FALSE,yes sunny,75,70,TRUE,yes overcast,72,90,TRUE,yes overcast,81,75,FALSE,yes rainy,71,91,TRUE,no除去注释整个文件就两部分。第一部分是头信息包括对关系的声明relation和对属性的声明attribute。第二部分是数据信息从 data 这一行标记开始后面每一行就是一条记录字段之间用逗号隔开。关系声明写在第一个有效行格式是 relation 加关系名。如果名字里带空格必须用英文的单引号或双引号括起来。属性声明则是一列以 attribute 开头的语句数据集中每一个属性都要有对应的一条用来定义它的名字和数据类型。这三段不能缺也不能乱序relation 在最前attribute 在中间data 在最后。你把 data 挪到前面去文件就废了。3.3 属性声明的顺序不能乱最后一行还是「答案列」承接上一章那个「class 属性」的规则这里说清楚它为什么由顺序决定。属性声明的先后直接对应数据部分里逗号分隔的第几列。上面那份文件里humidity 是第三个被声明的属性所以数据部分每一行的第三个数85、90、86、96……就是 humidity 的值。你把两条 attribute 语句调换位置所有数据的含义就全错位了而且 WEKA 不会报错——它只会安安静静地给你一个错误的结果。第二个后果是最后一条 attribute 声明就是默认的目标变量。上面例子里 play 排在最后所以它是 class。如果你在做分类任务希望预测 play就必须让它排在最后。想预测别的列那就把那一列挪到最后去。这个设计看起来有点死板但它带来一个好处文件本身就写明了「这道题的答案在哪」。你过两个月再打开这份数据不用回忆也能知道目标是什么。3.4 四种数据类型够用就行的程度属性声明里跟在名字后面的是数据类型。WEKA 支持四种新手把这些搞清楚就够了类型写法含义典型场景注意点numeric数值型年龄、收入、温度只能写纯数字别带单位{a, b, c}分类nominal型性别、是否已婚花括号内枚举所有取值英文逗号分隔string字符串型备注、地址用得少多数算法处理不了date [格式]日期时间型下单时间数据里写的格式必须和声明里的格式串一致分类型的写法最容易写错。它不是写一个类型名而是把所有可能的取值用花括号列出来比如 attribute play {yes, no}。数据部分出现的值必须在这个集合里写成 Yes 或者 YES 都会被视为新的取值有的算法能容忍有的直接报错。这种因为大小写不一致导致的玄学问题属于典型的血泪经验。日期型则要写格式串默认是 ISO-8601 规定的 yyyy-MM-ddTHH:mm:ss 这种组合。数据部分里表达日期的字符串必须严格符合声明中规定的格式要求差一个字符都会解析失败。3.5 动手写一份自己的 ARFF并成功加载光看没用自己写一份。下面这份数据完全是虚构的用来练手最合适——假设某模拟项目X 想看看「每周自习时长」和「是否通过考试」之间有没有关系% 一份最小的 ARFF数据全为虚构只用于练习 relation study_records attribute study_hours numeric attribute attendance numeric attribute join_group {yes, no} attribute pass {yes, no} data 6,0.85,yes,yes 3,0.60,no,no 10,0.95,yes,yes 2,0.50,no,no 8,0.90,yes,yes 5,0.75,no,yes 9,0.88,yes,yes 1,0.40,no,no 7,0.80,yes,yes 4,0.65,no,no保存成 .arff 后缀的文件注意编码用 UTF-8然后用 WEKA 打开。打开之后按顺序核对四件事Instances 是不是 10Attributes 是不是 4属性列表里四个名字对不对最后一个 pass 是不是被识别成了目标列。再看区域里的摘要选中 study_hours它会显示最小值、最大值、平均值、标准差选中 pass它会显示每个取值各有多少条。如果这四件事都对上了恭喜你已经跨过了 WEKA 入门最硬的一道坎。为什么说硬因为后面所有的操作——预处理、离散化、跑算法——都建立在这份文件被正确解析的基础上。这一步错了后面全是无用功。写的时候有个小技巧先写 relation 和 attribute 那几行把 data 空着存盘打开看看属性和类型有没有被认对。确认无误再去填数据。这样出错时你能立刻定位是头部写错了还是数据行写错了不用两边同时排查。4. 把手里的表格喂进去CSV 转 ARFF 的三步4.1 导出 CSV 之前先确认这三件事现实情况是你的数据大概率不在 ARFF 里而是在一张 Excel 表、一个数据库、或者某个分析软件导出的文件里。好消息是 WEKA 支持 CSV也就是最常见的逗号分隔文本很多软件都能导出这个格式。第一件事一个工作表只能存一个文件。Excel 的 xls 文件允许把多张二维表格放在不同的 Sheet 里但 CSV 没有「多表」这个概念。打开文件、切到需要转换的那张工作表、另存为 CSV 类型弹窗提示点确定就好。有几张表就存几次别指望一次搞定。第二件事第一行必须是属性名。CSV 本身没有「表头」这个概念WEKA 的做法是默认把第一行读成属性名。所以如果你的文件第一行直接是数据它会把这行数据当成列名你的数据就凭空少了一条而且列名会变成一堆数字非常难排查。从某些分析软件导出的 CSV 往往没有属性名比如用矩阵导出命令生成的 CSV 就常常是纯数据需要你手工补一行属性名的个数要跟数据列数严格一致仍旧用逗号隔开。第三件事分隔符和空行。逗号必须是英文半角逗号全角逗号会让整行数据黏成一列。文件末尾的空行、中间的空行也最好清掉它们会被解析成一条空记录轻则报错重则让你对着 Instances 的数字怀疑人生。4.2 一行命令完成转换比手改文件快得多数据准备好之后转换有两种办法。图形化的路径是在 Explorer 里把文件类型切到 CSV 打开浏览一下没问题再另存为 ARFF。这条路直观适合第一次试。更快的办法是它自带的命令行工具。运行 WEKA 主程序界面上会有一排按钮点进 Simple CLI 模块在新窗口最下方的输入框里敲# 把 bank-data.csv 转成 bank-data.arff # CSVLoader 是 WEKA 自带的转换器类不用额外装东西 java weka.core.converters.CSVLoader bank-data.csv bank-data.arff这条命令拆开看就三段。前面 java weka.core.converters.CSVLoader 是在调用 WEKA 内置的 CSV 读取器中间是你自己的 CSV 文件名它和你在命令行里的位置有关最稳妥的做法是把文件放在当前工作目录下或者写完整路径最后那个大于号是重定向意思是「把程序输出的内容写进后面这个文件」所以原始 CSV 不会被改动转换结果会生成一个新文件。要注意两点。一是文件名里如果有空格得用引号包起来否则会被当成两个参数。二是这条命令在上方那个不能写字的区域里是敲不进去的输入框在最下面第一次用容易对着上半部分点半天没反应。这属于纯粹的界面习惯问题但这方面的经验往往要试一遍才记住。4.3 转完必须回读一遍三个检查点转换完成不等于转换正确。新手最容易犯的错是转完直接点算法跑出奇怪结果才发现是数据的问题。回头看一眼成本很低。检查一看 relation 那一行。它一般会取你的文件名如果出现奇怪的字符说明文件路径或文件名里有 WEKA 不认识的东西顺手改掉。检查二看属性数量和类型。转换器会自动判断类型全是数字的列识别成 numeric取值有限的文本列识别成 nominal判断不准的时候需要你手工改 attribute 那一行。特别留意本该是数字的列被识别成了 nominal——比如收入列里混进了一个「暂无」或者空单元格整列就会退化成分类类型后面跑算法时直接报错。检查三看 data 下面的行数。它应该和源文件的数据行数完全一致。少了多半是第一行被当成表头吃掉了或者中间有空行多了多半是末尾多了空行。缺失的数据在 ARFF 里用问号表示看到问号别慌那是正常写法但数量太多的话要考虑这份数据还能不能用。5. 避坑清单新手在 WEKA 里最常翻的五个车5.1 坑一表头没对上第一行数据凭空消失现象打开文件之后Instances 的数字比你在 Excel 里数的少一行属性名显示成一串数字或者干脆是乱码。原因CSV 的第一行被当成了属性名。如果你的文件是从某些分析工具导出的、本来就只有数据没有表头那第一行真实数据就变成了列名自然少一条。另一种情况是表头里某一列的名字缺失属性个数和数据列数对不上解析就乱套了。解决用文本编辑器打开 CSV确认第一行确实是完整的属性名个数与下面每一行的字段数完全一致。缺就补上多余的空列就删掉。补完之后重新转换一次别在已经错了的 ARFF 上继续改那样只会越改越乱。5.2 坑二改了文件界面还是老样子现象你用文本编辑器把 ARFF 里的某个属性类型改好了保存切回 WEKA 界面属性列表纹丝不动摘要还是旧的。原因Explorer 打开文件的那一刻就把数据读进内存了。你在磁盘上改了文件内存里的副本不会自动刷新界面上看到的始终是打开时的那一份。解决改完文件保存在 Explorer 里重新打开一次这个文件或者干脆把面板上的数据清掉再加载。养成一个习惯只要动了磁盘上的文件就重新加载一遍再判断效果。另外界面上的 Undo 按钮只对界面内的操作有效管不了你在外部编辑器里做的修改别指望它。5.3 坑三离散化后的标签看不懂以为出错了现象用完离散化过滤器之后原本是数字的列变成了一堆 (-inf-34.333333] 这样的东西看着像报错信息。原因这不是错误。离散化就是把连续的数值切成若干区间区间用数学上的开闭区间表示-inf 是负无穷左边的小括号表示不包含端点右边的方括号表示包含端点。它只是在告诉你「这个值落在负无穷到 34.33 这一段里」。解决功能上不用管它算法认得。但如果要给人看可以在保存后的 ARFF 文件里用文本编辑器的批量替换把这些区间标识换成 0_34 这类可读的标签。替换时注意只动数据部分和属性声明的花括号内部别把 attribute 的语法结构弄坏了替换完再打开核对一次类型是不是还是 nominal。5.4 坑四算法一跑就报错说属性类型不对现象选好算法点 Start状态栏弹出一句报错大意是这个算法处理不了数值型的属性或者数值型的目标变量。原因不同的算法对数据有不同要求。有些算法只接受全部是分类属性的输入有些不能直接拿数值当目标变量。这不是软件坏了是这类算法的数学前提就摆在那。解决两条路。一条是回去做预处理用 Discretize 过滤器把数值属性离散化成区间另一条是换一个对数值友好的算法决策树类的算法通常对混合类型更宽容。判断依据是状态栏里那段报错原文它会明确指出是哪个属性出的问题照着改就行别盲猜。5.5 坑五ID 没删结果好得不像真的现象模型准确率接近百分之百看着特别爽但换一批数据立刻崩掉。原因数据集里往往有一列是 ID 或者编号每条记录都不一样。这种列对预测毫无意义但某些算法会把它当成一个强特征等于给每条记录发了一张身份证模型「记住」了样本却没学到规律。这在数据挖掘里是典型的泄漏属于看着漂亮实则毫无用处的陷阱。解决预处理的第一步就是删掉 ID 这类唯一标识列。在属性列表里勾选它点 Remove。删错了不要紧Undo 能找回来。判断标准很简单这一列的取值是不是几乎每条都不同如果是它对预测就没有价值删掉。这个动作我建议做成肌肉记忆拿到任何新数据先扫一眼有没有这种列。6. 下一步学什么从「跑通一次」到「看得懂结果靠不靠谱」跑通一次之后很多人会陷入一种「然后呢」的状态。我给一条我自己走过、也觉得最省力的路线。第一阶段补预处理。你已经在 Preprocess 面板点过 Remove 和 Discretize 了接下来把缺失值处理、属性归一化、属性选择这几个过滤器各试一遍重点不是记住名字而是每次操作后看数据摘要变了什么。第二阶段学评估。这一步最容易被跳过但它决定了你能不能信任结果。第一次跑分类时Test options 里默认那一项往往是拿训练数据自己考自己报告里的准确率会虚高。把它改成交叉验证折数填 10再跑一次你会看到一个更诚实的数字。同时学会看混淆矩阵哪一类被误判成了哪一类比一个总数有用得多。阶段要弄懂的东西在界面上点哪里一缺失值、离散化、归一化、属性选择Preprocess 面板里的 Choose 过滤器二交叉验证、混淆矩阵、准确率与召回Classify 面板的 Test options三无监督聚类、关联规则Cluster 与 Associate 面板四回到原理算法为什么这样切分数据查接口文档试着自己写一个第三阶段再去碰聚类和关联规则。这两类和分类的思路不一样分类是「有答案照着学」聚类是「没答案自己分组」关联规则是「找同时出现的东西」。有了前面的基础你会发现它们其实共用同一套数据格式和同一套预处理流程切换成本很低。第四阶段才回头补原理。这时候你已经知道离散化是干什么的了再去读算法为什么要做分箱理解会顺很多。这份资源提到它的接口是开放的可以查看接口文档、把自研算法集成进去那才是这条路的终点——但别急先把前三个阶段走完。最后说一个具体技巧每次拿到一份新数据先不要碰算法把属性列表从头到尾扫一遍看类型、看取值分布、看有没有唯一标识列。这个动作花不了两分钟但能省掉后面无数次「明明跑通了结果却不对劲」。从那以后我每次拿到新数据都强制先走一遍「删 ID、看类型、查缺失」这三步再点算法。希望帮到你。本文还有配套的精品资源点击获取