ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

WEKA数据挖掘实战:ARFF预处理、分类聚类与关联规则

WEKA数据挖掘实战:ARFF预处理、分类聚类与关联规则

简介:面向数据挖掘与机器学习初学者及课程教学场景,这套WEKA中文详细教程以单份PPT形式系统梳理了从入门到实操的知识脉络。内容从WEKA的由来、开源背景与主要特点讲起,依次介绍探索环境、命令行环境、知识流环境和算法试验环境,并对Explorer界面八个功能区域逐一拆解,说明数据预处理、分类、聚类、关联分析、属性选择与可视化等选项卡的用途。教程还专门讲解ARFF数据集的实例、属性与关系结构,以及数据准备、筛选器使用和结果解读方法,配合天气数据集等示例帮助理解完整挖掘流程。压缩包内共1个PPT文件,大小约14.29MB,页面结构按章节推进,适合课堂讲授或自学对照。目前已有168人学习,可作为快速掌握WEKA基本操作、建立数据挖掘流程认知的轻量课程资料。

1. WEKA中文详细教程PPT:从八个面板到一条可复现的挖掘路径

手头这份 WEKA 中文详细教程 PPT 是一套偏操作的课程资源,第一次打开时容易被八个面板和一排英文按钮劝退。它解决的不是算法推导,而是把 CSV 数据落到 ARFF、用 Filter 清洗、再跑分类聚类关联这条链路走通。适合刚接触数据挖掘课程设计的人,也适合需要把实验步骤固化成命令行批处理的熟手。教程覆盖数据准备、预处理、分类、聚类、关联规则、属性选择、可视化和知识流界面;界面截图偏老,但核心概念和参数仍然对得上。读的时候别急着点算法,先把数据集和目标变量看懂,后面会省掉很多返工。

2. 数据集与ARFF:把CSV落成可训练的二维表

2.1 ARFF为什么比CSV多一层声明

WEKA 眼里的数据集是一张二维表:一行是一个实例,一列是一个属性,整张表构成一个关系。CSV 只告诉你“逗号分隔”,不告诉你哪一列是数值、哪一列是标称、哪一列是分类目标。ARFF 的价值就在头信息里把这些类型提前钉死,算法读进来时不用猜。常见做法是先用 CSV 做原始留档,再转成 ARFF 做实验;不要直接在 CSV 上反复改列,改到后面自己都记不清哪一版是干净数据。

ARFF 是 ASCII 文本,扩展名.arff,用普通文本编辑器就能打开。以%开头的行是注释,WEKA 会忽略。去掉注释后,文件分两段:头信息从@relation开始,声明关系名和每个属性;数据信息从@data开始,后面按行放实例。关系名和属性名如果包含空格,要用英文单引号或双引号包住;属性名尽量以字母开头,少用中文和特殊符号,后面写命令行会少很多转义麻烦。

类型声明是第一个容易翻车的地方。WEKA 支持 numeric、nominal、string、date 四类,integer和real也会被当作 numeric 看待。关键字integer、real、numeric、date、string区分大小写,而relation、attribute、data不区分。标称属性要把所有可能取值写在花括号里,数据行里出现集合外的值就会报错。字符串属性可以放任意文本,但不少分类器并不直接吃字符串,实验前要么转成标称,要么先做文本特征处理。

声明写法含义常见误用
@attribute age numeric数值属性,整数和小数都按实数处理把带单位的23岁直接塞进 numeric 列
@attribute city {北京,上海,广州}标称属性,取值必须在集合内数据里出现深圳但声明里没写
@attribute note string字符串属性,可放文本直接拿 string 列做分类目标
@attribute day date yyyy-MM-dd日期属性,需给格式格式写成yyyy/MM/dd但数据是短横线

注意:ARFF 的@data之后每一行列数必须与属性声明数量一致,缺失值写?,不要留空;空字段和问号在 WEKA 里不是一回事。

2.2 关系、属性、数据三段怎么写

下面这份示例是教程里常见的天气决策表结构,最后一个是类别属性。把它保存为weather_demo.arff,放进项目的数据目录,后面分类和关联实验都可以拿它做冒烟测试。

