一、决策树原理概述

  • 决策树通过把样本实例从根节点排列到某个叶子节点来对其进行分类。 树上的每个非叶子节点代表对一个属性取值的测试,其分支就代表测试的每个结果;而树上的每个叶子节点均代表一个分类的类别, 树的最高层节点是根节点。
  • 简单地说, 决策树就是一个类似流程图的树形结构, 采用自顶向下的递归方式, 从树的根节点开始, 在它的内部节点上进行属性值的测试比较, 然后按照给定实例的属性值确定对应的分支, 最后在决策树的叶子节点得到结论。 这个过程在以新的节点为根的子树上重复。

决策树算法

1、ID3算法
熵定义:类别越多熵越大(越混乱)

信息熵就是一组数据包含的信息,概率的度量。一组数据越有序信息熵也就越低,极端时如果一组数据中只有一个非0,其它都是0,那么熵等于0,因为只有可能是这个非0的情况发生,它给人们的信息已经确定了,或者说不含有任何信息了,因为信息熵含量为0。一组数据越无序信息熵也就越高,极端时如果一组数据均匀分布,那么它的熵最大,因为我们不知道那种情况发生的概率大些。假如一组数据由{d1,d2,…,dn}构成,其和是sum,那么求信息熵的公式是:
分类预测算法属于有指导学习,方法是通过训练数据,按照参考属性对目标属性的依赖程度对参考属性分级别处理,这种分级别处理体现在创建决策树,目的是通过生成的判别树,产生规则,用来判断以后的数据。以如下数据为例:

共14条记录,目标属性是,是否买电脑,共有两个情况,yes或者no。参考属性有4种情况,分别是,age,income,student,credit_rating。属性age有3种取值情况,分别是,youth,middle_aged,senior,属性income有3种取值情况,分别是,high,medium,low,属性student有2种取值情况,分别是,no,yes,属性credit_rating有2种取值情况,分别是fair,excellent。
1、我们先求参考属性的信息熵:参考属性=class:buy-computer

式中的5表示5个no,9表示9个yes,14是总的记录数
2、接下来我们求各个参考属性在取各自的值对应目标属性的信息熵,以属性age为例,有3种取值情况,分别是youth,middle_aged,senior,先考虑youth,youth共出现5次,3次no,2次yes,于是信息熵:

类似得到middle_aged和senior的信息熵,分别是:0和0.971。整个属性age的信息熵应该是它们的加权平均值

信息增益:

下面引入信息增益(information gain)这个概念,用Gain(D)表示,该概念是指信息熵的有效减少量,该量越高,表明目标属性在该参考属性那失去的信息熵越多,那么该属性越应该在决策树的上层(如果不好理解,可以用极限的方法,即假如在age属性上,当为youth时全部是on,当为middle时也全部是no,当为senior时全部是yes,那么Hage(D)=0)。

类似可以求出Gain(income)=0.029,Gain(stduent)=0.151,Gain(credit_rating)=0.048。**最大值为Gain(age),**所以首先按照参考属性age,将数据分为3类,如下:

然后分别按照上面的方法递归的分类。递归终止的条件是,1,当分到某类时,目标属性全是一个值,如这里当年龄取middle_aged时,目标属性全是yes。2,当分到某类时,某个值的比例达到了给定的阈值,如这里当年龄取youth时,有60%的是no,当然实际的阈值远远大于60%。

2、C4.5算法

信息增益选择方法有一个很大的缺陷,它总是会倾向于选择属性值多的属性,如果我们在上面的数据记录中加一个姓名属性,假设14条记录中的每个人姓名不同,那么信息增益就会选择姓名作为最佳属性,因为按姓名分裂后,每个组只包含一条记录,而每个记录只属于一类(要么购买电脑要么不购买),因此纯度最高,以姓名作为测试分裂的结点下面有14个分支。但是这样的分类没有意义,它没有任何泛化能力。增益比率对此进行了改进,它引入一个分裂信息:info=上面的H()

增益比率定义为信息增益与分裂信息的比率:

我们找GainRatio最大的属性作为最佳分裂属性。如果一个属性的取值很多,那么SplitInfoR(D)会大,从而使GainRatio®变小。不过增益比率也有缺点,SplitInfo(D)可能取0,此时没有计算意义;且当SplitInfo(D)趋向于0时,GainRatio®的值变得不可信,改进的措施就是在分母加一个平滑,这里加一个所有分裂信息的平均值:

决策树优缺点

