使用J48来分析数据集
- 打开文件 glass,arff
- 检查可用的分类器
- 选择J48决策树学习器
- 运行
- 审查输出
- 查看正确分类的实例和the confusion matrix
打开glass.arff 检查可用的分类器
选择合适的分类器
Weka内置了很多分类器,我们选择决策树分类器:
点击Start就开始运行了:
稍等一会儿就得到了分类的结果:
Weka把整个分类的过程都进行了封装,所以整个过程十分简单,关键在于现在要理解运行之后得到的结果。
运行结果的分析
运行结果如下:
第一部分是数据集的一些信息:
=== Run information ===
Scheme:weka.classifiers.trees.J48 -C 0.25 -M 2
Relation: Glass
Instances: 214
Attributes: 10
RI
Na
Mg
Al
Si
K
Ca
Ba
Fe
Type
Test mode:10-fold cross-validation
实例和属性的数量
接下来是决策树的示意图:
=== Classifier model (full training set) ===
J48 pruned tree
------------------
Ba <= 0.27
| Mg <= 2.41
| | K <= 0.03
| | | Na <= 13.75: build wind non-float (3.0)
| | | Na > 13.75: tableware (9.0)
| | K > 0.03
| | | Na <= 13.49
| | | | RI <= 1.5241: containers (13.0/1.0)
| | | | RI > 1.5241: build wind non-float (3.0)
| | | Na > 13.49: build wind non-float (7.0/1.0)
| Mg > 2.41
| | Al <= 1.41
| | | RI <= 1.51707
| | | | RI <= 1.51596: build wind float (3.0)
| | | | RI > 1.51596
| | | | | Fe <= 0.12
| | | | | | Mg <= 3.54: vehic wind float (5.0)
| | | | | | Mg > 3.54
| | | | | | | RI <= 1.51667: build wind non-float (2.0)
| | | | | | | RI > 1.51667: vehic wind float (2.0)
| | | | | Fe > 0.12: build wind non-float (2.0)
| | | RI > 1.51707
| | | | K <= 0.23
| | | | | Mg <= 3.34: build wind non-float (2.0)
| | | | | Mg > 3.34
| | | | | | Si <= 72.64
| | | | | | | Na <= 14.01: build wind float (14.0)
| | | | | | | Na > 14.01
| | | | | | | | RI <= 1.52211
| | | | | | | | | Na <= 14.32: vehic wind float (3.0)
| | | | | | | | | Na > 14.32: build wind float (2.0)
| | | | | | | | RI > 1.52211: build wind float (3.0)
| | | | | | Si > 72.64: vehic wind float (3.0)
| | | | K > 0.23
| | | | | Mg <= 3.75
| | | | | | Fe <= 0.14
| | | | | | | RI <= 1.52043: build wind float (36.0)
| | | | | | | RI > 1.52043: build wind non-float (2.0/1.0)
| | | | | | Fe > 0.14
| | | | | | | Al <= 1.17: build wind non-float (5.0)
| | | | | | | Al > 1.17: build wind float (6.0/1.0)
| | | | | Mg > 3.75: build wind non-float (10.0)
| | Al > 1.41
| | | Si <= 72.49
| | | | Ca <= 8.28: build wind non-float (6.0)
| | | | Ca > 8.28: vehic wind float (5.0/1.0)
| | | Si > 72.49
| | | | RI <= 1.51732
| | | | | Fe <= 0.22: build wind non-float (30.0/1.0)
| | | | | Fe > 0.22
| | | | | | RI <= 1.51629: build wind float (2.0)
| | | | | | RI > 1.51629: build wind non-float (2.0)
| | | | RI > 1.51732
| | | | | RI <= 1.51789: build wind float (3.0)
| | | | | RI > 1.51789: build wind non-float (2.0)
Ba > 0.27
| Si <= 70.16: build wind non-float (2.0/1.0)
| Si > 70.16: headlamps (27.0/1.0)
Number of Leaves : 30
Size of the tree : 59
Time taken to build model: 0.01 seconds
这个树之后再解释,我们可以看到这棵树有30个叶子节点,59个节点
Number of Leaves : 30
Size of the tree : 59
接下来我们可以看到总结//:
=== Summary ===
Correctly Classified Instances 143 66.8224 %
Incorrectly Classified Instances 71 33.1776 %
Kappa statistic 0.55
Mean absolute error 0.1026
Root mean squared error 0.2897
Relative absolute error 48.4507 %
Root relative squared error 89.2727 %
Total Number of Instances 214
可以准确率为66.8%。
在窗口的最下面是混淆矩阵
=== Confusion Matrix ===
a b c d e f g <-- classified as
50 15 3 0 0 1 1 | a = build wind float
16 47 6 0 2 3 2 | b = build wind non-float
5 5 6 0 0 1 0 | c = vehic wind float
0 0 0 0 0 0 0 | d = vehic wind non-float
0 2 0 0 10 0 1 | e = containers
1 1 0 0 0 7 0 | f = tableware
3 2 0 0 0 1 23 | g = headlamps
行坐标表示被分类的实例正确的类型,纵坐标表示分类的结果。
例如:我们有7种不同的玻璃
矩阵第一行也就是类型为a的玻璃,看到:
a b c d e f g <-- classified as
50 15 3 0 0 1 1 | a = build wind float
分类器的分类结果50个实例的类别为a,是正确的分类,15个实例为b( build wind non-float)这是错误的分类。
这就是混淆矩阵,大部分实例都在对角线上,这是我们希望看到的结果(大部分都正确分类)。每个不在对角线上的实例都表示一个错误的分类结果。
配置分类器
点击选择的分类器进入配置面板。
这里不介绍所有的参数,我们以unpruned(pruned:剪枝)为例。
unpruned的默认值为false,也就以为着我们刚刚建立的是经过剪枝的决策树,我们可以把参数改为True重新运行。
我们可以看到这次得到的准确率为:
Correctly Classified Instances 144 67.2897 %
查看之前的运行数据:
Correctly Classified Instances 143 66.8224 %
===
TODO:
这里我自己有些问题:1. 剪枝应该不影响分类结果为什么准确度会不同
- 查看了树的规模(节点的个数),剪枝和不剪枝的规模为什么
===
接下来我们看下一个参数,minNumObj,表示每个叶节点所含实例的最少数量。
我们把默认的2改成15以得到更大的叶子节点。
我们回到之前的输出
括号里面有两个数字表示了这个叶子节点包含了两个值,这个叶子包含1个错误的分类实例和5个正确分类实例。
可以看到这些叶子节点只包含很少的实例,有的只含2、3个实例。
现在我们设置了叶子节点包含的最小的实例个数,重新运行:
J48 unpruned tree
------------------
Ba <= 0.27
| Mg <= 2.41
| | K <= 0.12: tableware (15.0/6.0)
| | K > 0.12: containers (20.0/8.0)
| Mg > 2.41
| | Al <= 1.41
| | | RI <= 1.51727: vehic wind float (16.0/9.0)
| | | RI > 1.51727
| | | | K <= 0.23: build wind float (27.0/8.0)
| | | | K > 0.23
| | | | | Mg <= 3.66: build wind float (41.0/5.0)
| | | | | Mg > 3.66: build wind non-float (16.0/3.0)
| | Al > 1.41: build wind non-float (50.0/10.0)
Ba > 0.27: headlamps (29.0/3.0)
Number of Leaves : 8
Size of the tree : 15
Time taken to build model: 0 seconds
=== Stratified cross-validation ===
=== Summary ===
Correctly Classified Instances 131 61.215 %
现在我们得到了一个61%的准确率和一个更小的决策树。
可视化决策树
右击输出结果,选择Visualize tree,得到一个可视化的决策树:
窗口太小,决策树的结构看不清,把窗口拉大 然后右击窗口,点击Fit to Screen:
这个可视化决策树和我们输出窗口中的是同一棵树,只是另外一种表示形式:
J48 unpruned tree
------------------
Ba <= 0.27
| Mg <= 2.41
| | K <= 0.12: tableware (15.0/6.0)
| | K > 0.12: containers (20.0/8.0)
| Mg > 2.41
| | Al <= 1.41
| | | RI <= 1.51727: vehic wind float (16.0/9.0)
| | | RI > 1.51727
| | | | K <= 0.23: build wind float (27.0/8.0)
| | | | K > 0.23
| | | | | Mg <= 3.66: build wind float (41.0/5.0)
| | | | | Mg > 3.66: build wind non-float (16.0/3.0)
| | Al > 1.41: build wind non-float (50.0/10.0)
Ba > 0.27: headlamps (29.0/3.0)
Number of Leaves : 8
Size of the tree : 15
在分类器配置面板当中的More,可以让你了解更多关于该分类器的信息,这对于你使用分类器是很有帮助的:
J48
决策树算法从ID3开始发展,在C4.8之后就商业化了,之前是开源的。
在Weka中使用了C4.5的最后一个版本(也就是C4.8),用JAVA重写了算法,所以称为J48
网友评论