% 示例:天气决策表,最后一个是类别 @relation weather_demo @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

这段 ARFF 里,@relation给整张表起名;五个@attribute按顺序对应数据行的五列;outlook和windy、play是标称属性,花括号里列全取值;temperature和humidity是数值属性。最后一个属性play是默认的 class 属性,分类任务会把它当目标变量。属性声明顺序不是装饰,它直接决定数据部分每一列的含义,第 0 列是outlook,第 1 列是temperature,改顺序就要同步改数据列。

我一般会先做三件事再打开算法面板:数一遍属性声明有多少个,数一遍数据行第一行有多少个逗号分隔字段,确认两者一致;检查最后一个属性是不是我想预测的目标;检查标称属性的取值集合有没有漏掉数据里的新值。这三步看着笨,但比在分类面板里看到一堆红色报错再回头查要快得多。

2.3 从CSV到ARFF的转换与列顺序核对

原始数据常常是 CSV。WEKA 的 Explorer 可以直接打开 CSV,打开时它会提示做格式转换,转换完在区域 2 另存为 ARFF。常见做法是先用 Explorer 转一版,再用文本编辑器打开检查头信息;如果 CSV 没有表头,先在表格工具里补一行列名,别让 WEKA 把第一条记录当成属性名。也可以走命令行转换,把 CSV 读进来后重定向成 ARFF:

# 把 CSV 转成 ARFF,输出到标准输出后重定向到文件 java -cp weka.jar weka.core.converters.CSVLoader data/raw.csv > data/raw.arff # 打开转换结果,重点看 @attribute 数量和类型 sed -n '1,40p' data/raw.arff

CSVLoader负责读 CSV,-cp weka.jar指定类路径,>把标准输出写到data/raw.arff。转换后不要直接开跑,先看@attribute的数量和顺序。如果第一行被当成数据,属性名会变成A1、A2这种自动名;如果数值列被识别成 nominal,后面做标准化和离散化就会别扭。CSV 里的空字段在转换后可能是?,也可能是空字符串,打开 ARFF 搜一下就能确认。

列顺序核对有个简单办法:在 Explorer 的区域 5 属性列表里从上往下看,和 CSV 表头逐列对。区域 4 会显示关系名、属性数和实例数,实例数应该和 CSV 去掉表头后的行数一致。区域 6 选中某个属性后能看到类型、缺失值数量、不同值数量;数值属性还会显示最小值、最大值、均值和标准差。看到均值明显离谱,比如年龄均值 300,多半是单位列混进来了,或者某一列错位。

数据量不大时,手写 ARFF 比转换更稳,尤其是课程实验里只有几十行数据。手写的好处是每一列类型都由你控制,坏处是容易少写逗号。写完先保存,用 Explorer 打开,看区域 4 的实例数是不是你预期的行数。若报Number of attributes does not match,就回到@data第一行数列数,不要靠猜。把weather_demo.arff这种小样本跑通,再去碰自己的业务数据,排错成本低很多。

3. 数据预处理:用Filter把脏数据挡在模型外

3.1 Explorer预处理面板的八个区域怎么分工

Explorer 界面被教程拆成八个区域,预处理阶段最常盯的是区域 1、3、5、6、7。区域 1 的Preprocess选项卡负责选数据和改数据;区域 2 是打开、编辑、保存、撤销这些常用按钮;区域 3 的Choose用来选 Filter;区域 4 显示关系名、属性数、实例数;区域 5 是属性列表,勾选后点Remove可以删列,删错了用区域 2 的Undo找回;区域 6 是当前选中属性的摘要;区域 7 是直方图;区域 8 底部有状态栏、Log按钮和那只鸟。

区域 5 上方那排按钮是快速勾选用的,属性多的时候比一个个点快。区域 6 对数值属性和标称属性的摘要不一样:数值属性给最小值、最大值、均值、标准差;标称属性给每个不同值的计数。这个摘要比直接看数据行有用,缺失值比例、不同值数量、唯一值比例都能在这里看到。区域 7 的直方图默认按最后一个属性着色,如果最后一个是类别,就能直观看到类别分布;下拉框换成No Class或数值属性会变成黑白直方图。

