一、实验目的
通过本实验系统掌握分类内容,了解决策树分类器的实验原理以及使用决策树进行分类的实验步骤。
二、实验内容
本实验的目标是识别大量黑白照片中的每一个矩形像素显示为英文字母表中的 26 个大写字母之一。提供2000组训练数据,包含16个数值属性和字母种类,利用这2000组训练数据构造决策树分类器,并预测给定的2000组测试数据的字母种类,与给定的测试集的字母种类进行比较给出测试集正确率。
三、实验要求
利用2000个训练数据,构造决策树分类器,预测2000个测试数据的类别,并给出测试集正确率的估计值及依据。
四、算法描述
决策树分类器是一种基于树状结构的分类算法,其本质是在数据集中找到一组规则,用于对新数据进行分类。决策树由根节点、分支节点和叶节点组成,其中根节点表示数据集中所有实例的特征属性集合,分支节点表示根节点的一个属性划分,叶节点表示分类结果。
在训练过程中,决策树分类器从训练集中获取数据,并根据属性值不同进行划分,然后对每个子集递归地执行相同的划分过程,直到满足停止条件为止。划分过程中使用了一些评估指标,例如信息增益和基尼指数,以选择最佳的特征进行划分。
使用决策树分类器进行预测时,将测试数据输入到树中,按照特征值寻找对应的路径,最终到达叶节点并输出分类结果。决策树分类器具有可解释性好和易于理解的优点,但也存在过拟合和错误分类的问题。因此,需要对决策树进行剪枝和调参等操作,以提高其分类效果。
五、调试过程及实验结果
剪枝前测试集的正确率为67.25%
剪枝后正确率为66.2%
六、关键代码
clc;clear;close;
% 训练集
Train_Data = xlsread("D:\hw2-letter\letter-recognition.xls",'训练集');
[~,Train_Label] = xlsread("D:\hw2-letter\letter-recognition.xls",'训练集','A1:A2000');
% 测试集
Test_Data = xlsread("D:\hw2-letter\letter-recognition.xls",'测试集');
[~,Test_Label] = xlsread("D:\hw2-letter\letter-recognition.xls",'测试集','A1:A2000');
% 构建决策树分类器模型
tree = fitctree(Train_Data,Train_Label);
% tree = ClassificationTree.fit(Train_Data,Train_Label);
view(tree);
view(tree,'mode','graph');
% 预测测试集的分类
tree_pre = predict(tree,Test_Data);
% 计算测试集的正确率
accuracy = sum(cell2mat(tree_pre) == cell2mat(Test_Label)) / numel(Test_Label);
disp(['测试集的正确率为:',num2str(accuracy)]);
% 优化前的决策树重采样误差和交叉验证误差
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')
% 剪枝后预测测试集的分类
treePrune_pre = predict(cptree,Test_Data);
% 计算测试集的正确率
accuracy = sum(cell2mat(treePrune_pre) == cell2mat(Test_Label)) / numel(Test_Label);
disp(['剪枝后的测试集的正确率为:',num2str(accuracy)]);
% 剪枝后决策树的重采样误差和交叉验证误差
resubPrune = resubLoss(cptree);
lossPrune = kfoldLoss(crossval(cptree));
disp(['剪枝后决策树的重采样误差:',num2str(resubPrune)]);
disp(['剪枝后决策树的交叉验证误差:',num2str(lossPrune)]);
七、总结
本实验预测测试集正确率的计算采用比较预测值和给定值对应行字母是否一致,将一致的次数相加除以2000的方式。决策树的重采样误差比交叉验证误差小,说明生成的树对训练集过拟合,尝试对树进行剪枝后交叉验证误差仍大于重采样误差。