优点

  • 决策树易于理解和实现。 人们在通过解释后都有能力去理解决策树所表达的意义。
  • 对于决策树,数据的准备往往是简单或者是不必要的。其他的技术往往要求先把数据归一化,比如去掉多余的或者空白的属性。
  • 能够同时处理数据型和常规型属性。 其他的技术往往要求数据属性的单一。
  • 是一个白盒模型。如果给定一个观察的模型,那么根据所产生的决策树很容易推出相应的逻辑表达式。

缺点

  • 对于各类别样本数量不一致的数据,在决策树当中信息增益的结果偏向于那些具有更多数值的特征。
  • 决策树内部节点的判别具有明确性,这种明确性可能会带来误导。

常见决策树:生活中问几个问题来判断一个事件。

二、随机森林概述

Bootstrap抽样(有放回的抽样)

Bagging算法介绍


因为样本有重复,所以训练集生成的决策树有重复,因此输出的测试类型有重复。

随机森林算法

案例分析


一、决策树-乳腺癌诊断
1、使用数据介绍:data.m
1:良性;2:恶性

2、训练集和测试集划分
因为第一列是样本编号,其实用处不大,将第二列500个作为训练集,69个作为测试集,第三列到最后共30列数据中的500个作为训练集,69个作为测试集。

%% I. 清空环境变量
clear all
clc
warning off  % 警示信息不再显示%% II. 导入数据
load data.mat%%
% 1. 随机产生训练集/测试集
a = randperm(569);
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);


3、创建并查看决策树


%% III. 创建决策树分类器  行代表样本,列是属性变量,同支持向量机
ctree = ClassificationTree.fit(P_train,T_train);%%
% 1. 查看决策树视图
view(ctree);
view(ctree,'mode','graph');

x21表示第21个变量,即P_train的第21列

4、仿真测试
将P_test:6930变成T_sim:691.

%% IV. 仿真测试
T_sim = predict(ctree,P_test);


5、结果分析

%% V. 结果分析
count_B = length(find(T_train == 1));  %312,500训练集中1类别的个数
count_M = length(find(T_train == 2));  %188
rate_B = count_B / 500;  % 训练集中1类别的比例 0.6240
rate_M = count_M / 500;  %0.3760
total_B = length(find(data(:,2) == 1));  %357,569总样本1类别的个数
total_M = length(find(data(:,2) == 2));   %212
number_B = length(find(T_test == 1));  %45
number_M = length(find(T_test == 2));  %24
number_B_sim = length(find(T_sim == 1 & T_test == 1));  %1类型预测正确个数 40
number_M_sim = length(find(T_sim == 2 & T_test == 2));   %23
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) '%']);
disp(['恶性乳腺肿瘤确诊:' num2str(number_M_sim)...'  误诊:' num2str(number_M - number_M_sim)...'  确诊率p2=' num2str(number_M_sim/number_M*100) '%']);


6、解决过拟合问题来限制生长

知识点补充:1、logspace()函数

logscape函数是用来创建指数等差数列,语法描述如下:
logspace(x1,x2)——在从10^x1 ~ 10^x2 区间内生成含有50个元素的等差数列
logspace(x1,x2,n)——在从10^x1~10^x2区间内生成含有n个元素的等差数列
指数等差数列指的是指数部分是一个等差数列:

知识点补充:2、numel()函数

6.1 最小样本误差
%% VI. 叶子节点含有的最小样本数对决策树性能的影响
leafs = logspace(1,2,10);  % 探索10-100个样本的情况N = numel(leafs);err = zeros(N,1);  %10行1列的零向量
for n = 1:Nt = ClassificationTree.fit(P_train,T_train,'crossval','on','minleaf',leafs(n));err(n) = kfoldLoss(t);
end
plot(leafs,err);
xlabel('叶子节点含有的最小样本数');
ylabel('交叉验证误差');
title('叶子节点含有的最小样本数对决策树性能的影响')


通过放大观看,发现样本数为13的时候,误差最小。

因此设置最小样本数为13.

%% VII. 设置minleaf为13,产生优化决策树
OptimalTree = ClassificationTree.fit(P_train,T_train,'minleaf',13);
view(OptimalTree,'mode','graph')


通过优化误差达到限制生长

7、比较性能,是否优化更好

%%
% 1. 计算优化后决策树的重采样误差和交叉验证误差
resubOpt = resubLoss(OptimalTree)
lossOpt = kfoldLoss(crossval(OptimalTree))%%
% 2. 计算优化前决策树的重采样误差和交叉验证误差
resubDefault = resubLoss(ctree)
lossDefault = kfoldLoss(crossval(ctree))


虽然重采样增大了,但是交叉验证误差减小了。

结果也发现,误差相较不大,但是大大减少了运行时间了和复杂度。