区域 8 的状态栏会提示当前在装载文件还是执行任务,右键状态栏能看到内存信息和强制垃圾回收。Log按钮建议常开,Filter 报错时日志里往往有更具体的原因。那只鸟在动说明任务还在跑,不要在这个时候连续点按钮,否则容易把界面点卡。预处理阶段的核心不是把按钮点一遍,而是把“删列、补缺失、转类型、离散化/标准化”排好顺序,每一步都能回退。

3.2 常用Filter的选择顺序与参数

Filter 分监督和非监督两类。非监督 Filter 不看类别,比如删除属性、替换缺失值、标准化;监督 Filter 需要类别信息,比如有监督离散化。顺序上我一般按“先删无关列和重复列,再处理缺失值,再按算法需要做离散化或标准化,最后再选属性”走。不要把标准化放在离散化后面,也不要在缺失值没处理时先做距离类聚类,否则结果很难解释。

Filter用途关键参数注意点
Remove删除指定列-R 1,3-5按 1 起始索引选列删除前先备份,Explorer 里可用Undo
ReplaceMissingValues用均值/众数替换缺失默认按属性类型处理缺失比例过高时别硬补,先考虑删列
Normalize数值属性缩放到 0~1默认处理所有数值属性距离类算法前做,树模型不一定需要
Standardize标准化到均值 0、方差 1默认处理数值属性和 Normalize 二选一,别重复做
Discretize连续值转区间-B 5指定分箱数监督 Filter,类别属性要在最后

命令行调用 Filter 时,-i是输入 ARFF,-o是输出 ARFF。下面这段先补缺失值,再做标准化,输出两个中间文件,方便回退对比。

# 第一步:替换缺失值,生成 step1 java -cp weka.jar weka.filters.unsupervised.attribute.ReplaceMissingValues \ -i data/raw.arff -o data/step1.arff # 第二步:对数值属性做标准化,生成 step2 java -cp weka.jar weka.filters.unsupervised.attribute.Normalize \ -i data/step1.arff -o data/step2.arff # 第三步:有监督离散化,-B 5 表示分成 5 个区间 java -cp weka.jar weka.filters.supervised.attribute.Discretize \ -B 5 -i data/step2.arff -o data/step3.arff

ReplaceMissingValues不改变列数,只把?换掉;Normalize默认处理数值属性,标称属性不动;Discretize是监督 Filter,会读取最后的 class 属性,-B 5控制分箱数量。每一步都落一个中间文件,后面发现结果不对可以回到上一步,不用从头再跑。命令行里反斜杠是换行续行,实际执行时也可以写成一行。属性索引在命令行里通常从 1 开始,和 Explorer 里勾选时的显示要区分开。

如果只想删列,可以用Remove:

# 删除第 1 列和第 3 到第 5 列,索引从 1 开始 java -cp weka.jar weka.filters.unsupervised.attribute.Remove \ -R 1,3-5 -i data/raw.arff -o data/selected.arff

-R后面是逗号分隔的索引或区间,1,3-5表示第 1 列加上第 3 到第 5 列。删除列之前先确认哪一列是 ID、哪一列是泄漏字段;把 ID 当特征喂给分类器,准确率可能虚高,换一份数据就崩。区域 5 里勾选删除后还能Undo,命令行删了就真删了,所以中间文件别省。

3.3 缺失值、离散化与标准化的取舍

缺失值处理没有万能公式。数值列缺失比例低,可以用均值或中位数补;标称列可以用众数补;缺失比例高到三四成,补出来的值会主导模型,这时候更稳的做法是删列或把“缺失”单独作为一个标称取值。ReplaceMissingValues是快速兜底,不是质量保证。补完之后在区域 6 再看一眼缺失值数量,确认变成 0,别只看日志说执行成功。

标准化和归一化只对距离敏感或对尺度敏感的算法更有意义。KMeans、KNN 这类算法在未标准化的数据上容易被大数值列带偏;J48 这种树模型对单调缩放不敏感,做不做标准化差别不大。离散化适合把连续年龄分成区间,也适合关联规则这种需要标称项的算法。Discretize是有监督的,会参考类别分布找切分点,所以类别属性必须在最后,且不能拿测试集的类别去参与训练集的离散化,否则评估会泄漏。

