本文对决策树的皮毛进行一下探究,主要根据官方的两个网页进行简单的实现。本来想着在网上能找到比较容易上手的代码,结果发现大家都是大佬,自己写代码,咱也看不懂,还是乖乖地看matlab官网吧。
1.fitctree
以下关于ficctree的内容基于Fit binary decision tree for multiclass classification,主要介绍分类树的训练和深度设置、优化。
1.1 Train Classification Tree
以下代码使用35134的X和3511的Y训练一个分类树,Y包括2类标签。
load ionosphere % 导入X和Y变量
Mdl = fitctree(X,Y)% Mdl包含分类树的信息
tabulate(Y)% 查看标签的情况
1.2 Control Tree Depth
可以使用MaxNumSplits,MinLeafSize或MinParentSize名称-值对参数来控制树的深度。在默认情况下,fitctree将生成较深的决策树。可以设置较浅的树,以减少模型复杂性或计算时间。
load ionosphere %导入数据集
%使用树深度控制的默认值训练分类树。交叉验证模型使用10倍交叉验证。
rng(1); % For reproducibility
MdlDefault = fitctree(X,Y,'CrossVal','on');
% 画一个柱状图,表示树被分割的数量,平均分割的次数大约是15次。
numBranches = @(x)sum(x.IsBranch);
mdlDefaultNumSplits = cellfun(numBranches, MdlDefault.Trained);
figure;
histogram(mdlDefaultNumSplits)
% 另外,看看其中一棵树。
view(MdlDefault.Trained{1},'Mode','graph')
如果想要的分类树不像使用默认分割数训练的分类树那么复杂(深)。训练另一个分类树,但是将最大分割数设置为7,这大约是默认分类树平均分割数的一半。交叉验证模型使用10倍交叉验证。
Mdl7 = fitctree(X,Y,'MaxNumSplits',7,'CrossVal','on');
view(Mdl7.Trained{1},'Mode','graph')
% 比较两种模型的交叉验证分类误差,Mdl7要简单得多,性能只比MdlDefault差一点点
classErrorDefault = kfoldLoss(MdlDefault)
classError7 = kfoldLoss(Mdl7)
1.3 Optimize Classification Tree
这个例子展示了如何使用fitctree自动优化超参数,使用了Fisher的虹膜数据。
load fisheriris
% 优化分类器的交叉验证损失,利用meas中的数据预测物种的响应。
X = meas;
Y = species;
Mdl = fitctree(X,Y,'OptimizeHyperparameters','auto')
2.redict
以下部分基于Predict labels using classification tree的Examples内容
2.1 Predict Labels Using a Classification Tree
使用分类树进行标签预测(分类)
load fisheriris
% 训练集和测试集比例为1:1
n = size(meas,1);
rng(1) % For reproducibility
idxTrn = false(n,1);
idxTrn(randsample(n,round(0.5*n))) = true;
idxVal = idxTrn == false;
xtrain = meas(idxTrn,:);%训练样本
ytrain = species(idxTrn);%训练标签
xtest = meas(idxVal,:);%测试样本
ytest = species(idxVal);%测试标签
%使用训练集生成一个分类树
Mdl = fitctree(xtrain,ytrain);
% 预测验证数据的标签。
ypre = predict(Mdl,xtest);%分类结果
%验证准确度
accuracy = 1-sum(~strcmp(ypre,ytest))/numel(ypre)
2.2Estimate Class Posterior Probabilities Using a Classification Tree
使用分类树估计类后验概率,不想看了,有缘再见