星点匠心建站 星点匠心建站XD JIANXIN STUDIO
400-883-9527 免费定制方案
ARTICLE DETAIL

资讯详情

深耕新锐建站与运营推广的一线实战洞察。

WEKA中文教程:ARFF、Filter链与J48建模避坑

WEKA中文教程:ARFF、Filter链与J48建模避坑 简介这份《WEKA中文详细教程PPT》面向数据挖掘与机器学习初学者、课程学习者及需要快速上手WEKA的教师与研究人员系统讲解从软件认知到实际分析的完整入门路径。内容围绕WEKA简介、数据集与ARFF格式、数据准备与预处理、分类、聚类、关联规则、属性选择、数据可视化及知识流界面展开并细致拆解Explorer环境八个区域的功能、筛选器使用、属性摘要与直方图查看等操作帮助读者理解算法选择、结果解释和数据集管理。资源包共1个PPT文件大小约14.29MB以幻灯片形式组织章节便于课堂讲授、自学对照和知识梳理。已有167人学习适合作为课程资源反复查阅也可为后续分类、聚类与关联分析实践打下基础。1. 拿到一份 WEKA 中文详细教程 PPT先解决“看得懂但跑不通”WEKA 中文详细教程这类课程资源最容易出现一种落差翻 PPT 觉得每一步都懂真正打开软件第一关就卡在 ARFF 文件解析报错上。这份资料按界面和任务组织从 WEKA 简介、数据集、数据准备、预处理一路排到分类、聚类、关联规则、属性选择、可视化和知识流界面页码超过 270 页覆盖面在中文材料里算完整的。它的定位是操作手册并非算法推导讲义哪个选项卡管什么、哪个按钮对应哪个 Filter、结果面板里的数字怎么读。适合两类人课程设计要交一套完整挖掘流程的以及手上有一份表格数据、想快速验证有没有建模价值的。下面按实际复现顺序拆先讲界面与数据的对应关系再讲预处理、建模和几个几乎必踩的坑。2. 从打开软件到跑通第一个数据集四种环境、Explorer 八区与 ARFF 头信息2.1 四种环境的分工Explorer、命令行、KnowledgeFlow、ExperimenterPPT 开篇把界面拆成四个环境这个划分不是为了凑页数而是对应四种完全不同的工作方式。Explorer 是单次交互式实验加载一份数据、选一个算法、点 Start结果直接打在右侧面板里适合摸数据和调参。命令行环境是把 Explorer 里的操作翻译成一条 java 命令适合批处理、写脚本、把实验固定下来。KnowledgeFlow 是图形化数据流把 ArffLoader、Filter、Classifier、Evaluation、TextViewer 这些组件拖到画布上连线适合把“预处理 建模 评估”串成一条可复用的链路。Experimenter 则是多算法、多数据集的统计比较输出结果可以直接做配对检验或秩和检验。新手容易把时间全耗在 Explorer 里遇到重复实验就一遍遍手点参数记不住、结果对不上。我的建议是Explorer 只用来做前三次探索确认数据能读、算法能跑、指标合理一旦确定要跑多组参数立刻转到命令行把整条命令复制进记录表。KnowledgeFlow 不必一上来就学它的价值在流程固定之后Experimenter 更适合已经有几个候选算法、需要给出“谁更稳”的结论时再用。环境适合做的事不适合做的事Explorer单数据集探索、看分布、试算法批量跑参数、长期复现命令行固定实验、脚本化、保存模型快速看数据分布KnowledgeFlow多步骤流程复用、可视化编排临时改一个参数就想看结果Experimenter多算法多数据集对比、统计检验单次实验调参提示四个环境共用同一套算法和 Filter 类名Explorer 里 Choose 看到的树状路径就是命令行里-W后面要写的全限定类名两边可以互相翻译。2.2 Explorer 八个区域逐个对应到参数Explorer 界面被切成八块PPT 讲得比较细但真正影响操作的其实只有五处。区域 1 是任务选项卡Preprocess、Classify、Cluster、Associate、Select attributes、Visualize 分别对应数据预处理、分类回归、聚类、关联分析、属性选择和二维散点图。区域 2 是打开、编辑、保存、Undo 这排按钮注意 Undo 只回退最近一次改动连续 Apply 几个 Filter 之后不一定能退回原点所以每次动数据前先 Save 一份副本这是血泪经验。区域 3 是 Choose Filter 的下拉框预处理的核心入口。区域 4 显示关系名、属性数、实例数数据读进来第一眼看这里数字不对说明分隔符或引号出了问题。区域 5 是属性列表勾选后点 Remove 可以删列上方一排 All、None、Invert 是快速选择。区域 6 是当前选中属性的摘要数值型给最小值、最大值、均值、标准差标称型给每个取值的计数两种类型都会给缺失值数量及比例、不同值数、唯一值数。区域 7 是直方图默认按最后一个属性着色下拉框可以换分类依据。区域 8 是状态栏、Log 按钮和那只鸟鸟在动说明任务还在跑。区域 6 的数字最容易被忽略但它决定了后面模型的上限。一个属性的 Distinct 数等于实例数基本可以判定是 ID 列或流水号留着只会让模型记住样本交叉验证看起来很好换数据就崩。Missing 比例超过三成先想清楚是采集缺失还是填报缺失再决定删列、填充还是让算法自己处理。标称属性的计数如果出现yes和Yes两个条目说明大小写没统一WEKA 会把它们当成两个不同的类别。2.3 ARFF 三段结构与四种数据类型WEKA 只认 ARFF这是一种 ASCII 文本文件用写字板就能打开编辑。去掉%开头的注释后整个文件分两段头信息从relation开始到data之前负责声明关系名和每个属性数据段从data下一行开始一行一个实例逗号分隔。属性声明的顺序就是数据列的次序第一个声明的属性对应第一列最后一个声明的属性默认被当作分类或回归的目标变量。% 一个最小可用的二分类数据集最后一列 play 是默认类别 relation demo_weather attribute outlook {sunny, overcast, rainy} attribute temperature numeric attribute humidity numeric 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后面先写属性名再写类型。WEKA 支持四种类型numeric数值型、{a,b,c}标称型、string字符串型、date [格式]日期时间型。integer和real也能写但内部都按numeric处理。类型关键字区分大小写numeric写成Numeric会解析失败relation、attribute、data这几个标记本身不区分大小写。数据段有几个硬规则不能有表头不能有空行夹在中间缺失值必须写?不能留空或写NA。字符串和标称值里如果出现逗号、空格、花括号必须用英文引号包起来否则会被当成分隔符切开。标称值的声明顺序不是装饰WEKA 内部用这个顺序给类别编号顺序一变同一个yes可能从索引 0 变成索引 1旧模型加载到新数据上就会出现标签整体错位。2.4 从 CSV 到 ARFF一份不依赖第三方库的转换脚本实际项目里数据多半是 CSV 或 Excel 导出手写 ARFF 头信息容易漏列、类型判断错。下面这段脚本只依赖标准库做四件事清洗属性名、推断数值/标称类型、把指定类别列挪到最后一列、把缺失值统一成?。适合几十列以内的常规表格跑完直接用 WEKA 打开检查。import csv import re from pathlib import Path # 按项目习惯扩展导出工具常把缺失写成这些值 MISSING {, ?, NA, N/A, null, NULL, nan} def clean_name(name, idx): # 属性名要字母开头空格和特殊符号统一替换成下划线 name re.sub(r[^0-9A-Za-z_\u4e00-\u9fa5], _, name.strip()) if not name or not name[0].isalpha(): name fattr_{idx}_{name} return name def quote_level(v): # 标称值含空格、逗号、花括号时必须加引号 if re.search(r[\s,{}\], v): return v.replace(, \\) return v def infer_type(values): cleaned [v for v in values if v not in MISSING] if not cleaned: return numeric try: for v in cleaned: float(v) return numeric except ValueError: # 保序去重避免集合打乱标称值声明顺序 levels list(dict.fromkeys(cleaned)) return { ,.join(quote_level(x) for x in levels) } def csv_to_arff(src, dst, class_colNone, relationNone): with open(src, newline, encodingutf-8-sig) as f: rows list(csv.reader(f)) header rows[0] body [r for r in rows[1:] if any(c.strip() for c in r)] names [clean_name(h, i) for i, h in enumerate(header)] # WEKA 默认取最后一个属性作为 class这里把目标列挪到末尾 order list(range(len(header))) if class_col is not None: idx header.index(class_col) order.remove(idx) order.append(idx) cols [[row[i] if i len(row) else for row in body] for i in order] specs [infer_type(col) for col in cols] lines [frelation {relation or Path(src).stem}, ] for pos, i in enumerate(order): lines.append(fattribute {names[i]} {specs[pos]}) lines [, data] for row in body: vals [] for i in order: v row[i] if i len(row) else if v.strip() in MISSING: vals.append(?) elif re.search(r[,\s], v): vals.append( v.replace(, \\) ) else: vals.append(v) lines.append(,.join(vals)) Path(dst).write_text(\n.join(lines), encodingutf-8) if __name__ __main__: # class_col 写原始 CSV 里的列名不传则保持原列序 csv_to_arff(raw/bank.csv, data/bank.arff, class_colsubscribe)脚本的逻辑顺序值得说明。infer_type先剔除缺失值再尝试整体转浮点全部成功才判numeric只要有一个非数值就降级为标称型这样能避免“99 行数字加一行unknown”被误判成数值列。clean_name处理中文列名和带空格列名WEKA 对属性名比标称值严格字母开头这条不满足会直接报错。class_col是把目标变量挪到最后一列因为 Explorer 的 Classify 面板默认取最后一列不想每次手动调顺序就在转换阶段解决。参数上MISSING集合按数据源实际情况加比如有的导出工具把缺失写成-或\N提前加进去比事后在 WEKA 里逐个属性改省事。relation不传就用文件名避免中文文件名带空格导致解析异常。脚本不处理千分位逗号和货币符号数值列里出现1,234会被引号包成标称值这类脏数据得在转换前清洗。注意转换完不要直接开跑。在 Preprocess 里打开生成的 ARFF对照区域 4 的实例数、区域 5 的属性数、区域 6 的 Missing 计数三个数字和源表对得上再往下走。2.5 第一个闭环weather 数据跑 J48 并读懂输出装好之后自带data目录里面有几份示例数据拿最小的一份走一遍完整闭环。Preprocess 面板点 Open选weather.arff区域 4 应该显示关系名、5 个属性、14 个实例区域 5 看属性列表play在最后说明默认类别是它区域 6 点一下outlook能看到三个取值的计数。这一套检查做完切到 Classify 选项卡Choose 里找trees下的J48Test options 选 Cross-validation、Folds 填 10点 Start。14 条数据做 10 折其实很勉强每折训练集只有十二三条结果波动会很大。小样本更稳的做法是留一法或者至少把折数降到 5 并固定随机种子在 More options 里把 Random seed 写死。输出面板里先看Correctly Classified Instances和Kappa statistic前者在类别不平衡时会骗人后者扣掉了随机猜测的成分再看混淆矩阵行是实际类别、列是预测类别对角线之外的非零值才是真正要分析的错误最后看TP Rate、FP Rate、Precision、Recall、F-Measure和ROC Area少数类的 Recall 低说明模型只是把多数类背下来了。同样的实验翻译成命令行参数一目了然也方便贴进记录表# 10 折交叉验证-o 只输出统计结果不保存模型 java -cp weka.jar weka.classifiers.trees.J48 \ -C 0.25 -M 2 \ -t data/weather.arff \ -x 10 \ -o # 全量训练并保存模型-d 指定模型输出路径 java -cp weka.jar weka.classifiers.trees.J48 \ -t data/weather.arff \ -d runs/j48.model # 加载模型对新数据打分-p 0 打印每条实例的预测分布 java -cp weka.jar weka.classifiers.trees.J48 \ -l runs/j48.model \ -T data/weather.arff \ -p 0-t是训练文件-x是交叉验证折数-o表示只输出评估统计、不输出模型-d保存的是 Java 序列化对象换 WEKA 大版本可能读不回来模型文件旁边最好记一笔版本号-l加载模型-T指定测试集-p 0输出每条实例的预测类别和概率分布排查具体哪几条分错时比看汇总指标有用。Windows 下-cp的分隔符是分号路径里有空格要给整段加引号。-C是剪枝的置信度阈值默认 0.25调小会剪得更狠、树更浅-M是叶节点最少实例数默认 2样本少的时候调到 5 到 10 能明显抑制过拟合。这两个参数不要一起大改一次只动一个否则结果变好变坏都说不清是谁的功劳。3. 预处理与属性选择Filter 链的顺序比选哪个 Filter 更要紧3.1 Filter 的两大族与串联顺序WEKA 的 Filter 分两类监督式和非监督式。非监督式只看属性本身比如标准化、归一化、离散化、删列、替换缺失值监督式会读类别列比如基于信息增益的离散化、属性选择、重采样。这个区别决定了 Filter 能放在哪一步任何用到类别信息的操作都必须放进交叉验证内部否则测试折的标签信息会漏进训练过程。另一条分类线是属性 Filter 和实例 Filter。属性 Filter 改列实例 Filter 改行。串联顺序一般按“先动行、再动列、最后动监督式”来先去重和采样再删列、构造新列、离散化最后做属性选择。原因是实例级操作改变样本分布属性级操作改变特征空间顺序反过来会让前面算好的统计量失效。Explorer 里每点一次 Apply数据就被真正改写一次区域 4 和区域 5 立刻刷新。连续套三个 Filter 之后想退回原始数据Undo 不一定够用。我的习惯是原始 ARFF 只读所有变换后的版本另存为_clean.arff、_std.arff文件名带上处理步骤宁可多几个文件也别在一份数据上反复叠。Filter 类名作用关键参数注意事项filters.unsupervised.attribute.Remove删除指定列-R 1,3-5索引从 1 开始不是 0filters.unsupervised.attribute.ReplaceMissingValues均值/众数填充无填充值来自当前数据别在划分前做filters.unsupervised.attribute.Discretize数值转区间-B 10箱数-M等频等频比等宽更抗偏态filters.unsupervised.attribute.Standardize标准化无距离类算法必做树模型可不做filters.unsupervised.attribute.Normalize归一化到 [0,1]-S 2.0 -T 1.0有离群点时不如标准化稳filters.unsupervised.attribute.StringToNominal字符串转标称-R列索引不同值太多时慎重filters.supervised.attribute.AttributeSelection属性选择评估器 搜索器必须放进交叉验证内部3.2 缺失值、离散化、标准化三件必做事的参数缺失值先判断再处理。区域 6 里看 Missing 比例低于 5% 且分布随机直接删掉含缺失的实例最省事比例高但集中在少数几列考虑删列比例高且分散才用ReplaceMissingValues做均值或众数填充。WEKA 的 J48 和 RandomForest 本身能处理缺失值会按属性分布把缺失样本分到不同分支这种情况下不填充反而保留了不确定性。但 SMO、kNN、k-means 这些基于距离或超平面的算法必须填充否则缺失值参与距离计算会直接失真。离散化的关键参数是箱数和分箱方式。Discretize默认-B 10等宽分箱数据偏态严重时等宽会把绝大多数样本塞进第一个箱改用-M等频分箱每个箱的样本数接近。监督式离散化用supervised.attribute.Discretize它会参考类别分布找切点效果好但必须放进交叉验证不然切点是用全量标签算出来的评估结果会虚高。标准化和归一化只对距离敏感或基于梯度的算法有意义。kNN、SMO、SimpleKMeans、神经网络之前做Standardize决策树、随机森林对单调变换不敏感做不做差别不大但做了也不坏事前提是训练和预测用同一套均值方差。这一点在命令行里尤其要注意保存模型时标准化参数在模型内部加载模型预测新数据会自动复用前提是当时用FilteredClassifier把 Filter 和分类器包在了一起。3.3 Select Attributes评估器与搜索器怎么配属性选择面板是两个下拉框的组合Evaluator 决定怎么给属性子集打分Search 决定怎么在属性空间里找。常见搭配是CfsSubsetEval配BestFirst前者找与类别相关度高、彼此相关度低的子集后者做前向或后向搜索数据维度高、只想要一个排序时用InfoGainAttributeEval配Ranker把numToSelect设成想保留的属性数输出按信息增益从大到小排。WrapperSubsetEval用具体分类器做评估效果通常最好但每评估一个子集就要训练一次模型几十列数据还能忍上百列就非常慢。实际项目里我一般先用InfoGainAttributeEval Ranker快速砍到二三十列再用CfsSubsetEval BestFirst精挑最后用WrapperSubsetEval在小范围内验证。三步下来比一上来就 Wrapper 省时间也更容易解释为什么留这几列。属性选择同样有泄漏风险。用AttributeSelection面板单独跑一遍、拿到一个子集、再用这个子集做交叉验证等于用全量数据的标签选了特征评估结果偏乐观。正确做法是把属性选择 Filter 和分类器一起塞进FilteredClassifier让它在每一折训练集内部重新选一次。命令行写法是-F weka.filters.supervised.attribute.AttributeSelection ...加-W指定分类器参数嵌套比较长建议先在 Explorer 里配好再把生成的配置文本复制出来。3.4 预处理阶段的验证改完怎么确认没把数据弄坏每做完一批预处理回到 Preprocess 面板做三项检查。第一实例数有没有意外减少去掉缺失值、去重、采样都会改行数减了多少要心里有数。第二属性类型有没有变本文还有配套的精品资源点击获取
返回列表