属性选择是预处理的最后一环。Explorer 的Select Attributes选项卡可以跑属性评估器和搜索方法,输出排名。我的习惯是先用全部属性跑一版基线,再用属性选择跑一版,比较交叉验证结果;如果提升不明显,宁可保留全部属性,少一层解释成本。属性选择结果不要直接当成“因果结论”,它只是当前数据、当前评估器下的排序。

提示:每次改完 Filter 都在区域 4 看一眼属性数和实例数,属性数对不上通常是删除列或转换时多吃了表头;实例数对不上通常是 CSV 里有空行。

4. 分类、聚类与关联规则:在同一份数据上做三条实验线

4.1 分类实验:训练集、测试集与交叉验证

分类面板在Classify选项卡。区域上方选分类器,Choose里常见的有 J48 决策树、NaiveBayes、SMO 等;区域中间选测试方式:Use training set、Supplied test set、Cross-validation、Percentage split。课程实验里最容易犯的错是用训练集测试训练集,准确率很好看,换一份数据就原形毕露。我一般先用 10 折交叉验证看稳定性,再留一份独立测试集做最终确认。

命令行跑 J48 可以这样写:

# 用训练集训练,用独立测试集评估,-p 0 输出预测结果 java -cp weka.jar weka.classifiers.trees.J48 \ -t data/train.arff -T data/test.arff -p 0 # 只用一份数据做 10 折交叉验证 java -cp weka.jar weka.classifiers.trees.J48 \ -t data/train.arff -x 10

-t指定训练集,-T指定测试集,-p 0表示输出第 0 个属性的预测明细,通常就是类别列;-x 10表示 10 折交叉验证。-t和-T同时出现时做独立测试,-t配-x时做交叉验证,不要三个参数一起堆。J48 默认参数就能跑,想调剪枝可以看-C置信度阈值和-M叶节点最小实例数,但先跑默认版做基线,别一上来就调参调到过拟合。

结果面板重点看 Accuracy、Kappa、RMSE,以及混淆矩阵里的每一类。类别不平衡时,Accuracy 会被多数类带偏,比如 95% 样本是负类,全猜负类也有 95% 准确率。这时候要看少数类的 Precision、Recall、F1,必要时用-p输出预测明细自己算。ROC 面积适合二分类概率输出,多分类要看具体配置。评估结果不是越高越好,先确认测试集没有混进训练集,再谈模型优劣。

4.2 聚类实验:距离度量与簇数选择

聚类面板在Cluster选项卡,常用 SimpleKMeans、EM、HierarchicalClusterer。KMeans 需要先定簇数-N,这个数字不是拍脑袋来的:可以先用肘部法看不同簇数下的簇内误差,也可以结合业务含义定。聚类前做标准化很重要,否则数值范围大的列会主导距离。标称属性要么转成数值,要么用支持混合距离的配置,别把类别编码成 1、2、3 后直接当连续值算欧式距离。

# 对标准化后的数据做 3 簇 KMeans java -cp weka.jar weka.clusterers.SimpleKMeans \ -N 3 -t data/norm.arff # 输出每个实例被分到的簇 java -cp weka.jar weka.clusterers.SimpleKMeans \ -N 3 -t data/norm.arff -p 0

-N 3是簇数,-t是输入数据,-p 0输出实例分配。KMeans 对初始中心敏感,可以设置-S随机种子固定初始化,便于复现。结果面板会给出簇内平方和、各簇实例数、簇中心。簇中心是理解聚类结果的入口:看每个簇在哪些属性上偏高或偏低,再结合业务命名。簇数增加通常会让簇内误差下降,但降到 0 没有意义,每个点一簇不是业务想要的。

聚类没有标签,评估比分类更依赖解释。可以用ClusterEvaluation看对数似然,也可以拿已知类别做外部验证,但别把外部标签喂给聚类算法。我的习惯是先跑 2 到 6 簇,记录每档的簇内误差和簇大小分布,挑一个簇大小不过分失衡、中心能解释的档位。某个簇只有一两个实例时,多半是离群点或簇数过多。