6.2、剪枝


%% VIII. 剪枝
[~,~,~,bestlevel] = cvLoss(ctree,'subtrees','all','treesize','min')  %4
cptree = prune(ctree,'Level',bestlevel);
view(cptree,'mode','graph')%%
% 1. 计算剪枝后决策树的重采样误差和交叉验证误差
resubPrune = resubLoss(cptree)
lossPrune = kfoldLoss(crossval(cptree))




综上所述:无论是限制样本数还是裁剪都对性能上的提升不是很明显,但是对树的结构有较大的改变。

二、随机森林-乳腺癌诊断
1—2 同上面决策树,数据一样,划分一样

3、创建随机森林分类器
注意需要用到第三方的包(随机森林工具箱)randomforest-matlab,方法就是将这个文件夹添加到matlab的路径中间去,然后调用即可。
下载地址

知识点补充function model = classRF_train(X,Y,ntree,mtry, extra_options)
需要2个参数,其余3个是可选的;
X: data matrix
Y: target values
ntree (optional): number of trees (default is 500). also if set to 0 will default to 500 ntree(可选):树数(默认为500)。 如果设置为0将默认为500
mtry (default is floor(sqrt(size(X,2))) D=number of features in X). also if set to 0 will default to 500 mtry(默认值为floor(sqrt(size(X,2)))D = X中的要素数量)。 同样如果设置为0将默认为500

%% III. 创建随机森林分类器
model = classRF_train(P_train,T_train);

默认生成500个树节点。

4、仿真预测

%% IV. 仿真测试
[T_sim,votes] = classRF_predict(P_test,model);

因为默认是500,所以类别1+类别2=500,谁占的多就选择谁

5、结果打印-同决策树

%% V. 结果分析
count_B = length(find(T_train == 1));
count_M = length(find(T_train == 2));
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) '%']);
disp(['恶性乳腺肿瘤确诊:' num2str(number_M_sim)...'  误诊:' num2str(number_M - number_M_sim)...'  确诊率p2=' num2str(number_M_sim/number_M*100) '%']);


可观察,结果比决策树好。

6、绘图
将类别1作为x,类别2作为y,x+y=500

%% VI. 绘图
figureindex = find(T_sim ~= T_test);  %求出预测值和真实值不一样的索引 【43;54】
plot(votes(index,1),votes(index,2),'r*')  %(498,2)(169,331)
hold onindex = find(T_sim == T_test);
plot(votes(index,1),votes(index,2),'bo')
hold onlegend('错误分类样本','正确分类样本')plot(0:500,500:-1:0,'r-.') %所有点在x+y=500上面
hold onplot(0:500,0:500,'r-.')
hold online([100 400 400 100 100],[100 100 400 400 100])  %方框范围内表示投票比较接近,容易犯错,框内越多模型越不好xlabel('输出为类别1的决策树棵数')
ylabel('输出为类别2的决策树棵数')
title('随机森林分类器性能分析')

7、棵树对结果的影响

Accuracy = zeros(1,20);  %1行20列的零向量
for i = 50:50:1000  %20个区间段i%每种情况,运行100次,取平均值accuracy = zeros(1,100);for k = 1:100% 创建随机森林model = classRF_train(P_train,T_train,i);% 仿真测试T_sim = classRF_predict(P_test,model);accuracy(k) = length(find(T_sim == T_test)) / length(T_test);endAccuracy(i/50) = mean(accuracy);
end
%%
%  绘图
figure
plot(50:50:1000,Accuracy)
xlabel('随机森林中决策树棵数')
ylabel('分类正确率')
title('随机森林中决策树棵数对性能的影响')


发现100是精度最高。

model = classRF_train(P_train,T_train,100);%% IV. 仿真测试
[T_sim,votes] = classRF_predict(P_test,model);%% V. 结果分析
count_B = length(find(T_train == 1));
count_M = length(find(T_train == 2));
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) '%']);
disp(['恶性乳腺肿瘤确诊:' num2str(number_M_sim)...'  误诊:' num2str(number_M - number_M_sim)...'  确诊率p2=' num2str(number_M_sim/number_M*100) '%']);


在良性上明显提高了,但是恶性有点下降。

