决策树算法学习笔记

news2024/11/27 10:36:08

一、决策树简介

       首先决策树是一种有监督的机器学习算法,其采用的方法是自顶向下的递归方法,构建一颗树状结构的树,其具有分类和预测功能。其基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零。决策树的构建通常分为三个步骤:

1、特征选择

       特征选择就是要选取具有较强分类能力的特征,分类能力通过信息增益或信息增益率来进行刻画。选择的标准是找出局部最优的特征作为判断进行切分,取决于切分后节点数据集合中类别的有序程度。衡量节点的数据集合的纯度有:信息增益(率)、基尼系数和方差(方差主要是针对回归的)。

2、决策树的生成

      在决策树的生成算法中,常规的算法有ID3和C4.5生成算法。两者生成的过程类似,区别在于前者采用信息增益作为特征的度量,而后者采用信息增益率。但ID3和C4.5存在某些不足,因此改进的CART算法便产生了,它是采用基尼系数作为度量属性的选择。

3、决策树剪枝

       决策树需要剪枝的原因是:决策树的生成算法生成的树对训练数据的预测很准确,但是对于未知的数据分类能力却很差,容易产生过拟合的现象。剪枝的过程是从已经生成的决策树上剪掉一些子树或者叶子节点。剪枝的目标是通过极小化决策树的整体损失函数或代价函数实现,其目的是提高模型的泛化能力。

二、决策树的生成算法

主要有ID3、C4.5和CART树算法。

首先来介绍ID3算法:

       其思路是用信息增益的大小来判断当前节点应该用什么特征来构建决策树,用计算出的信息增益最大的特征来建立决策树的当前节点。

        特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即:

g(D,A)=H(D) – H(D|A)

        其中H(D)度量了D的不确定性,H(D|A)度量了D在知道了A以后D剩下的不确定性,两者之差则度量了D在知道了A以后不确定性的减少程度。

ID3算法的不足:

1、其没有考虑连续特征,比如长度,密度都是连续值

2、其采用的信息增益大的特征优先建立决策树的节点。这就导致了在相同条件下取值较多的特征比取值较少的特征的信息增益  大。,例如一个变量有两个值,都为1/2,另一个变量有三个值,都为1/3,由于他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。

3、ID3算法没有对于缺失值的情况做考虑。

4、ID3算法没有考虑过拟合的问题。

其次是C4.5算法

对于ID3算法存在的问题,C4.5对其做了进一步的改进。

       首先对于不能处理连续特征的问题,C4.5的思路是将连续的特征离散化。比如m个样本的连续特征A有m个,从小到大排列为a1,a2...,am,则C4.5取相邻两样本值的平均数,一共取得m-1个划分点,其中第i个划分点Ti表示为:Ti=(ai+a(i+1))/2。对于这m-1个点,分别计算该点作为二元分类点时的信息增益。选择信息增益最大的点作为该连续特征的二元离散分类点。比如取到的增益最大的点为at,则小于at的值为类别1,大于为类别2,这样就做到连续特征的离散化处理。

       其次对于信息增益作为标准容易偏向于取值较多的特征的问题。引入了信息增益率作为度量特征的选择,它是信息增益和特征熵的比值。表达式如下:

Gr(D,A) = g(D,A) / HA(D)

信息熵g(D,A),H(A)为特征熵,对于H(A)其表达式如下:

        其中n为特征A的类别数,Di为特征A的第i个取值对应的样本个数。D为样本个数。

        再者,对于缺失值的问题,主要解决的问题主要有两个,一是在样本某些特征缺失的情况下选择划分的属性,二是选定了划分属性,对于在该属性上缺失特征的样本处理。

        最后,对于过拟合的问题,C4.5引入了正则化系数进行初步的剪枝。

C4.5算法的不足:

1、C4.5剪枝的算法存在优化的空间。

2、C4.5算法生成的是多叉树,即一个父节点可以有多个节点。

3、C4.5只能用于分类