4.3 关联规则:支持度、置信度与提升度

关联规则面板在Associate选项卡,常用 Apriori、FPGrowth。关联规则要求数据是标称项,连续值先离散化。Apriori 的核心参数是支持度、置信度和规则数:支持度太低会产出大量偶然规则,太高会漏掉长尾;置信度太高规则数会锐减;规则数用来限制输出规模。先从小规则数跑通,再逐步放宽。

# Apriori:最多输出 10 条规则,最小置信度 0.9,最小支持度 0.1 java -cp weka.jar weka.associations.Apriori \ -N 10 -C 0.9 -M 0.1 -t data/step3.arff

-N 10限制输出规则数量,-C 0.9是最小置信度,-M 0.1是最小支持度,-t是输入数据。支持度描述“这个项集在数据里出现得多不多”,置信度描述“前件出现时后件出现的概率”,提升度描述“比独立假设强多少”。只看置信度高不够,后件本身很常见时置信度也会高,提升度接近 1 的规则信息量有限。结果里还有覆盖数、泄漏数这些指标,拿来判断规则是否稳定。

关联规则最容易翻车的地方是把 ID、时间戳、序号列一起离散化,然后跑出一堆“ID 某段 -> 类别”的伪规则。跑之前把无关列删掉,离散化只对业务上有意义的连续列做。规则出来之后不要直接写进报告,先拿一部分数据做回测,看规则在新样本上的支持度是否还成立。

注意:分类、聚类、关联三条实验线尽量共用同一份清洗后的数据,但目标列处理不同;分类要保留类别,聚类通常去掉类别,关联规则要把类别也当成一个标称项。

5. WEKA实操避坑:五条从报错到复现的排查记录

5.1 数据装载与格式类翻车

现象:Explorer 打开 CSV 后属性全是A1、A2,或者打开 ARFF 直接报Number of attributes does not match。原因:CSV 没有表头,转换器把第一条记录当成了属性名;ARFF 的@attribute数量和@data第一行的字段数不一致,常见于手写时少写一列或字符串里多了逗号。解决:先在 CSV 顶部补一行列名,再转换;手写 ARFF 时用文本编辑器的列选择模式数逗号,确保每一行列数一致。字符串里带逗号时用引号包住,或者提前把逗号替换掉。转换后先看区域 4 的属性数和实例数,对不上就别往下走。

现象:标称属性报nominal value not declared in header。原因:数据里出现了花括号中没有声明的取值,比如声明了{sunny, overcast, rainy},数据里却有cloudy,或者大小写不一致。解决:在区域 6 看该属性的不同值列表,把缺失的取值补进声明,或者把数据里的异体值统一。标称值大小写敏感,Yes和yes会被当成两个类别,清洗时统一大小写。

现象:分类器报class attribute not nominal。原因:最后一个属性被声明成 numeric 或 string,而当前分类器要求标称类别。解决:把目标列改成@attribute label {yes, no}这种标称声明,并确认它在属性声明的最后一行。如果目标列在中间,用Reorder或手动调整列顺序,别指望算法自己找。

5.2 评估与结果解读类误判

现象:训练集准确率 99%,交叉验证只有 70%。原因:用训练集测试训练集,模型记住了样本;或者预处理时用了全量数据的统计量做标准化,测试折的信息泄漏进训练折。解决:统一用交叉验证或独立测试集汇报结果;标准化、缺失值填充这类步骤在交叉验证内部做,或者至少用训练折的统计量。课程实验里把Use training set的结果和交叉验证结果并排写,能看出过拟合程度。

现象:关联规则里出现“编号段 -> 类别”的高置信度规则。原因:ID、序号、时间戳被当成普通属性参与离散化和规则挖掘,编号和样本顺序相关,产生了伪相关。解决:跑关联规则前用Remove删掉 ID、时间戳、行号;只保留业务上可解释的属性和类别。规则输出后看提升度,提升度接近 1 的规则不要当强关联。

