使用weka进行数据挖掘

Posted Maggie张张

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用weka进行数据挖掘相关的知识,希望对你有一定的参考价值。

weka参考教程:

http://wenku.baidu.com/link?url=uKstwSTwVK8bn8EqAUElOhkgEZUQDPJbIpOAbTm65JFcJdgAVKVGePetXLikzUl9GB__VPUAfmD7CbQ_kT9XI3_49mwJjM1S4llBDxlMoAa

首先,本次数据挖掘的使用的数据集是从UCI机器学习知识库中下载的car evaluation,下载地址:

http://archive.ics.uci.edu/ml/

一、将下载好的格式转化为weka可以处理的arff格式

下载好之后文件的大小格式如下图

可以先用MATLAB打开这几个文件看一下里面是什么内容,car.c45-names是以c4.5格式存储的姓名文件,里面包含属性取值和类别。car.names是说明文档,car.data是数据。

怎样把car.data变成weka可以处理的arff文件呢? 首先把car.data改后缀名变成car.csv,然后在weka -> Explorer -> Open file打开csv文件另存为arff文件就可以了。一开始我在data文件里面加入了这么几句话:

我添加了@语句,但是用excel打开csv文件后发现它是这样的:

然后在weka -> Explorer -> Open file的时候出现了错误:

我认为是我的CSV文件出现了错误,于是我打开了weka安装包下data文件夹里的任意一个arff文件,在weka里打开后另存为csv文件,看看人家的csv是怎么写的,发现不需要添加@语句,直接把.data文件改后缀名就可以了,然后用excel打开csv之后在第一行加上各个属性的名字就OK了。

这样子呢,就完成了weka可以打开的csv文件,然后另存为arff文件就可以了。

二、数据预处理


可以看到,这个数据集中共有1728个样本,加上类别属性共有7个属性。buying(购买价格),maint(维修价格),doors(车有几个门),persons(能容纳几个人),lug_boot(行李箱大小),safety(安全性),class(类别标签)。每一个属性都是标称类型(Nominal),都是离散的。

看一下可视化区域的直方图代表什么意思:点击class属性,看到蓝色、红色、淡蓝色、灰色分别代表uacc, acc, v-good, good.再点击任意一个非类别属性,比如上一张图的buying属性,四个矩形分别表示v-high, high, med, low. 所以说每一个矩形中不同的颜色表示在当前属性的某一个取值下各个类别所占的比例。某一个取值下的类别越纯,代表这个属性越能把这一类与其它类分开。

三、数据分类

classifier选择J48(C4.5),Test Options选择十折交叉验证, start

我尝试了一下,SVM是最好的(93.75%),决策树C4.5,kNN,随机森林的正确率都在91%以上,但是Adaboost,Bagging,最近邻,朴素贝叶斯的正确率都比较低。

四、结果分析

首先,实验使用十折交叉验证的方法,交叉验证的思想前一篇文章中提到了。classifier output中,首先,画出了一棵树,在result list中visualize tree可以看到可视化的树

可以看出,树的根节点选择了safety属性,说明safety的信息增益率最大,以它做分裂结点能得到更纯的子结点。接下来,分裂结点选择的属性依次是persons, buying, maint, lug_boot, doors.

正确分类的样例:1596个,占92.36%,错误分类的样例:132个,占7.64%。

Kappa Statistic = 0.8343:用于评判分类器的分类结果和随机分类的差异度。K=1表示分类结 果完全与随机分类结果相异(理想情况),K=0表示分类结果与随机分类相同(表示分类器没有效果),K=-1表示分类结果比随机分类还要差。所以K越接近于1越好。

Mean absolute error = 0.0421:平均绝对差用于评判预测标签和实际标签之间的差异度。MAE = 1/n *SUM ( f(i) - y(i) ) | i <=n   f(i)是分类器的预测值,y(i)是实际值。

Root mean squared error = 0.17181:均方根误差,是预测标签与真实标签偏差的平方和与测试样本数n比值的平方根。它可以很好的反映预测的精密度,值越小,说明预测越精密。

                              

Relative absolute error = 18.3833% 和 Root relative squared error=50.8176%:值越小实验越准确。

              
                        

Total Number of Instances = 1728:总的样本数。


对于class是unacc来说,

TP:预测结果是unacc,真实标签也是unacc,

FP:预测结果是unacc,真实标签不是unacc,

(另外还有TN,True Negative 和 FN,False Negative,分别表示假正元比率和假假元比率)

TP rate(True Positive): 决定了一个分类器或者一个诊断测试在所有阳性样本中能正确区分的阳性案例的性能,

FP rate(False Positive): 决定了在所有阴性的样本中有多少假阳性的判断。

  真实值 
  pn
预测输出p`     真阳性假阳性
 n`假阴性真阴性

Precision:精确率,TP / ( TP + FP),真正元在被分为是正元之中所占的比例,

Recall:召回率,TP / ( TP + FN),真正元在所有被准确分类的元中所占的比例,

F-measure:F值是precision和recall之间的调和平均,因为P和R之间往往有此消彼长的关系,如果你想识别出更多的unacc,则FP值会增加,precision会降低,而如果想让误判的结果少一些,使召回率增高,那么识别出的unacc往往会减少,使得精确率降低。

                                 

ROC Area:ROC曲线将FP rate和TP rate定义为x 轴和y 轴,因此ROC曲线描述了真阳性(获利)和假阳性(成本)之间的博弈。每一个预测结果在ROC曲线中以一个点代表。ROC area就是ROC曲线下面的面积。可以在result list里选择visualize threshold curve看每一类别(unacc, acc, good, v-good)的ROC曲线

每一个点代表每一次预测中FPR下相应的TPR值。


以上是关于使用weka进行数据挖掘的主要内容,如果未能解决你的问题,请参考以下文章

如何从多类分类的混淆矩阵中提取假阳性、假阴性

Python计算医疗数据训练集测试集的对应的临床特征:训练集(测试集)的阴性和阳性的样本个数连续变量的均值(标准差)以及训练测试集阳性阴性的p值离散变量的分类统计比率训练测试集阳性阴性的p值

有没有办法用已知的真阳性、真阴性、假阳性和假阴性来绘制混淆矩阵?

生信代码:机器学习-模型评价

Python深度学习之路-3.1性能评价指标

Python深度学习之路-3.1性能评价指标