
简介这份文档面向数据挖掘与机器学习初学者系统讲解WEKA这一公开数据挖掘工作平台的操作入门知识帮助读者快速理解平台的数据组织方式与核心功能。内容围绕WEKA的数据格式与术语展开涵盖实例、属性、关系等基本概念并详细说明ARFF文件的头信息与数据信息结构包括关系声明、属性声明及numeric、nominal、string、date四种数据类型同时介绍从CSV、Excel、Matlab等格式准备数据的思路。资源包为1个doc文档大小约172KB便于下载后离线阅读与查阅。WEKA集合了数据预处理、分类、回归、聚类、关联规则与可视化等算法接口开放可集成自定义算法或借鉴其方法实现可视化工具曾获ACM SIGKDD数据挖掘与知识探索最高服务奖。目前已有791人学习适合希望以WEKA为工具入门数据挖掘实践、需要一份简明操作指引的读者参考。1. 从一份 weather.arff 说起WEKA 到底能帮你把数据挖到什么程度很多人第一次打开 WEKA看到那个鸟标和一堆按钮心里是发懵的。我当年也是手里攥着一份 CSV想跑个分类看看效果结果卡在“数据怎么进去”这一步整整一个下午。WEKA 的全称是怀卡托智能分析环境Waikato Environment for Knowledge Analysis由新西兰怀卡托大学开发2005 年在第 11 届 ACM SIGKDD 国际会议上拿了数据挖掘和知识探索领域的最高服务奖算下来发展历史已经超过二十年。它把分类、回归、聚类、关联规则、数据预处理和可视化全部塞进一个图形界面里而且接口开放你能看它的接口文档也能把自己的算法集成进去。这篇文章不讲空泛的“数据挖掘概论”只讲一件事拿到一份 CSV 或 Excel怎么一步步变成 WEKA 能吃的 ARFF怎么在 Explorer 里做预处理怎么避开那些让人想砸键盘的坑。适合手里有数据、想快速验证想法、又不想一上来就写几百行 Python 的从业者。2. ARFF 文件结构拆解从 relation 到 data 的每一行2.1 头信息与数据信息的分界线WEKA 处理的数据集在逻辑上就是一张二维表格一行叫一个实例Instance一列叫一个属性Attribute整张表呈现的关系叫 Relation。它存储数据的格式是 ARFFAttribute-Relation File Format本质是一个 ASCII 文本文件。以 WEKA 安装目录data子目录下的weather.arff为例去掉以%开头的注释行之后整个文件被data标记切成两半上半部分是头信息Head information负责声明关系名称和属性定义下半部分是数据信息Data information就是逗号分隔的实际数值。关系声明必须是第一个有效行格式是relation relation-name。如果名称里带空格必须用英文单引号或双引号包起来否则 WEKA 解析直接报错。属性声明用attribute开头每个属性一行顺序极其重要——它决定了数据部分每一列对应哪个属性。比如humidity是第三个被声明的属性那数据部分每行用逗号切开后的第三个数就是 humidity 的值。最后一个声明的属性默认被当作 class 属性在分类或回归任务里就是目标变量。2.2 四种数据类型与日期格式的写法WEKA 支持的属性类型有四种numeric数值型、nominal-specification分类型用花括号列出所有可能取值、string字符串型、date [date-format]日期时间型。分类型的写法是attribute outlook {sunny, overcast, rainy}花括号里的值区分大小写。日期型稍微特殊格式是attribute name date [date-format]默认格式是 ISO-8601 的yyyy-MM-ddTHH:mm:ss。如果你数据里的日期是2024/01/15这种斜杠分隔的写法就必须在声明里显式指定date yyyy/MM/dd否则 WEKA 会把它当成字符串或者直接解析失败。下面是一个最小可用的 ARFF 模板你可以直接抄去改relation my_dataset attribute age numeric attribute income numeric attribute student {yes, no} attribute credit_rating {fair, excellent} attribute buys_computer {yes, no} data 25,50000,yes,fair,no 30,80000,no,excellent,yes 35,60000,yes,fair,yes这段声明里age和income是数值型student、credit_rating、buys_computer是分类型。buys_computer放在最后自动成为目标变量。数据部分每行五个值顺序必须和属性声明完全一致少一个逗号或者多一个空格都可能让 WEKA 读出一堆问号。注意ARFF 文件里不要用中文标点逗号必须是英文逗号花括号和引号也必须是英文半角。我见过有人从 Word 里复制属性名结果引号是弯的WEKA 直接报Unable to determine structure as arff。3. 把 CSV 和 Excel 喂给 WEKA转换命令与 Explorer 预处理实操3.1 CSV 转 ARFF 的两条路WEKA 原生支持 CSV但有个硬性要求CSV 第一行必须是属性名。很多从 Matlab 导出的 CSV 没有表头Excel 另存为 CSV 时也可能丢掉表头这时候直接丢给 WEKA它会把第一行数据当成变量名后面全乱套。常见做法是先用 UltraEdit 或 VS Code 打开 CSV手工补一行属性名属性个数必须和数据列数一致用英文逗号隔开。补好表头之后转换最快的方式是走 WEKA 的 Simple CLI。启动 WEKA 主程序点下方Simple CLI按钮在窗口最下方的输入框里敲java weka.core.converters.CSVLoader bank-data.csv bank-data.arff这条命令调用CSVLoader类读取bank-data.csv把标准输出重定向到bank-data.arff。注意路径问题如果 CSV 不在 WEKA 当前工作目录下要么写绝对路径要么先cd过去。转换完成后用文本编辑器打开 ARFF 检查一下重点看attribute的类型是不是合理——WEKA 会自动推断数值列给numeric文本列给nominal但有时候会把本该是分类的列推断成string那就需要手动改。另一条路是在 Explorer 里操作打开 WEKA进Explorer点Open file选 CSVWEKA 会弹窗问你是否转换确认后直接加载。然后点Save按钮在保存类型里选.arff就能存成 ARFF。这条路适合不习惯命令行的新手但批量转换时还是 CLI 更省事。3.2 Explorer 界面八个区域的分工Explorer 是 WEKA 用得最多的模块界面可以分成八个区域来理解。区域 1 是顶部选项卡切换 Preprocess、Classify、Cluster、Associate、Select attributes、Visualize 等不同任务面板。区域 2 是常用按钮包括打开数据、保存、编辑、Undo。区域 3 是 Filter 选择区点Choose会弹出一棵 Filter 树数据预处理主要靠它。区域 4 显示数据集的基本情况比如实例数、属性数。区域 5 列出所有属性勾选后点Remove可以删列删错了用区域 2 的Undo找回。区域 6 显示选中属性的摘要数值属性和分类属性的摘要形式不一样。区域 7 是直方图如果最后一个属性是分类变量直方图会按类别比例分色。区域 8 是状态栏右边的 WEKA 鸟在动说明正在执行任务右键状态栏可以触发 Java 内存垃圾回收。以bank-data.csv为例这个数据集有 id、age、sex、region、income、married、children、car、save_acct、current_acct、mortgage、pep 这些列。id 是唯一标识对挖掘任务没用在区域 5 勾选id然后点Remove删掉。删完后保存一次用文本编辑器打开 ARFF你会看到 WEKA 已经为每个属性自动选好了类型。3.3 数值属性离散化Discretize Filter 的参数怎么设有些算法只能处理分类型属性比如 Apriori 关联规则。bank-data里有三个数值型变量age、income、children。其中children只有 0、1、2、3 四个取值直接在 ARFF 文件里把attribute children numeric改成attribute children {0,1,2,3}就行改完在 Explorer 里重新打开选中children看区域 6 的 Type 是不是变成了Nominal。age和income的离散化用DiscretizeFilter。在区域 3 点Choose逐级找到weka.filters.unsupervised.attribute.Discretize点击后 Choose 旁边的文本框会显示Discretize -B 10 -M -0.1 -R first-last。点这个文本框弹出参数窗口把attributeIndices改成1,4对应 age 和 income 在属性列表里的位置把bins改成3其他不动点 OK 回到 Explorer再点Apply。区域 5 里 age 和 income 就变成分类属性了取值形如(-inf-34.333333]。如果嫌这种区间标识太晦涩保存 ARFF 后用文本编辑器把所有(-inf-34.333333]替换成0_34其他区间类似处理。替换时注意引号ARFF 里带特殊字符的 nominal 值需要用单引号包起来。attribute age {0_34,34_50,50_inf} attribute income {0_30k,30k_60k,60k_inf}这样改完可读性提升一大截后续看规则输出也舒服得多。提示Discretize 的-M参数是useEqualFrequency默认-M -0.1表示不启用等频分箱。如果你希望每个区间样本数尽量均匀把-M勾上-0.1改成-1。4. 避坑与排查ARFF 读取失败、类型推断错误和内存溢出4.1 现象打开 ARFF 报 “Unable to determine structure as arff”原因通常有三个文件里有中文标点或不可见字符属性声明顺序和数据列数对不上data后面有空行或者行尾有多余逗号。解决方法是先用文本编辑器的“显示不可见字符”功能检查一遍确保所有分隔符都是英文半角。然后数一下attribute的行数和数据部分每行的逗号数属性数应该等于逗号数加一。如果数据行末尾多了一个逗号WEKA 会认为多了一列直接报错。4.2 现象CSV 转换后第一行变成了属性名数据少了一行原因就是 CSV 没有表头WEKA 把第一行数据当成了属性名。解决方法是手工补一行属性名或者在转换时用-H参数指定不把第一行当表头但这样属性名会变成att1、att2这种默认名后续还得改。我一般直接补表头虽然多一步但属性名可控。4.3 现象数值列被推断成 nominal或者 nominal 列被推断成 stringWEKA 的自动推断基于采样数据量小或者取值特殊时容易翻车。比如income列如果前几行都是整数WEKA 给numeric但如果中间混了一个N/A就可能变成string。解决方法是转换后打开 ARFF 手动改attribute的类型声明。改完保存在 Explorer 里重新加载验证。4.4 现象Explorer 跑算法时卡死状态栏的鸟一直动但不出结果大概率是 Java 堆内存不够。WEKA 默认堆内存可能只有 512MB数据量稍大就撑不住。解决办法是启动 WEKA 时加-Xmx参数比如java -Xmx4g -jar weka.jar把最大堆内存调到 4GB。Windows 下可以改RunWeka.ini里的maxheap值。另外右键状态栏触发垃圾回收只能临时缓解根治还是得加内存。4.5 现象Discretize 之后属性值变成All或者只有一个区间原因通常是attributeIndices设错了或者选中的属性本身就是 nominal 类型。Discretize 只对 numeric 属性生效如果属性已经是 nominalFilter 会把它所有值归到一个区间。解决方法是先确认属性类型只对 numeric 列做离散化并且attributeIndices用属性在列表里的序号不是属性名。5. 进阶技巧用 UltraEdit 批量改 ARFF 与交叉验证的实操细节5.1 批量替换 nominal 区间标识的脚本化思路手工替换几十个区间标识很痛苦我一般用 UltraEdit 的“在文件中替换”功能或者写个简单的 Python 脚本处理。思路是读入 ARFF 文件用正则匹配\(-inf-([\d.])\]这种模式替换成可读的区间名。下面是一个示例脚本import re def simplify_arff_intervals(filepath): with open(filepath, r, encodingutf-8) as f: content f.read() # 匹配形如 (-inf-34.333333] 的区间标识 pattern r\(-inf-([\d.])\] def repl(match): upper float(match.group(1)) return f0_{int(upper)} content re.sub(pattern, repl, content) # 匹配形如 (34.333333-50] 的中间区间 pattern2 r\(([\d.])-([\d.])\] def repl2(match): lower int(float(match.group(1))) upper int(float(match.group(2))) return f{lower}_{upper} content re.sub(pattern2, repl2, content) with open(filepath, w, encodingutf-8) as f: f.write(content) simplify_arff_intervals(bank-data.arff)这段代码先处理(-inf-上限]形式的下界无穷区间再处理(下限-上限]形式的中间区间。替换后的值不带引号因为0_34这种字符串不包含特殊字符ARFF 解析器能直接识别。注意替换前备份原文件正则匹配不到的情况要人工检查。5.2 在 Explorer 里跑交叉验证与查看规则输出预处理完的数据可以直接在 Explorer 的 Classify 面板跑分类。选一个算法比如trees.J48Test options 里选Cross-validationFolds 设 10点Start。右侧 Classifier output 会显示准确率、混淆矩阵和决策树。如果跑的是 Associate 面板的 Apriori输出的是关联规则这时候之前离散化并简化过的区间名就派上用场了规则像age0_34 income0_30k buys_computerno这样读起来一目了然。我自己的习惯是每次拿到新数据先补表头转 ARFF再删 ID 列然后对数值列做 Discretize最后用脚本简化区间名。这套流程走完再跑算法基本不会在数据格式上翻车。从那以后我每次处理新数据集都强制走一遍这个检查清单省下来的调试时间够跑好几轮实验了。希望帮到你。本文还有配套的精品资源点击获取