现象:KMeans 结果每次跑都不一样,簇中心对不上。原因:初始中心随机,未固定随机种子;或者输入数据未标准化,距离被大数值列主导。解决:设置-S固定种子,先做标准化再聚类;记录簇数、种子、标准化方式,复现时三项一起对。簇数不要只看误差下降,还要看簇大小和中心解释。

5.3 内存与界面操作类问题

现象:加载大文件时界面卡死,状态栏一直转,最后报OutOfMemoryError。原因:默认堆内存偏小,直方图和可视化又占额外内存;属性多、实例多时尤其明显。解决:启动时调大堆内存,比如java -Xmx2g -cp weka.jar weka.gui.GUIChooser;先关掉不必要的可视化面板,或者用命令行做批处理。状态栏右键可以看内存信息并强制垃圾回收,但根治还是加内存和减数据。

现象:点了Remove删列后结果不对,想找回原列。原因:删除后继续做了其他 Filter,Undo只能回退最近一步;或者命令行删除后没有中间文件。解决:预处理每一步都输出独立 ARFF,命名带步骤号;Explorer 里删列前先Save一版。命令行用-i和-o分开,不要覆盖原文件。

现象:Filter 执行成功但类别列不见了。原因:监督 Filter 需要类别列在最后,Remove或Reorder把类别列移走或删掉;也有可能是输出文件被下一个 Filter 覆盖。解决:每次 Filter 后打开输出文件看@attribute列表,确认类别列还在最后;监督 Filter 失败时先检查类标位置,再检查类别取值是否合法。

提示:排错顺序建议固定为“看数据行列数 → 看属性类型 → 看类别位置 → 看 Filter 顺序 → 看评估方式”,不要一上来就调算法参数,前四步没问题再谈调参。

6. 进阶用法:Knowledge Flow与命令行批处理的可验证套路

6.1 用Knowledge Flow固化一条数据流

Knowledge Flow界面适合把“数据源 → Filter → 分类器 → 评估器”连成一条可保存的流。做法不复杂:从工具栏拖ArffLoader进来,接ClassAssigner指定类别列,再接 Filter 和J48,最后接CrossValidationSplit或TestSetMaker和Evaluation。连好后保存为.kf文件,下次打开直接加载,比在 Explorer 里重复点按钮稳。流里的每个组件都能右键配置参数,参数和命令行一一对应。

6.2 命令行批处理与结果校验

批量跑多份数据时,我一般用 shell 循环,把结果重定向到日志,再统一 grep 关键指标。下面这段只跑交叉验证并保留输出:

# 对 data 目录下所有 arff 跑 10 折交叉验证,日志按文件名保存 for f in data/*.arff; do base=$(basename "$f" .arff) java -cp weka.jar weka.classifiers.trees.J48 -t "$f" -x 10 \ > "logs/${base}.log" 2>&1 done

for循环遍历 ARFF 文件,basename取文件名,-x 10做交叉验证,2>&1把错误输出也收进日志。跑完先看日志里有没有Exception,再看Correctly Classified Instances的比例。批量实验最怕某一份数据静默失败,日志里只有一行警告,所以每份结果都要抽查。

6.3 自定义算法接入前的检查表

想通过 WEKA 接口接自己的算法,先把下面几项对一遍,能省掉大量调试时间。

检查项合格标准常见问题
类继承关系分类器继承AbstractClassifier只实现接口没继承基类,GUI 里选不到
数据读取能处理Instances和Instance把类别列当普通特征
参数声明用@Option标注并实现getOptions命令行参数和 GUI 参数不一致
随机性固定种子并提供设置入口结果不可复现
异常处理对缺失值、类型不匹配给出明确报错静默返回 0 或空模型

这份 WEKA 中文详细教程 PPT 我建议按章节拆开用:先看数据准备和预处理,再对照分类、聚类、关联的页面跑一遍,最后用 Knowledge Flow 把流程固化。完整页面按课程资源的原始分发路径取用,不必从头到尾翻。从那以后我每次拿到新数据,都先强制走一遍 ARFF 列数核对、class 位置、缺失值三件事,再点算法。希望帮到你。

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

返回列表