4、C4.5由于使用了熵模型,里面有大量的耗时的对数运算。

下面介绍CART算法:

        CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益是相反的。

        在分类问题中,假设有K个类别,第k个类别的概率为pk,则基尼系数的表达为:

        如果是二分类为题,计算就更加简单,如果属于第一个样本输出的概率为p,则基尼系数的表达式为:

Gini(p)=2p(1-p)

        对于给定的样本D,假设有K个类别,第k个类别的数量为Ck,则样本D的基尼系数表达式为:

Gini(D)=1-∑(|Ck|/|D|)^2

特别地,对于样本D,如果根据特征A的某个值a,把D分为D1和D2两部分,则在特征A的条件下,D的基尼系数表达式为:

三、决策树CART算法的剪枝

目的:

       对于没有进行剪枝的树,就是一个完全生长的决策树,是过拟合的,因此需要去掉一些不必要的节点以以提高训练出的决策树模型的泛化能力。

决策树算法剪枝的过程是由两个过程组成:

1、从T0开始不断的剪枝,直到剪成一颗单节点的树,这些剪枝树形成一个剪枝树序列{T0,T1,T2...,Tn}。

2、从上面形成的剪枝序列中挑选出最优剪枝树。方法是:通过交叉验证法使用验证数据集对剪枝树序列进行测试。

首先,给出决策树算法的损失函数:

Cα(T)=C(T)+α|T|   其中C(T)为决策树对训练数据的预测误差:|T|为决策树的叶子节点数

对固定的α,存在使Cα(T)最小的树,令其为Tα,可以证明Tα是唯一的。

当α大时,Tα偏小(即决策树比较简单)

当α小时,Tα偏大(即决策树比较复杂)

当α=0时,生成的决策树就是最优的

当α为无穷时,根组成的一个单节点树就是最优的。

