发现使用决策树太方便了,之前不了解,吭呲吭呲的自己整了很多,matlab分分钟搞定,还清晰明了效果好;
需要根据大量数据进行分类或者设置阈值时,使用决策树太方便了。
源数据:提取了一些数据的特征值和类别,用来区分走路和不走了的状态,
数据格式[feature1, feature2, feature3, feature4, feature6, sign], sign为结果
代码:
A=importdata('.\DecisionTree\XYZ计步.txt'); % 导入数据
B=importdata('.\DecisionTree\XYZ不计步.txt');
TestA = importdata('.\DecisionTree\XYZ测试计步.txt');
TestB = importdata('.\DecisionTree\XYZ测试不计步.txt');
Train = [A;B];
% 训练数据
P_train = Train(:, 1:6);
T_train = Train(:,7);
% 测试数据
P_testA = TestA(:, 1:6);
P_testB = TestB(:, 1:6);
if 0 % 查看叶子节点含有的最小样本数对决策树性能的影响
leafs = logspace(1,2,10);
N = numel(leafs);
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
plot(leafs,err);
xlabel('叶子节点含有的最小样本数');
ylabel('交叉验证误差');
title('叶子节点含有的最小样本数对决策树性能的影响');
end
% 创建决策树分类器
if 1
ctree = ClassificationTree.fit(P_train, T_train);
view(ctree,'mode','graph');
T_sim = predict(ctree, P_testB);
end
if 0 % 设置minleaf为10,产生优化决策树
OptimalTree = ClassificationTree.fit(P_train, T_train,'minleaf', 10);
view(OptimalTree, 'mode','graph');
T_simA = predict(OptimalTree, P_testA);
T_simB = predict(OptimalTree, P_testB);
% 计算优化后的决策树的重带入误差和交叉验证误差
resubOpt = resubLoss(OptimalTree)
lossOpt = kfoldLoss(crossval(OptimalTree))
% 计算优化前决策树的重代入误差和交叉验证误差
resubDefault = resubLoss(ctree)
lossDefault = kfoldLoss(crossval(ctree))
end
决策树,树枝太多,不放图了。
交叉验证误差:叶子节点含有的最小样本数对决策树性能的影响
优化后的结果:选用最小叶子节点为10;
粗暴一点,选用最小叶子节点为100(下图);
叶子最小节点在100,误差在可以接受范围内,完美;