第八课 决策树和随机森林相关推荐

  1. 第二课 决策树与随机森林

    本系列是七月算法机器学习课程笔记 文章目录 1 从LR到决策树 1.1 决策树 1.2 决策树的终止条件 1.3 决策树划分依据 1.3.1 信息熵 1.3.2 信息增益 1.3.3 ID3模型 1. ...

  2. Python数据分析与机器学习实战<八>决策树、随机森林

    目录 决策树原理概述 树模型 决策树 树的组成 决策树的训练和测试 选择节点(即如何进行特征划分?) 衡量标准---熵 公式: Pi为取到某个类别的概率​ 熵的图像 如何决策一个节点的选择? 决策树构 ...

  3. 机器学习(八)KNN,SVM,朴素贝叶斯,决策树与随机森林

    机器学习(八)KNN,SVM,朴素贝叶斯,决策树与随机森林 参考: https://zhuanlan.zhihu.com/p/61341071 1.KNN-K最近邻(K-Nearest Neighbo ...

  4. 十一、决策树和随机森林

    这门课和另一门课内容都差不多,可以参考七.决策树算法和集成算法该篇博文. 一.决策树相关概念 逻辑回归本质 逻辑回归:线性有监督分类模型.常用求解二分类问题,要么是A类别要么是B类别,一般会以0.5作 ...

  5. [机器学习]京东机器学习类图书畅销原因分析-决策树或随机森林

    一. 问题描述 机器学习图书畅销原因分析 二. 分析问题的过程与步骤 1.在京东网站上爬取3000条关于机器学习类书籍的数据. 爬虫代码可以看这里 爬完结果如下 2. 数据预处理 去掉特殊字符 一些看 ...

  6. sklearn分类算法(逻辑回归、朴素贝叶斯、K近邻、支持向量机 、决策树、随机森林 )的使用

    scikit-learn机器学习的分类算法包括逻辑回归.朴素贝叶斯.KNN.支持向量机.决策树和随机森林等.这些模块的调用形式基本一致,训练用fit方法,预测用predict方法.用joblib.du ...

  7. 使用泰坦尼克号数据进行决策树、随机森林

    使用泰坦尼克号数据进行决策树.随机森林 决策树分类器 随机森林 决策树分类器 sklearn.tree.DecisionTreeClassifier(criterion='gini',max_dept ...

  8. 独家 | 决策树VS随机森林——应该使用哪种算法?(附代码链接)

    作者:Abhishek Sharma 翻译:陈超 校对:丁楠雅 本文长度为4600字,建议阅读20分钟 本文以银行贷款数据为案例,对是否批准顾客贷款申请的决策过程进行了算法构建,并对比了决策树与随机森 ...

  9. ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)

    ML之回归预测:利用十类机器学习算法(线性回归.kNN.SVM.决策树.随机森林.极端随机树.SGD.提升树.LightGBM.XGBoost)对波士顿数据集[13+1,506]回归预测(模型评估.推 ...

最新文章

  1. 用正则表达式判断一个二进制数是否能被3整除
  2. STM32 进阶教程 15 - 串口DMA收发
  3. 一阶电路误差分析_读图学电路原理为什么交流调理电路会产生滞后,直流偏置又是什么...
  4. Redis Cluster原理初步
  5. [react] 高阶组件(HOC)有哪些优点和缺点?
  6. 无法加载_Microsoft store应用商店无法加载 问题解决
  7. python cpk计算器_Python进行CPK计算
  8. 计算机的高级应用office,MS Office高级应用
  9. instsrv.exe和srvany.exe将.exe文件注册为windows服务
  10. Layui的下拉框样式失效问题
  11. 怎么创建css样式表,怎样创建可反复使用的外部CSS样式表?
  12. 使用JS获取当前地理位置方法汇总
  13. 【Driver Booster 9 PRO】 驱动更新工具 提升游戏性能
  14. 安装opencv时出现PEP517问题解决
  15. 生成长微博(文转图)方法
  16. NandFlash和iNand
  17. appstore收入分析及策略类游戏的战斗设计
  18. 【论文阅读】——Spons Shields: Practical Isolation for Trusted Execution
  19. 不同转子磁链观测器观测性能比较
  20. 泡妞与23种设计模式(转)

热门文章

  1. 一键复制工具怎么用?电脑上可以一键复制的工具
  2. clover正常的安装完成后,进入系统会出现死循环,AMFI:Denying core dump for pid *** too many corpses being created
  3. 20145209 《信息安全系统设计基础》第13周学习总结
  4. 英文阅读必备——说说那些翻译软件
  5. 安卓自定义View的状态保存与恢复
  6. 红米2移动4G版_标注:2014112_官方线刷包_救砖包_解账户锁
  7. 用计算机能开通余利宝吗,余利宝是什么怎么开通 余利宝开通使用方法教程详解...
  8. 兴奋氨基酸有什么影响?
  9. 吉利牵手电信,无人驾驶时代的另类选择
  10. 动态规划(一)LCS