考虑生成树T0.对T0内的任意节点t,以t为单节点树(记作t')的损失函数为:Cα(t')=C(t')+α,以t为根的子树Tt的损失函数为:

Cα(Tt)=C(Tt)+α|Tt|。可以证明:

当α=0及充分小时,有Cα(Tt)<Cα(t')

当α增大到某个值时,有Cα(Tt)=Cα(t')

当α再增大时时,有Cα(Tt)>Cα(t')

        因此令α=(C(t'<C(Tt)))/(|Tt|-1),此时t'与Tt有相同的损失函数值,但是t'的叶节点更少,于是对Tt进行减值成一颗单节点树t'了。

        对T0内部的每一个节点t,定义g(t)=(C(t'<C(Tt)))/(|Tt|-1)。设T0内g(t)最小的子树为Tt*,令该最小值的g(t)为α1'。从T0中剪去Tt*,即得到剪枝树T1,重复这种“求g(t)-剪枝”过程,直到根节点即完成剪枝。在此过程中不断增加αi'的值,从而生成剪枝树序列。

        CART剪枝交叉验证过程是通过验证数据集测试剪枝树序列{T0,T1,T2...,Tn}中个剪枝树的。对于CART回归树,是考察剪枝树的平方误差,平方误差最小的决策树被认为是最有决策树。对于CART分类树,是考察基尼指数,基尼指数最小的决策树被认为是最优的决策树。

四、决策树代码实例

        下面是一个使用Python的scikit-learn库实现决策树的代码示例

# 导入所需的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

# 加载数据集
iris = load_iris()
X = iris.data  # 特征向量
y = iris.target  # 目标变量

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

# 创建决策树分类器
clf = DecisionTreeClassifier(max_depth=3, random_state=1)

# 训练决策树模型
clf.fit(X_train, y_train)

# 使用训练好的模型进行预测
y_pred = clf.predict(X_test)

# 计算准确率
accuracy = metrics.accuracy_score(y_test, y_pred)
print("准确率:", accuracy)

# 可视化决策树
plt.figure(figsize=(10, 6))
plot_tree(clf, filled=True, rounded=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()

        以上代码实现了对鸢尾花数据集的分类任务。首先,导入所需的库。然后,加载鸢尾花数据集,其中X是特征向量,y是目标变量。接着,将数据集划分为训练集和测试集,其中测试集占总数据集的30%。然后,创建一个决策树分类器,并指定最大深度为3和随机种子为1。

        在决策树模型中,设置最大深度可以控制决策树的复杂度,避免过拟合。较小的最大深度可以降低模型的复杂度,但也可能导致欠拟合。随机种子用于重现结果,确保每次运行代码时得到相同的结果。

        接着,使用训练集对决策树模型进行训练。然后,使用训练好的模型对测试集进行预测并得到预测结果y_pred

        使用metrics.accuracy_score函数计算预测准确率,并将结果打印出来。

        最后,使用matplotlib库将决策树可视化显示出来。通过调用plot_tree函数并传入决策树模型、特征名和目标类别名等参数,可以生成决策树的图形化显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/968974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【强化学习】MDP马尔科夫链

基本元素 状态集&#xff1a;表示智能体所处所有状态的全部可能性的集合。类似的集合&#xff0c;行为集&#xff0c;回报集决策&#xff1a;规定我在某个状态下&#xff0c;我做出某个action马尔可夫链&#xff1a;学术上来说是无记忆性质。说白了就是我只在乎我目前的状态。…

Axes3D绘制3d图不出图解决办法【Python】

运行下面一段代码​&#xff1a; import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D#这里设函数为y3x2x_data [1.0,2.0,3.0]y_data [5.0,8.0,11.0]​def forward(x): return x * w b​def loss(x,y): y_pred forward(x) …

山西省文物局与大势智慧签订战略合作协议

8月24日&#xff0c;由山西省文物局、中国文物信息咨询中心(国家文物局数据中心)主办的数字文博发展论坛在太原举行。武汉大势智慧科技有限公司&#xff08;后简称“大势智慧”&#xff09;受邀参与&#xff0c;与来自国内文博数字化领域的专家学者齐聚一堂&#xff0c;围绕“数…

华为数通方向HCIP-DataCom H12-821题库(单选题:241-260)

第241题 ​​LS Request​​报文不包括以下哪一字段? A、通告路由器(Advertising Router) B、链路状态 ID (Link Srate ID) C、数据库描述序列号(Database Dascription Sequence lumber) D、链路状态类型 Link state type) 答案:C 解析: LS Request 报文中包括以下字段…

浅谈下cdn以及防盗链问题

目录 一、什么是cdn 二、使用cdn带来的好处 三、CDN工作原理 四、cdn使用场景 五、流媒体CDN之防盗链问题 一、什么是cdn CDN&#xff08;Content Delivery Network&#xff09;是一种分布式网络架构&#xff0c;用于提供高效的内容分发服务。CDN通过将内容缓存在离用户最…

VLDB 2023 | CDSBen: 字节跳动 veDB 数据库存储系统性能测试模型

背景 随着业务爆炸式增长与云原生技术的日渐成熟&#xff0c;大量云原生分布式数据库产品如雨后春笋般涌现&#xff0c;其中一部分主打 OLTP 场景的分布式数据库强调的是从计算-存储分离架构获得弹性收益&#xff1b;对于业界各种计算-存储分离架构的数据库而言&#xff0c;怎么…

3环断链以及断链后的检测方法

3环断链以及断链后的方法 我们在3环注入代码很多时候会选择注入dll&#xff0c;因为纯粹的硬编码不方便写出大量功能&#xff0c;而且不容易维护所以很多时候我们会通过各种方式让我们的dll注入到目标地址空间中&#xff0c;其中有一些方式可以不需要我们自己对dll处理重定位而…

C语言每日一练--Day(15)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;珠玑妙算 两数之和 &#x1f493;博主csdn个人主页&#xff1a;小小uni…

Docker安装MySQL教程

虽然 docker 安装 mysql 不是一个很好的方案&#xff0c;但是为了个人使用方便&#xff0c;使用 docker 安装 mysql 还是没什么问题的。 本文为了方便&#xff0c;我们直接通过yum方式安装。所以&#xff0c;我们在安装之前需要电脑可以联网&#xff0c;不然我们这种方式是安装…

ASP.NET Core 中的 MVC架构

MVC 架构 MVC架构把 App 按照逻辑分成三层&#xff1a; Controllers&#xff0c;接收 http request&#xff0c;配合 model&#xff0c;通过http response 返回 view&#xff0c;尽量不做别的事Models, 负责业务逻辑&#xff0c;App 的状态&#xff0c;以及数据处理Views&…

数学建模--Seaborn库绘图基础的Python实现

目录 1.绘图数据导入 2. sns.scatterplot绘制散点图 3.sns.barplot绘制条形图 4.sns.lineplot绘制线性图 5.sns.heatmap绘制热力图 6.sns.distplot绘制直方图 7.sns.pairplot绘制散图 8.sns.catplot绘制直方图 9.sns.countplot绘制直方图 10.sns.lmplot绘回归图 1.绘图数…

【C++】原子类型非线程安全

原子类型非线程安全 #include <iostream> #include <thread>int main() {int num 0;int count 100000;std::thread thread1([&](){for(int i 0; i < count; i){num;}});std::thread thread2([&](){for(int i 0; i < count; i){num;}});std::thr…

数学建模--多项式拟合方法Python实现

目录 1.算法设计思路 2.算法核心代码 3.算法效果展示 1.算法设计思路 算法关键步骤:(主要是利用到多项式拟合的库包) 1.将数据进行导入 2.进行曲线拟合返回值为各项系数 3.获得多项式拟合之后的函数表达式 4.将x代入表达式求出对应的y值(这样就能够表示出拟合的差别如何) 5.进…

数学建模--三维图像绘制的Python实现

目录 1.绘制三维坐标轴的方法 2.绘制三维函数的样例1 3.绘制三维函数的样例2 4.绘制三维函数的样例3 5.绘制三维函数的样例4 6.绘制三维函数的样例5 1.绘制三维坐标轴的方法 #%% #1.绘制三维坐标轴的方法 from matplotlib import pyplot as plt from mpl_toolkits.mplot3…

构建知识库:一文解决跨平台科研文献及笔记同步问题

文章目录 需求及目标现有方案调研文献管理方案云存储方案Markdown编辑器Windows端Ipad端 图床管理方案 最终方案操作流程最后 作为一个十级懒人&#xff0c;要么躺着要么在探寻提效工具的路上。 开始打工生涯之后&#xff0c;除了正常工作时间&#xff0c;总想利用业余时间提升…

postgres数据库设置id自增

postgres数据库设置id自增 1. 使用SQL语句建立自增序列 CREATE SEQUENCE id_seq START 1;执行结果 ng) 2. 在设计表中使用该序列 nextval(id_seq::regclass)

面试题 ⑤

1、TCP与UDP的区别 UDPTCP是否连接无连接&#xff0c;即刻传输面向连接&#xff0c;三次握手是否可靠不可靠传输&#xff0c;网络波动拥堵也不会减缓传输可靠传输&#xff0c;使用流量控制和拥塞控制连接对象个数支持一对一&#xff0c;一对多&#xff0c;多对一和多对多交互通…

Kubernetes之舞:微服务的交响乐团

Kubernetes与微服务&#xff1a;缘起 微服务的崛起 微服务架构已经成为现代软件开发的标准。与传统的单体应用相比&#xff0c;微服务提供了更高的模块化&#xff0c;使得团队可以独立地开发、部署和扩展各个服务。这种架构模式的主要优势在于其灵活性和可扩展性&#xff0c;允…

数学建模:拟合算法

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;拟合算法 文章目录 数学建模&#xff1a;拟合算法拟合算法多项式拟合非线性拟合cftool工具箱的使用 拟合算法 根据1到12点间的温度数据求出温度与时间之间的近似函数关系 F ( t ) F(…