IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 决策树与随机森林 -> 正文阅读

[数据结构与算法]决策树与随机森林

决策树

简介

决策树算法以树状结构表示数据分类的结果。每个决策点实现一个具有离散输出的测试函数,记为分支。

f ( x ) = { 根 结 点 非 叶 子 节 点 ( 决 策 点 ) 叶 子 节 点 分 支 f(x)=\left\{ \begin{aligned} 根结点 \\ 非叶子节点(决策点) \\ 叶子节点 \\ 分支 \end{aligned} \right. f(x)=?????????????
在这里插入图片描述

P ( X , Y ) = P ( X ) ? P ( Y ) X P(X, Y)=P(X)^{*} P(Y) \quad X P(X,Y)=P(X)?P(Y)X 和Y两个事件相互独立 log ? ( X Y ) = log ? ( X ) + log ? ( Y ) \log (X Y)=\log (X)+\log (Y) log(XY)=log(X)+log(Y)
H ( X ) , H ( Y ) \mathrm{H}(\mathrm{X}), \mathrm{H}(\mathrm{Y}) H(X),H(Y) 当成它们发生的不确定性
P ( \mathrm{P}( P( 几率越大)- > H ( X ) >\mathrm{H}(\mathrm{X}) >H(X) 值越小 如:今天正常上课
P ( \mathrm{P}( P( 几率越小) ? > H ( X ) ->\mathrm{H}(\mathrm{X}) ?>H(X) 值越大 如:今天没翻车

= ? ∑ i = 1 n P i ln ? ( P i ) =-\sum_{i=1}^{n} P_{i} \ln \left(P_{i}\right) =?i=1n?Pi?ln(Pi?)
Gini系数 = Gini ? ( p ) = ∑ k = 1 K p k ( 1 ? p k ) = 1 ? ∑ k = 1 K p k 2 =\operatorname{Gini}(p)=\sum_{k=1}^{K} p_{k}\left(1-p_{k}\right)=1-\sum_{k=1}^{K} p_{k}^{2} =Gini(p)=k=1K?pk?(1?pk?)=1?k=1K?pk2?

根结点的选取

构造树的基本想法是随着树深度的增加,节点的嫡迅速地降低。嫡降低的速度越快越好,这样我们有望得到一棵高度最矮的决策树。

常用算法

ID3:信息增益
一般来讲,如果特征把N个样本划分成了m组,每组Nm个像本,则信息增益(不纯度减少量)为
Δ I ( N ) = I ( N ) ? ( P 1 I ( N 1 ) + P 2 I ( N 2 ) + ? + P m I ( N m ) ) ?其中,? P m = N m / N \begin{aligned} &\Delta I(N)=I(N)-\left(P_{1} I\left(N_{1}\right)+P_{2} I\left(N_{2}\right)+\cdots+P_{m} I\left(N_{m}\right)\right) \\ &\text { 其中, } P_{m}=N_{m} / N \end{aligned} ?ΔI(N)=I(N)?(P1?I(N1?)+P2?I(N2?)+?+Pm?I(Nm?))?其中,?Pm?=Nm?/N?
在属性很多,但样本又很少,就会导致信息增益偏大

C4.5: 信息增益率
还要计算信息增益自身的熵值
Δ I R ( N ) = Δ I ( N ) I ( N ) \Delta I_{R}(N)=\frac{\Delta I(N)}{I(N)} ΔIR?(N)=I(N)ΔI(N)?

Gini系数:
Gini不纯度度量,也称方差不纯度
I ( N ) = ∑ m ≠ n P ( ω m ) P ( ω n ) = 1 ? ∑ j = 1 k P 2 ( ω j ) I(N)=\sum_{m \neq n} P\left(\omega_{m}\right) P\left(\omega_{n}\right)=1-\sum_{j=1}^{k} P^{2}\left(\omega_{j}\right) I(N)=m?=n?P(ωm?)P(ωn?)=1?j=1k?P2(ωj?)
也有人采用所谓误差不纯度
I ( N ) = 1 ? max ? i P ( ω j ) I(N)=1-\max _{i} P\left(\omega_{j}\right) I(N)=1?imax?P(ωj?)
能够处理连续型的属性。首先将连续型属性离散化,把连续型属性的值分成不同的区间,依据是比较各个分裂点Gian值的大小。
缺失数据的考虑:在构建决策树时,可以简单地忽略缺失数据,即在计算增益时,仅考虑具有属性值的记录。

评价函数: C ( T ) = ∑ t ∈ ?aaf? N t ? H ( t ) C(T)=\sum_{t \in \text { aaf }} N_{t} \cdot H(t) \quad C(T)=t?aaf??Nt??H(t) (希望它越小越好,类似损失函数了)

剪枝

评价函数改进: C α ( T ) = C ( T ) + a ∣ T loaf? ∣ ?叶子节点个数越多,?损失越大? C_{\alpha}(T)=C(T)+a\left|T_{\text {loaf }}\right| \text { 叶子节点个数越多, 损失越大 } Cα?(T)=C(T)+aTloaf???叶子节点个数越多,?损失越大?

预剪枝

所谓先剪枝,实际就是控制决策树的生长,在决等树生长讨程中决定某节点是否需要继续分枝还是直接作为叶节点。一日某节点被判断为叶节点以后,则该分枝停止生长。
通常,用于判断决策树何时停止的方法有三种:

(1) 数据划分法。该方法的核心思想是将数据分成训练样本和测试样本,首先基于训练样本对决策树进行生长,直到在测试样本上的分类错误率达到最小时停止生长。此方法只利用了一部分样本进行决策树的生长,没有充分利用数据信息,因此通常采用多次的交叉验证方法(参考第10章)以充分利用数据信息。

(2)阈值法。预先设定一个信息增益阈值,当从某节点往下生长时得到的信息增益小于设定阙值时停止树的生长。但是,实际应用中此阙值往往不容易设定。

(3)信息增益的统计显著性分析。对已有节点获得的所有信息增益统计其分布,如果继续生长得到的信息增益与该分布相比不显著,则停止树的生长,通常可以用卡方检验来考查这个显著性。

后剪枝

顾名思义,后剪枝是指在决策树得到充分生长以后再对其进行修剪。后剪枝的核心想是对一些分枝进行合并,它从叶节点出发,如果消除具有相同父节点的叶节点后不会导到不纯度的明显增加则执行消除,并以其父节点作为新的叶节点。如此不断地从叶节点往上进行回溯,直到合并操作不再适合为止。
常用的剪枝规则也有三种:

(1)减少分类错误修剪法。该方法试图通过独立的剪枝集估计剪枝前后分类错误率的改变,并基于此对是否合并分支进行判断。

(2)最小代价与复杂性的折中。该方法对合并分枝后产生的错误率增加与复杂性减少进行折中考虑,最后得到一个综合指标较优的决策树。

(3)最小描述长度(minimal description length, MDIL)准则。该方法的核心思想是,最简单的树就是最好的树。该方法首先对决策树进行编码,再迪过剪枝得到编码最短的决策树。

随机森林

顾名思义,随机森林就是建立很多决策树,组成一个决策树的“森林”,通过多棵树投票来进行决策。理论和实验研究都表明,这种方法能够有效地提高对新样本的分类准确度即推广能力。这里只给出随机森林方法的三个基本步骤:
首先,随机森林方法对样本数据进行自举重采样,得到多个样本集。所谓自举重采样,就是每次从原来的N个训练样本中有放回地随机抽取N个样本(包括可能的重复样本)。
然后,用每个重采样样本集作为训练样本构造一个决策树。在构造决策树的过程中,每次从所有候选特征中随机地抽取m 个特征,作为当前节点下决策的备选特征,从这些特征中选择最好地划分训练样本的特征。
最后,得到所需数目的决策树后,随机森林方法对这些树的输出进行投票,以得票最多的类作为随机森林的决策。
在这里插入图片描述
与之相近的算法还有bagging方法、ADAboost方法等。

MATLAB相关代码

Model = TreeBagger(ntree,train_data,train_label,'Method','classification')

ntree 树的数量
train_data 训练样本数据
train_label 训练样本数据对应的类别标签
[predict_label,scores] = predict(Model, test_data)
test_data 测试数据
predict_label 分类结果
scores 概率分布
view(Model.Trees{n})
或view(Model.Trees{n},‘Mode’,‘graph’)
n 树的编号
可以看到每棵树的决策过程。

以国赛数模2017B第一题为例

2017年赛题下载

根据各个指标来分类完成与未完成。

部分数据截取

部分数据截取

MATLAB实现

clc;clear;
load train_label.mat;
load train_data.mat;
ntree=10;
test_data=train_data;
Model = TreeBagger(ntree,train_data,train_label,'Method','classification')
[predict_label,scores] = predict(Model, test_data)

预测结果

为了方便,我直接把训练集当做测试集带入了……
结果如下:
在这里插入图片描述
只有少部分错误,相比神经网络、多元线性回归、逻辑回归、SVM等方式,正确率高出了一大截。当然,是否存在过拟合现象有待验证,更加好的做法应该是随机抽取一部分样本作为测试集,其余作为训练集,重复多次可测的正确率。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:37:13  更:2021-08-29 09:37:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:26:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码