决策树---MATLAB程序.docx
- 文档编号:4607
- 上传时间:2022-09-30
- 格式:DOCX
- 页数:4
- 大小:385.49KB
决策树---MATLAB程序.docx
《决策树---MATLAB程序.docx》由会员分享,可在线阅读,更多相关《决策树---MATLAB程序.docx(4页珍藏版)》请在冰豆网上搜索。
决策树简介
决策树---MATLAB程序
决策树是⼀种基本的分类与回归⽅法。
决策树模型呈树形结构,在分类问题中,表⽰基于特征对实例进⾏分类的过程。
它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。
其主要优点是模型具有可读性,分类速度快。
学习时,利⽤训练数据,根据损失函数最⼩化的原则建⽴决策树模型。
预测时,对新的数据利⽤决策树模型进⾏分类。
决策树学习通常包括三个步骤:
特征选择、决策树的⽣成和决策树的修剪。
⽤决策树分类,从根结点开始,对实例的某⼀特征进⾏测试,根据测试结果,将实例分配到其⼦结点;这时,每⼀个⼦结点对应着该特征的⼀个取值。
如此递归地对实例进⾏测试并分配,直⾄达到叶结点,最后将实例分到叶结点的类中。
简单地说,决策树就是⼀个类似流程图的树形结构,采⽤⾃顶向下的递归⽅式,从树的根节点开始,在它的内部节点上进⾏属性值的测试⽐较,然后按照给定实例的属性值确定对应的分⽀,最后在决策树的叶⼦节点得到结论。
这个过程在以新的节点为根的⼦树上重复。
直到所有新节点给出的结果⼀致或⾜以判断分类。
假设给定训练数据集:
学习的⽬标是根据给定的训练数据集构建⼀个决策树模型,使它能够对实例进⾏正确的分类。
决策树学习的算法通常是⼀个递归地选择最优特征,并根据该特征队训练数据进⾏分割,使得对各个⼦集有⼀个最好的分类的过程。
这⼀过程对应着特征空间的划分和决策树的构建。
⽣成的决策树可能对训练数据有很好的分类能⼒,但对未知的测试数据却未必有很好的分类能⼒,即可能发⽣过拟合现象。
需要对已
⽣成的树⾃上⽽下进⾏剪枝,将树变得更简单,从⽽使它具有更好的泛化能⼒。
具体地,就是去掉过于细分的叶结点,使其回退到⽗结点,甚⾄更⾼的结点,然后将⽗结点或更⾼的结点改为新的叶结点。
汽车特征评估质量
本次使⽤的是下载的⼀个包含汽车多个细节的数据集,包括车门数量、后备箱⼤⼩、维修成本、安全性能、载⼈数量等等,来确定⼀辆汽车的质量。
分类的⽬的是把车辆的质量分为4种类型:
不达标、达标、良好、优秀。
数据集的形式如图1所⽰,其中的每个值都可以看作成字符串。
本次考虑数据集中的6个属性,其取值范围是这样的:
购买价位:
取值范围是vhigh、high、med、low,分别代表很⾼、⾼、中等、低;维修成本:
取值范围是vhigh、high、med、low,分别代表很⾼、⾼、中等、低;车门数量:
取值范围是2、3、4、5、5more等;
载客数量:
取值范围是2、4、more等;
动⼒性能:
取值范围是small、med、big,分别代表⼩、中、⼤;安全性能:
取值范围是low、med、high,分别代表低、中、⾼
分类的结果,即汽车的质量取值范围是unacc、acc、good、vgood,分别代表不达标、达标、良好、优秀。
考虑到每⼀⾏都具有字符串属性,需要假设所有的特征均是字符串,并在次基础上建⽴分类器。
⾸先将数据集当中的所有字符串变为数字,⽅便后⾯的分类,由于下载的数据集为.data格式,matlab⽆法直接读取,已经转化为.xlsx格式,并且将vhigh、high、med、low分别替换为4、3、2、1,将small、med、big替换为1、2、3,将low、med、high替换为
1、2、3,将unacc、acc、good、vgood替换为1、2、3、4。
数据中共有1728组,随机从中取出1500组作为训练集,剩下的228组作为测试集。
使⽤训练集建⽴决策树,然后使⽤模型进⾏预测。
分
别根据决策树的结果计算出决策树中对车辆各种情况预测的正确率以及全部测试集预测的准确率。
然后对决策树进⾏修剪,对⽐起重采样误差以及交叉验证误差。
clearall;clc;
closeall;
%%导⼊数据
loadcar;
a=randperm(1728);
%训练集
Train_Data=data(a(p>Train_Label=data(a(p>
%测试集
Test_Data=data(a(1501:
1728),1:
6);Test_Label=data(a(1501:
1728),7);
%%创建决策树分类器
Tree=ClassificationTree.fit(Train_Data,Train_Label);
%%查看决策树视图
view(Tree);view(Tree,'mode','graph');
%%预测分类
Tree_pre=predict(Tree,Test_Data);
%%结果分析
count_train_1=length(find(Train_Label==1));%训练集中车辆质量不达标个数count_train_2=length(find(Train_Label==2));%训练集中车辆质量达标个数count_train_3=length(find(Train_Label==3));%训练集中车辆质量良好个数count_train_4=length(find(Train_Label==4));%训练集中车辆质量优秀个数
rate_train_1=count_train_1/1500;rate_train_2=count_train_2/1500;rate_train_3=count_train_3/1500;rate_train_4=count_train_4/1500;
训练%集中车辆质量不达标占的⽐例训练%集中车辆质量达标占的⽐例训练%集中车辆质量优良占的⽐例训练%集中车辆质量优秀占的⽐例
total_1=length(find(data(:
7)==1));%总数据中车辆质量不达标个数total_2=length(find(data(:
7)==2));%总数据中车辆质量达标个数total_3=length(find(data(:
7)==3));%总数据中车辆质量优良个数total_4=length(find(data(:
7)==4));%总数据中车辆质量优秀个数
count_test_1=length(find(Test_Label==1));%测试集中车辆质量不达标个数count_test_2=length(find(Test_Label==2));%测试集中车辆质量达标个数count_test_3=length(find(Test_Label==3));%测试集中车辆质量良好个数count_test_4=length(find(Test_Label==4));%测试集中车辆质量优秀个数
count_right_1=length(find(Tree_pre==1&Test_Label==1));count_right_2=length(find(Tree_pre==2&Test_Label==2));count_right_3=length(find(Tree_pre==3&Test_Label==3));count_right_4=length(find(Tree_pre==4&Test_Label==4));
测%试集中预测车辆质量不达标正确的个数测%试集中预测车辆质量达标正确的个数测%试集中预测车辆质量优良正确的个数测%试集中预测车辆质量优秀正确的个数
rate_right=(count_right_1+count_right_2+count_right_3+count_right_4)/228;
%%显⽰部分结果
disp(['车辆总数:
1728'...
不'达标:
'num2str(total_1)...达'标:
'num2str(total_2)...优'良:
'num2str(total_3)...优'秀:
'num2str(total_4)]);
disp(['训练集车辆数:
1500'...
不'达标:
'num2str(count_train_1)...达'标:
'num2str(count_train_2)...优'良:
'num2str(count_train_3)...优'秀:
'num2str(count_train_4)]);
disp(['测试集车辆数:
228'...
不'达标:
'num2str(count_test_1)...
不'达标:
'num2str(count_test_1)...达'标:
'num2str(count_test_2)...优'良:
'num2str(count_test_3)...优'秀:
'num2str(count_test_4)]);
disp(['决策树判断结果:
'...
不'达标正确率:
'sprintf('%2.2f%%',count_right_1/count_test_1*100)...达'标正确率:
'sprintf('%2.2f%%',count_right_2/count_test_2*100)...优'良正确率:
'sprintf('%2.2f%%',count_right_3/count_test_3*100)...优'秀正确率:
'sprintf('%2.2f%%',count_right_4/count_test_4*100)]);
disp(['总正确率:
'...
sprintf('%2.2f%%',rate_right*100)]);
%%优化前决策树的重采样误差和交叉验证误差resubDefault=resubLoss(Tree);
lossDefault=kfoldLoss(crossval(Tree));disp(['剪枝前决策树的重采样误差:
'...
num2str(resubDefault)]);
disp(['剪枝前决策树的交叉验证误差:
'...num2str(lossDefault)]);
%%剪枝
[~,~,~,bestlevel]=cvLoss(Tree,'subtrees','all','treesize','min');
cptree=prune(Tree,'Level',bestlevel);view(cptree,'mode','graph')
%%剪枝后决策树的重采样误差和交叉验证误差
resubPrune=resubLoss(cptree);lossPrune=kfoldLoss(crossval(cptree));
disp(['剪枝后决策树的重采样误差:
'...num2str(resubPrune)]);
disp(['剪枝后决策树的交叉验证误差:
'...num2str(resubPrune)]);
结果
车辆总数:
1728不达标:
1210达标:
384优良:
69优秀:
65
训练集车辆数:
1500不达标:
1046达标:
338优良:
56优秀:
60测试集车辆数:
228不达标:
164达标:
46优良:
13优秀:
5
决策树判断结果:
不达标正确率:
97.56%达标正确率:
95.65%优良正确率:
84.62%优秀正确率:
100.00%总正确率:
96.49%
剪枝前决策树的重采样误差:
0.026
剪枝前决策树的交叉验证误差:
0.048667剪枝后决策树的重采样误差:
0.026667剪枝后决策树的交叉验证误差:
0.0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 决策树 MATLAB 程序