决策树分类(DecisionTreeforClassification)
%% I. 清空环境变量
clear all
clc
warning off
%% II. 导⼊数据
load data.mat
%%
% 1. 随机产⽣训练集/测试集
%randperm是matlab函数,功能是随机打乱⼀个数字序列。其内的参数决定了随机数的范围。
a = randperm(569);
%data 是⼀个矩阵
%data(x,y) x是⾏数 y是列数
%训练集
Train = data(a(1:500),:);
%测试集
Test = data(a(501:end),:);
%%
江苏高考英语平均分
% 2. 训练数据
英语一国家线P_train = Train(:,3:end);
T_train = Train(:,2);
%%
% 3. 测试数据
P_test = Test(:,3:end);
T_test = Test(:,2);
%⽤于构造决策树的函数,分类树
%⽤于多类分类的⼆叉决策树
ctree = ClassificationTree.fit(P_train,T_train);
%view(t)%画出决策树
view(ctree);
view(ctree,'mode','graph');
%测试,利⽤分类树预测标签
T_sim = predict(ctree,P_test);
%% V. 结果分析
count_B = length(find(T_train ==1));
count_M = length(find(T_train ==2));
rate_B = count_B / 500;
rate_M = count_M / 500;
total_B = length(find(data(:,2)==1));
入党转正发言total_M = length(find(data(:,2)==2));
number_B = length(find(T_test ==1));
number_M = length(find(T_test ==2));
number_B_sim = length(find(T_sim ==1& T_test ==1));
number_M_sim = length(find(T_sim ==2& T_test ==2));
disp(['病例总数:' num2str(569)...
' 良性:' num2str(total_B)...
' 恶性:' num2str(total_M)]);
disp(['训练集病例总数:' num2str(500)...
' 良性:' num2str(count_B)...
' 恶性:' num2str(count_M)]);
disp(['测试集病例总数:' num2str(69)...
' 良性:' num2str(number_B)...
' 恶性:' num2str(number_M)]);
disp(['良性乳腺肿瘤确诊:' num2str(number_B_sim)...
' 误诊:' num2str(number_B - number_B_sim)...
' 确诊率p1=' num2str(number_B_sim/number_B*100)'%']);
' 确诊率p1=' num2str(number_B_sim/number_B*100)'%']);
disp(['恶性乳腺肿瘤确诊:' num2str(number_M_sim)...
' 误诊:' num2str(number_M - number_M_sim)...
' 确诊率p2=' num2str(number_M_sim/number_M*100)'%']);
%⽣成对数间距向量
%y = logspace(a,b,n)在10的幂10^a 和10^b(10 的 N 次幂)之间⽣成 n 个点。
leafs = logspace(1,2,10);
%n = numel(A)返回数组 A 中的元素数⽬ n 等同于 prod(size(A))。
N = numel(leafs);
%zeros(2,3)将返回⼀个2×3 矩阵,全零
err = zeros(N,1);
for n =1:N
t = ClassificationTree.fit(P_train,T_train,'crossval','on','minleaf',leafs(n));
err(n)= kfoldLoss(t);
end
%绘制figure1
%plot(X,Y)创建 Y 中数据对 X 中对应值的⼆维线图。
criminal什么意思
plot(leafs,err);
xlabel('叶⼦节点含有的最⼩样本数');
ylabel('交叉验证误差');
title('叶⼦节点含有的最⼩样本数对决策树性能的影响')
pearl harbourOptimalTree = ClassificationTree.fit(P_train,T_train,'minleaf',13);
view(OptimalTree,'mode','graph')
%计算OptimalTree中有⽆交互项的再替代分类损失
resubOpt = resubLoss(OptimalTree)
%crossval 使⽤交叉验证估计损失
%kfoldLoss 交叉验证分类模型的分类损失
罐头 英文lossOpt = kfoldLoss(crossval(OptimalTree))
resubDefault = resubLoss(ctree)
ipcclossDefault = kfoldLoss(crossval(ctree))
%%剪枝
汽车划痕修复%剪枝处理
morgana
%剪枝是决策树算法对付“过拟合”的主要⼿段,分⽀过多,对训练数
bunch%据的拟合很完美,但对测试数据则不⼀定,且效率较低。因此可主
%动去掉⼀些分⽀来降低过拟合的风险。剪枝处理包括预剪枝和后剪枝,分别对应着在决策树⽣成过程中/决策叔⽣成完毕后进⾏剪枝处理。%交叉验证回归误差
[~,~,~,bestlevel]= cvLoss(ctree,'subtrees','all','treesize','min')
%t2=prune(t,'level','level'/'node')
%level:0 不剪枝1剪掉最后⼀层2最后两层
%node: 剪掉第node个分⽀后的所有
cptree = prune(ctree,'Level',bestlevel);
view(cptree,'mode','graph')
%%
% 计算剪枝后决策树的重采样误差和交叉验证误差
resubPrune = resubLoss(cptree)
lossPrune = kfoldLoss(crossval(cptree))