资讯详情

资讯详情

WEKA入门从CSV到ARFF:格式转换、离散化与避坑指南

简介一份聚焦数据挖掘入门操作的WEKA平台讲解文档面向刚接触机器学习与数据挖掘的学生、开发者及科研人员帮助读者快速掌握这一工具的基本使用流程。文档从数据格式入手详细讲解ARFF文件的头信息与数据信息结构说明实例、属性、关系等核心术语以及数值型、分类型、字符串型、日期时间型四种数据类型同时介绍了如何通过CSV、Excel和数据库连接准备数据为后续分类、回归、聚类、关联规则和可视化任务奠定基础。资源为单个doc文档压缩包约172KB以文字说明和示例片段为主适合自学或课程实验对照练习。目前已有791人学习下载。文档进一步使用天气数据集逐步解析关系声明、属性声明和数据部分的组织方式帮助理解属性顺序与目标变量的关系还介绍了平台的开放接口与扩展思路读者完成学习后可独立完成从数据准备到模型应用的入门实验。1. WEKA 数据挖掘工具操作入门先搞定 ARFF 格式再谈算法数据挖掘课最劝退的操作往往不是写算法而是把手里的 Excel 表格喂给工具这一步。WEKA 是一套开源数据挖掘工作平台集成了预处理、分类、回归、聚类、关联规则和可视化算法它名字取自一种不会飞的鸟开发团队就在南半球某高校。装好 WEKA 之后新手最容易卡在数据格式上——工具默认不认识 xlsx只认 ARFF 或 CSV。这篇笔记按“格式 → 转换 → 预处理 → 避坑 → 批量操作”的顺序把一条完整链路拆开讲适合刚开数据挖掘课、准备用 WEKA 做实验或复现论文的入门者也适合想把离散化、属性筛选这些基础操作一次做对的从业者。2. ARFF 文件格式拆解relation、attribute 声明顺序与四种数据类型的边界2.1 从 weather.arff 看懂头信息结构WEKA 里一个数据集就是一张二维表横排放一个实例Instance相当于统计学里的一个样本竖排读作属性Attribute相当于一个变量或字段。整张表有一个关系名Relation比如自带的 weather.arff 里关系名就叫 weather。ARFF 是 Attribute-Relation File Format 的缩写本质是一个 ASCII 文本文件用记事本或 UltraEdit 打开就能直接改。以 % 开头的行是注释WEKA 读取时会忽略。除去注释后文件分两部分头信息Head Information和数据信息Data Information从 data 标记开始进入数据区。下面截取一段最典型的 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头信息里两个关键点。第一attribute 的声明顺序就是数据列的顺序outlook 是属性声明里的第一个那么 data 之后每行第一个逗号前的值就对应 outlookhumidity 排在第三位说明每行第三列是 humidity 的取值。第二最后一个声明的属性叫 class 属性在分类或回归任务里它默认是目标变量weather 里的 play 就是典型的目标列。数据信息部分的每一行必须与属性声明一一对应逗号分隔列数不能多也不能少。如果你手工编辑 ARFF最容易犯的错就是少加一个逗号导致整行列错位。我一般写完文件后会先数一遍逗号N 个属性每行应该有 N-1 个逗号这是最笨也最靠谱的校验方法。2.2 四种数据类型与声明格式对比ARFF 支持的数据类型共四种写声明语句时必须明确给出类型声明写法示例适用场景注意事项numericattribute temperature real连续数值如温度、收入也可以写 integer 或 realWEKA 都收nominal-specificationattribute outlook {sunny, overcast, rainy}离散类别取值固定花括号内枚举全部可能值多个值用逗号分隔stringattribute name string文本内容如评论、备注字符串含空格时需要加引号包裹dateattribute birthdate date yyyy-MM-dd日期时间格式字符串可省略缺省用 ISO-8601 的 yyyy-MM-ddTHH:mm:ssnumeric 是最宽松的类型整数小数都能放进去nominal 是分类算法的口粮像 J48、NaiveBayes 这类算法往往要求所有属性都是 nominal这就是后续做离散化的动机。string 类型在数据挖掘里一般不当特征直接用更多是留作记录有些 Filter 会直接忽略它。date 类型需要注意解析格式默认格式是 “yyyy-MM-ddTHH:mm:ss”中间那个 T 是 ISO-8601 规定的日期时间分隔符如果用习惯了“yyyy-MM-dd HH:mm:ss”的写法在 ARFF 里会直接报错。属性名必须以字母开头如果名字里带空格也要用引号包起来。关系名同样如此。实际操作里我建议属性名统一用下划线连接比如 customer_age杜绝空格带来的引号麻烦。2.3 date 类型怎么声明以及 class 属性的隐藏影响date 类型的完整声明格式是attribute birthday date yyyy-MM-dd data 1990-01-02,...注意加引号的只是日期格式串不是日期值本身。数据区的日期字符串必须严格匹配声明里给出的格式月份写两位数年份写四位数否则进入 Explorer 后会全部变成 missing 值。如果你手头数据只有年月声明成 “yyyy-MM” 就可以但数据区里同样只写年月多写一个日期分隔符都会判错。class 属性的坑比较隐性。分类任务里最后一个声明属性会被 WEKA 默认当成目标变量比如 bank-data 数据集里的 pep 列代表客户是否购买了某款理财产品PEP。如果你的数据集原本的最后一列是 ID 或者备注文本跑监督算法时结果会很莫名其妙因为模型拿文字当类别来学习了。常见做法是在预处理阶段把这种无意义列删掉或者把目标列调整到最后再声明一次。调列顺序不需要重写整个文件用 CSV 导出后调整列序再转 ARFF 是最省事的路径。提示用记事本另存 ARFF 时编码尽量保持 UTF-8尤其是数据里带中文、日文或特殊符号时。乱码的 ARFF 在 Explorer 里会显示成问号排查起来很费时间。3. 从 CSV 到 ARFF 的转换实战两条路径、一条命令、三个坑3.1 Excel 和 Matlab 导出 CSV 的差异先解决表头问题实际工作中极少有人的数据一开始就是 ARFF绝大多数情况是从 Excel、Matlab 或数据库导出 CSV。WEKA 原生支持 CSV 读取但 CSV 只是逗号分隔的文本本身不包含任何属性类型声明WEKA 是靠“第一行是属性名”这个约定来推断的。Excel 的 XLS 文件一个工作表对应一张二维表另存为 CSV 时只能存当前激活的工作表。如果你的 XLS 里有多个 Sheet就必须逐个切换、逐个另存。Matlab 的场景更直接一个矩阵用一条命令就能导出% 生成 100 行 4 列的示例数据 data rand(100, 4); % 第一行是纯数字Writer 不会自动补表头 csvwrite(demo.csv, data);这条命令生成的 CSV 第一行就是数据WEKA 打开它时会把第一个值当成属性名于是属性列表里会出现 0.8147 这种奇怪的“属性名”。解决方法是手工用 UltraEdit 打开加一行属性名并用逗号隔开属性名数量必须和列数一致。如果你在用 Excel 导出的 CSV 时留意查看会发现 Excel 偶尔也不写表头或者导出时把公式计算值写进去而不再保留公式。无论来源是哪个软件进入 WEKA 前的最后一道检查一定是用文本编辑器打开 CSV确认第一行是表头并数一遍逗号数量。这一步做扎实后面能少踩很多坑。3.2 用 Simple CLI 一条命令完成转换WEKA 提供了命令行转换器Common 里的 Simple CLI 模块是专门给这类操作准备的。启动 WEKA 主程序后底部一系列按钮里有一个“Simple CLI”点击进入。注意窗口底部才是输入行上方是只读输出区域。转换命令如下java weka.core.converters.CSVLoader demo.csv demo.arff这条命令的执行逻辑调用 weka.core.converters 包下的 CSVLoader 类把 demo.csv 解析成数据集对象然后用重定向符号 把输出写进 demo.arff。前提是当前工作目录下有 demo.csv 这个文件Simple CLI 默认的工作目录通常是你启动 WEKA 时的目录。如果提示找不到文件建议把 CSV 放到一个没有空格的路径下再完整输入cd D:\data java weka.core.converters.CSVLoader bank-data.csv bank-data.arff在 Windows 的 Simple CLI 里cd 命令同样有效。转换成功后没有任何提示是正常的回到资源管理器看到 arff 文件生成就说明成功了。如果文件是空的多半是 CSV 路径写错或者 CSV 本身是空的如果报 “wrong number of values”说明数据某行列数与表头数量不一致需要回 CSV 修数据。3.3 在 Explorer 里另存为 ARFF 的备用路径不想敲命令的人可以用图形界面完成同样的事。进入 Explorer 模块点 Open file 选择 CSVWEKA 会自动加载并显示属性和数据概况再点 Save 按钮选择 ARFF 格式即可。WEKA 3.5 之后的版本还提供过一个 Arff Viewer 组件也能直接打开 CSV 另存为 ARFF。这条路径好用但也有局限如果 CSV 第一行是脏数据而不是表头Explorer 照样会把第一行当成属性名而且界面里看不到报错。图形界面适合快速预览命令行适合批量处理两条路径各有适用场景。通常我的习惯是先用 Explorer 打开 CSV 预览一遍列数、类型分布确认没问题后再用命令行批量转。注意CSV 转换时 WEKA 会把所有字段都推断成 numeric 或 nominal如果某列本该是日期类型转出来的 ARFF 里会变成数字串。这种情况需要在转完之后手工把 attribute 声明改成 date 类型或者用后面要讲的 Discretize 之外的专门 Filter 处理。4. Explorer 预处理删属性、离散化 age 和 income把 numeric 改成 nominal4.1 Explorer 界面 8 个区域的功能地图Explorer 是 WEKA 最常用的工作台它的界面分成 8 个区域搞清楚每个区域的作用预处理就不会迷路区域功能常用操作区域1顶部选项卡切换挖掘任务面板Preprocess、Classify、Cluster、Associate区域2文件操作按钮Open、Save、Edit以及 Undo 撤销区域3Choose 按钮选择 Filter筛选数据或变换数据都从这里进区域4数据集概况显示实例数、属性数、关系名、缺失值区域5属性列表勾选后点 Remove 删除属性上方一排按钮可快速全选区域6选中属性的摘要信息数值属性和分类属性的摘要展示方式不同区域7选中属性的直方图可按下拉框换分类依据选 No Class 变黑白图区域8状态栏查看 Log右键可触发 Java 垃圾回收区域 3 是预处理的入口点 Choose 会展开一棵 Filter 树按包路径逐级找 weka.filters.unsupervised.attribute.Discretize。选完点 Apply操作立刻生效如果效果不理想点区域 2 的 Undo 按钮就能撤销相当于吃后悔药。注意 Filter 树有时不自动关闭在 Explorer 面板空白处点一下就能收起。区域 5 删除属性的操作很直观勾选属性行的复选框点 Remove。区域 6 会在选中数值属性时显示均值、标准差、缺失值个数选中分类属性时显示每个取值的计数。区域 7 的直方图会按最后一个分类属性的取值分段着色如果想按别的属性着色在下拉框里换一个就行。4.2 删除无用属性手工修改 children 为 nominal 类型以 bank-data 数据集为例属性包括 id、age、sex、region、income、married、children、car、save_acct、current_acct、mortgage、pep 共 12 个字段。id 是记录流水号对挖掘任务没有信息量直接删。在区域 5 里勾选 id点 Remove数据集就变成 11 个属性。删除后顺手在区域 2 点 Save把当前状态保存为新 ARFF。删除属性后最好再打开 ARFF 文件看一眼属性声明确认 WEKA 自动选择的类型是否合理。children 这个字段表示孩子数量取值只有 0、1、2、3WEKA 默认把它识别成 numeric但它的真实语义是有限离散值不是连续量。这时可以直接编辑 ARFF 文件把声明行从attribute children numeric改成attribute children {0,1,2,3}重新在 Explorer 里打开 bank-data.arff选中 children 属性区域 6 里的 Type 会显示为 Nominal。这种手工改声明的方式最适合取值少、边界清晰的整型列比用 Filter 跑一遍离散化快得多而且标签更可读。4.3 Discretize 离散化默认参数串的拆解与实操age 和 income 是连续属性很多分类算法不能直接处理需要离散化。点区域 3 的 Choose在 Filter 树里找到 weka.filters.unsupervised.attribute.Discretize点击后 Choose 旁边的文本框会显示默认参数串Discretize -B 10 -M -0.1 -R first-last这个串拆开看-B 10 表示分成 10 个箱bins-M -0.1 是 findNumBins 选项用的优化参数表示在指定箱数的基础上允许算法调整边界属于自动找最佳分界的意思-R first-last 表示作用范围覆盖从第一个属性到最后一个属性。新手不需要改 -M保持默认 -0.1 即可。点击文本框弹出参数设置窗口把 attributeIndices 改成 1,4因为 age 是第 1 个属性income 是第 4 个属性把 bins 改成 3让这两个变量各分成 3 段。其它参数保持默认点 OK 回到 Explorer再点 Apply。观察区域 5age 和 income 的类型会从 Numeric 变成 Nominal取值变成类似 “(-inf-34.333333]” 这样的区间标签。如果你对这类标签看不顺眼可以保存 ARFF 后用 UltraEdit 手工替换区间名。比如把所有 “(-inf-34.333333]” 替换成 “0_34”把 “(34.333333-43.666667]” 替换成 “34_43”。替换时注意区间标签两边的单引号必须保留否则 WEKA 会把整个串当成两个值处理。替换完成后重新打开数据集属性值就变成可读的分段标签后续画图、写论文都友好得多。5. WEKA 使用避坑手册五条常见的翻车现象与对应解法5.1 现象CSV 打开后第一行数据变成了属性名把 CSV 拖进 Explorer属性列表里的属性名全是 0.8147、85、yes 这种数字串或拼音属性数量比真实列数多出一个。原因CSV 第一行没有表头WEKA 的 CSVLoader 强制把第一行记录当作属性名解析。这在 Matlab 导出的 CSV 里最常见Excel 手工导出的表格也偶尔会出现。解决先用文本编辑器打开 CSV确认第一行是否表头没有就手工补一行属性名数量必须和数据列数一致。补完再进 WEKA 加载属性名就正常了。从那以后我每次拿到 CSV 都先执行这一步再往后就不敢跳过这个检查了。5.2 现象Simple CLI 转换命令执行后没有任何反应生成的 ARFF 是空文件在 Simple CLI 输入 java weka.core.converters.CSVLoader demo.csv demo.arff回车后界面没输出查看 demo.arff 却只有 0 字节。原因命令执行时当前工作目录不是 demo.csv 所在目录CSVLoader 找不到输入文件报错信息被简单输出吞掉或者输出文件名所在的目录没有写入权限。解决先 cd 切换到 CSV 所在目录再执行转换命令文件名如果带空格要加引号包裹。转换完用编辑器打开 ARFF确认 data 之后有数据行再继续下一步。5.3 现象ARFF 打开后数据列错位数值全对不上Explorer 里某属性的摘要显示一堆 missing或者某个名义型属性里混进了数字。原因属性声明顺序和数据列的对应关系被破坏。最常见是手工编辑 ARFF 时少写了一个逗号或者删除了一个数据列但没删对应的 attribute 语句也可能是 CSV 转换前表头列数与数据列数不一致。解决用文本编辑器数每行逗号数量N 个属性应该有 N-1 个逗号。特别留意数据行末尾不要多出一个逗号那会导致 WEKA 认为还有一个空属性。与其手工修不如删掉 ARFF 重新从 CSV 转换一遍从源头保证一致性。5.4 现象Discretize 离散化后属性变成 “(-inf-34.333333]” 这种晦涩标签J48 分类树生成的树形图里节点判断条件全是这种区间串论文截图无法直视。原因Discretize 生成的区间名是自动边界表示法左边括号与右边中括号代表区间的开闭默认保留三位小数不具备业务含义。解决在 ARFF 文件里做全局替换把带括号和逗号的区间串替换成业务可读标签。替换时必须连同两边的单引号一起替换例如把 (-inf-34.333333] 换成 0_34把 (34.333333-43.666667] 换成 34_43。如果做了多段离散化建议先打开 ARFF 看全所有区间名再逐个替换别漏掉 -inf 和 inf 这两端。5.5 现象Explorer 卡死状态栏的鸟不动了点击任何按钮都没反应状态栏右侧那只鸟停止动画Log 区域没有新输出。原因数据集太大或 Filter 算法执行时间过长Java 堆内存不足或者上次任务未结束又启用了新任务。解决先右键点击状态栏触发一次 Java 垃圾回收这是 WEKA 内置的应急手段。如果还卡就关掉重新启动 WEKA并改用 Simple CLI 执行同类任务命令方式不加载 GUI内存压力更小。更大规模的数据集建议在启动时增加堆内存java -Xmx1024m具体数值按机器实际内存调整。出现过一次卡死之后我每次跑大任务前都会先看一眼数据集行数和内存设置避免中途翻车。6. 用脚本补齐重复操作批量转换 CSV 和重写离散区间标签当数据文件不止一个而是一整个目录下的几十个 CSV 时逐个在 Explorer 里打开另存就太慢了。利用 Simple CLI 的批处理能力一次循环能全部转完for f in *.csv; do java weka.core.converters.CSVLoader $f ${f%.csv}.arff echo converted: $f done这段脚本解释起来不难for 循环遍历当前目录下所有以 .csv 结尾的文件$f 是带引号的当前文件名防止路径里有空格${f%.csv}.arff 是 shell 的变量替换语法把文件名结尾的 .csv 换成 .arff作为输出文件名。echo 打印一行提示方便确认哪些文件已经转换成功。执行完再配合一段校验用文本编辑器随机打开几个 ARFF确认 data 后的行数和源 CSV 行数一致即可。离散化区间的替换也可以用脚本批量做比手工查档案替换更稳。以离散化 age 和 income 后的 bank-data.arff 为例用 Python 执行一次替换# 读取 ARFF 文件替换离散化区间标签为可读名称 with open(bank-data.arff, encodingutf-8) as f: content f.read() content content.replace((-inf-34.333333], 0_34) content content.replace((34.333333-43.666667], 34_43) content content.replace((43.666667-inf), 43_inf) with open(bank-data.arff, w, encodingutf-8) as f: f.write(content)这段代码的逻辑是先以 UTF-8 编码读入整个 ARFF 文件内容再按字典顺序依次替换三个区间标签最后写回原文件。注意替换的字符串里必须包含区间标签两边的单引号因为 ARFF 文件里 nominal 值如果含有特殊字符WEKA 会强制用单引号包裹只替换中间部分会导致残留单引号。如果离散化的分段数不是 3 而是 5照葫芦画瓢在 replace 链里多写几行即可。这套脚本组合解决了两类最耗时的重复劳动格式转换和标签重写。从那以后我每次拿到批量数据集都强制走一遍“CSVLoader 循环转换 文本编辑器抽查表头 必要时脚本替换区间名”的流程确认属性类型和类属性顺序没问题再进 Explorer 建模翻车的概率低了很多。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →