
简介《基于Weka的数据分类分析实验报告》是一份面向数据挖掘初学者与机器学习课程实验者的PDF文档系统记录了利用Weka工具完成数据分类分析实验的完整思路与实操细节。文档先介绍Weka平台的功能、ARFF文件格式及iris.arff鸢尾花数据集的属性构成再分步演示LibSVM、C4.5决策树和朴素贝叶斯三种分类算法的实际实验过程包括参数调优、十折交叉验证、混淆矩阵分析以及准确率、召回率、F1和ROC面积等评价指标对比并给出该数据集上的最优分类器选择结论同时涉及数据预处理、属性筛选和模型应用于测试集的注意事项。资源为单份PDF文件大小687KB已有277人浏览学习适合作为课程实验报告撰写、Weka上机练习或分类算法对比复习的参考资料能让读者快速掌握从数据准备到分类评估的完整实验方法并将该实验框架迁移到其他数据集的分类分析中。1. 用 Weka 做数据分类分析先看懂 iris再谈算法对比我拿到这份“基于 Weka 的数据分类分析实验报告”时第一反应是实验本身并不难数据集是 Weka 自带的 iris.arff分类器选了 LibSVM、C4.5 和朴素贝叶斯评估方式是十折交叉验证。但真正复现一遍后发现里面值得展开的细节不少ARFF 的属性声明和类别分布会影响模型边界LibSVM 的核函数和惩罚系数需要一组明确的参数C4.5 对应 Weka 里的 J48置信度阈值和最小实例数直接决定树是否过度剪枝最后的混淆矩阵又把问题拉回到“哪些类别容易被混”这个本质。这个实验适合两类人刚接触数据挖掘想用图形界面把分类流程完整跑通的新手以及已经在用 sklearn 或 R但对 Weka 的评估输出、参数语义、模型保存方式还不够熟的一线工程师。下面按我的复现顺序来拆。2. ARFF 数据与 Weka 环境从数据格式到分类器安装2.1 ARFF 的语法与 iris.arff 的数据结构在 Weka 里读数据最常见的不是 CSV而是 ARFF。ARFF 的全称是 Attribute-Relation File Format也就是属性-关系文件格式。它用纯文本描述一个共享属性结构的实例集合relation声明数据集名称attribute声明每个属性的名字和类型data之后按行写数值和类别。iris.arff 的关键结构如下relation iris attribute sepallength numeric attribute sepalwidth numeric attribute petallength numeric attribute petalwidth numeric attribute class {Iris-setosa,Iris-versicolor,Iris-virginica} data 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa 4.7,3.2,1.3,0.2,Iris-setosa 6.7,3.0,5.2,2.3,Iris-virginica这个格式的好处是属性约束和数据分离Weka 在加载时就能根据attribute行完成类型推导。属性名不区分大小写类别用花括号枚举数据行按属性顺序用逗号分隔。实际项目里很少手写 ARFF常见做法是从 CSV 转换Weka 的weka.core.converters.CSVLoader可以直接把 CSV 转成 ARFF。转换时要注意纯数字的字段会被识别成 numeric但像 ID 这类不该参与建模的列最好在转换前先删掉或者在 Preprocess 面板里用 Remove 过滤器剔除。2.2 数据检查与预处理为什么 iris 不需要 Filter实验里没有做属性筛选直接用了 iris.arff这背后是有依据的。iris 共 150 个实例三个类别各 50 个属性只有 4 个数值型特征加一个类别标签没有缺失值也没有明显离群点。打开 Weka 的 Preprocess 面板可以看到每个属性的最小值、最大值、均值和标准差这些是判断是否需要清洗的第一手信息。如果遇到生产环境中的数据集处理思路完全不同。常见的预处理手段包括用ReplaceMissingValues填充缺失值用Normalize或Standardize消除量纲差异用NumericToNominal把连续值离散化用RemoveUseless剔除几乎不变的特征。属性筛选在 Weka 里并不是直接在 Preprocess 里删列那么简单更稳妥的方法是用weka.filters.supervised.attribute.AttributeSelection做 wrapper 式筛选或者把属性选择算法包在FilteredClassifier里避免在训练前就引入了对全量数据的统计信息。iris 本身特征和类别关系非常干净这才让实验可以跳过属性筛选直接进入分类器对比。2.3 安装 LibSVMPackage Manager 与命令行验证Weka 的原始发行版自带 J48 和朴素贝叶斯但 LibSVM 是第三方包装需要额外安装。最直接的方式是打开 Weka进入 Tools 菜单下的 PackageManager在搜索框里输入 LibSVM点击 Install 后等它下载。安装完成后需要重启 Weka在 Classify 面板点 Choose依次选择functions里面会出现LibSVM条目。命令行环境下可以通过包管理器命令确认是否安装成功java -cp weka.jar weka.core.WekaPackageManager -list-packages | grep -i libsvm如果能看到对应的包名和版本说明安装完成。我一般在安装后先用这个命令检查再打开 GUI 确认。LibSVM 在 Weka 里的类名是weka.classifiers.functions.LibSVM这个类本身依赖libsvm.jarPackageManager 会把依赖一起装好不需要手工下载 jar 文件。这里有一张 iris.arff 的属性表便于后续理解算法参数的变化属性名类型含义单位sepallengthnumeric花萼长度cmsepalwidthnumeric花萼宽度cmpetallengthnumeric花瓣长度cmpetalwidthnumeric花瓣宽度cmclassnominal鸢尾花类别无3. 三种分类算法的原理与参数设置LibSVM、C4.5、朴素贝叶斯3.1 LibSVM核函数与惩罚系数的取舍LibSVM 是支持向量机SVM的一种流行实现核心思想是找到一个超平面让不同类别的样本间隔最大化。由于原始空间不一定线性可分SVM 通过核函数把样本映射到高维空间。实验中采用的参数是java -cp weka.jar weka.classifiers.functions.LibSVM \ -S 0 -K 2 -D 3 -G 0.0 -R 0.0 -N 0.5 -M 40.0 -C 1.0 -E 0.001 \ -t data/iris.arff -x 10这组参数里-S 0表示使用 C-SVC即最常用的软间隔分类模型-K 2选择 RBF 径向基核函数适合非线性边界-C 1.0是惩罚系数控制对误分类样本的容忍度C 越大模型越倾向把所有训练样本都分对但也越容易过拟合-G 0.0是 RBF 核的 gamma 参数在 Weka 的 LibSVM 包装里0 表示使用默认值即 1/属性数-N 0.5是类别权重参数-M 40.0是缓存大小-E 0.001是终止容差。在实际项目中RBF 核总是优先尝试的对象因为它在样本量不大时有很强的拟合能力但代价是C和gamma两个参数需要配对搜索。常见的做法是用网格搜索对小数据集可以分别尝试C 0.1, 1, 10, 100和gamma 0.01, 0.1, 1看交叉验证准确率的变化。实验里直接使用了固定参数这作为教学演示没问题但在真实工程里不调参的 SVM 很可能被决策树超越。3.2 C4.5 决策树J48信息增益与剪枝参数C4.5 是决策树算法中的经典Weka 中对应类名是weka.classifiers.trees.J48。它用信息增益率选择分裂属性并且支持剪枝避免树结构过深导致过拟合。实验里采用的参数是-C 0.25 -M 2命令行如下java -cp weka.jar weka.classifiers.trees.J48 \ -C 0.25 -M 2 \ -t data/iris.arff -x 10-C 0.25是置信度阈值用于后剪枝。这个值越小剪枝越激进树越简洁值越大树越完整。默认 0.25 是被验证过在许多数据集上表现稳定的值。-M 2是叶子节点最少样本数设为 2 意味着允许树学到非常细节的规则在 iris 这种极干净的数据上问题不大但在有噪声的数据集上M应该提高到 5 或 10。J48 的优势在于可解释性。训练完成后在 Weka 输出面板里可以直接看到可视化树比如petallength 2.45时判为 setosa这比 SVM 的黑盒边界更好向业务方说明。和 LibSVM 相比J48 对特征尺度不敏感不用做标准化但容易在连续特征多、类别交错复杂时退化为很深的树所以剪枝参数需要反复看验证集表现。3.3 朴素贝叶斯独立假设下的无参模型朴素贝叶斯的原理是基于贝叶斯定理计算每个类别下当前样本出现的后验概率。它做了一个很强的假设所有属性在给定类别时互相独立。iris 数据集中花萼和花瓣的宽度、长度确实有相关性但这个假设在这个任务里没有造成灾难反而因为模型简单、方差小得到了接近 96% 的准确率。Weka 中运行它的命令行最简洁java -cp weka.jar weka.classifiers.bayes.NaiveBayes \ -t data/iris.arff -x 10默认情况下数值型属性用高斯分布估计概率密度参数也就是每个类别下的均值和方差。对于偏离正态分布的特征可以在 GUI 里选择带核密度估计的版本NaiveBayes的-K选项但会增加计算量。朴素贝叶斯在工程里更常见的角色是基线模型先用它跑一遍得到一个准确率下限再拿 SVM、树模型或者集成模型去对比。它的另一个优势是收敛快、对缺失值稳健在高维稀疏文本分类里仍然很能打但在属性强相关的场景下会低估概率这一点在 iris 上并不能完全体现出来。4. 十折交叉验证与结果对比混淆矩阵和 ROC 怎么读4.1 十折交叉验证结果三个模型的准确率盘点实验统一使用十折交叉验证而不是简单按 7:3 划分训练集和测试集。十折的做法是把数据集随机分成 10 份每次取 1 份做验证、剩下 9 份训练重复 10 次后把结果平均。这样每个样本恰好被验证一次比单次划分更稳定也不会让某一个幸运的验证集决定模型命运。根据实验输出三个模型的交叉验证结果可以汇总成下表算法交叉验证准确率错误实例数加权精确率 P加权召回率 RROC 面积LibSVM96.67%50.9670.9670.975C4.5J4896.00%60.9600.9600.968朴素贝叶斯96.00%60.9600.9600.994需要注意这里报告的是交叉验证结果而不是“训练后又在同一份数据上测试”的结果。实验中文本也提到了“将模型应用于测试集”之后准确率变成 98.67%、98%、96%但测试集同样来自 iris.arff这种重叠容易造成评估乐观。真正工程化的做法是独立划分一份没有参与过任何训练和参数选择的测试集或者用嵌套交叉验证。Weka 的 Test Options 面板里提供了Use training set、Supplied test set、Cross-validation、Percentage split四种模式实验默认选的是十折这个选择是对的。4.2 从混淆矩阵看类别混淆的集中区域只看准确率会忽略一个重要信息错误到底发生在哪些类别之间。三个模型混淆矩阵里的错误模式非常一致setosa完全没有被分错错误几乎都发生在versicolor和virginica之间。原因是 setosa 的花瓣长度和宽度明显偏小和另外两类在特征空间里线性可分而后两者的特征分布有重叠边界不那么清晰。以 LibSVM 为例混淆矩阵中约 2 个 versicolor 被误判成 virginica3 个 virginica 被误判成 versicolor。C4.5 的错误分布略有不同有 1 个 versicolor 被误判成 setosa但主区域仍然是 versicolor 和 virginica 的交叉。这提示我们当模型在混淆矩阵的某个子矩阵出现集中错误时单纯调参很难解决问题更好的做法是增加这两个类别的样本量或者构造花瓣宽度比例之类的组合特征。4.3 P、R、ROC 的含义与命令行复现Weka 输出里的 P 是精确率R 是召回率ROC 面积则代表模型把正例排到负例前面的能力。ROC 面积接近 1说明模型的排序能力很强接近随机时是 0.5。在 iris 上朴素贝叶斯的 ROC 面积达到 0.994甚至高于 LibSVM 的 0.975这说明虽然它准确率略低但概率输出的排序质量最高。要复现这些指标可以不用打开 GUI直接用命令行跑一次java -cp weka.jar weka.classifiers.functions.LibSVM \ -S 0 -K 2 -D 3 -G 0.0 -R 0.0 -N 0.5 -M 40.0 -C 1.0 -E 0.001 \ -t data/iris.arff -x 10 -i加-i参数后Weka 会在输出准确率的同时打印每个类别的 TP Rate、FP Rate、Precision、Recall、F-Measure、MCC 和 ROC Area。这里的-t指定训练数据-x 10表示十折交叉验证。如果已经有了独立测试集可以加上-T参数指定测试文件让模型在训练集上学习并在测试集上输出指标。5. 进阶用命令行把 Weka 分类实验脚本化5.1 批量跑多个分类器GUI 适合交互式探索但一旦需要对比多个算法、多组参数手工点击 Start 就太低效了。一个更工程化的方式是在 shell 里写循环把每个分类器的运行结果追加到日志文件之后用 grep 提取关键指标。mkdir -p results for classif in weka.classifiers.functions.LibSVM weka.classifiers.trees.J48 weka.classifiers.bayes.NaiveBayes; do echo $classif results/compare.txt java -cp weka.jar $classif -t data/iris.arff -x 10 -i results/compare.txt 21 done把类名放进变量后同一个循环可以统一处理不同算法。注意LibSVM需要先安装包否则会报ClassNotFoundException。在脚本末尾用grep Correctly Classified results/compare.txt就能快速总览准确率。如果后面再接入不同的测试集建议把-T参数也写进循环让输出文件路径包含数据集名避免相互覆盖。5.2 自动搜索最优参数调参最朴素的做法是自己改参数但更好的做法是交给 Weka 的元分类器CVParameterSelection。比如对 J48 搜索置信度阈值和最小叶子节点数java -cp weka.jar weka.classifiers.meta.CVParameterSelection \ -P C 0.1 0.5 5 \ -P M 1 4 2 \ -W weka.classifiers.trees.J48 \ -- -t data/iris.arff -x 10-P C 0.1 0.5 5表示在 0.1 到 0.5 之间取 5 个网格点-P M 1 4 2表示在 1 到 4 之间取 2 个点但实际步长会按数值类型处理。运行后会输出在交叉验证下表现最好的一组参数。需要留意这里搜索的每个参数都作用于-W指定的分类器--之前的选项属于 CVParameterSelection--之后的选项传给基础分类器。如果图形界面可用也可以直接在 Classify 面板选择meta CVParameterSelection再通过属性列表配置网格。5.3 保存和复用模型训练结束不代表任务结束生产环境里更常碰到的问题是如何把模型保存下来等新数据到达时直接预测。Weka 命令行提供了-d保存模型、-l加载模型java -cp weka.jar weka.classifiers.trees.J48 \ -C 0.25 -M 2 -t data/iris.arff -d j48.model java -cp weka.jar weka.classifiers.trees.J48 \ -l j48.model -T data/iris_test.arff -i第一行训练模型并写入j48.model第二行加载模型并用独立的测试文件计算指标。这里最容易忽略的是模型文件里保存的是训练时的属性结构和类别顺序测试数据必须和它保持一致否则数值列错位或类别名变更都会导致预测失败。另一个实用技巧是加载模型时如果只加-T不加-i输出只有每行的预测结果适合接下游处理加上-i才能得到完整的评估指标。在模型正式上线前我都会用-i检查一遍测试集上的精确率和召回率再用不带-i的方式生成批量预测结果。本文还有配套的精品资源点击获取