当前位置: 首页 > news >正文

分类算法系列⑤:决策树

目录

1、认识决策树

2、决策树的概念

3、决策树分类原理

基本原理

数学公式

4、信息熵的作用

5、决策树的划分依据之一:信息增益

5.1、定义与公式

5.2、⭐手动计算案例

5.3、log值逼近

6、决策树的三种算法实现

7、API

8、⭐两个代码案例

8.1、决策树分类鸢尾花数据集

流程:

代码:

代码解释:

结果

决策树

8.2、泰坦尼克号乘客生存预测

泰坦尼克号数据

分析

代码

代码解释

结果

决策树

8.3、⭐如何可视化dot文件

9、总结


 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发。

🦅主页:@逐梦苍穹

⭐分类算法系列①:初识概念

⭐分类算法系列②:KNN(K-近邻)算法

⭐分类算法系列③:模型选择与调优 (Facebook签到位置预测)

⭐分类算法系列④:朴素贝叶斯算法

🍁您的三连支持,是我创作的最大动力🌹

1、认识决策树

决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法。

怎么理解这句话?通过一个对话例子:

5b43c3c8b7dc47f589cab80e7b1efd8b.png

想一想这个女生为什么把年龄放在最上面判断?这就是涉及到决策树的效率

2、决策树的概念

决策树是一种广泛应用于机器学习和数据挖掘领域的监督学习算法,用于分类和回归任务。它是一种基于树状图结构来做出决策的模型,非常直观且易于解释。在决策树中,每个内部节点表示一个属性或特征,每个分支代表一个属性测试,每个叶子节点表示一个类别标签或回归值。以下是决策树的关键概念和特点:

  1. 树状结构:决策树采用树状结构,其中根节点表示整个数据集,内部节点表示属性或特征,叶子节点表示类别或回归值。每个节点可以有多个子节点,但通常不会太深,以避免过度拟合。
  2. 分裂节点:决策树的构建过程涉及选择一个属性或特征,将数据集分成不同的子集。这个过程持续递归地进行,直到满足停止条件。
  3. 属性选择:在每个内部节点,决策树算法会选择一个最佳属性或特征来进行数据分割。常见的属性选择方法包括信息增益、基尼不纯度和均方误差。
  4. 剪枝:决策树容易过度拟合训练数据,为了避免这种情况,可以采用剪枝策略。剪枝是删除某些子树或叶子节点,以简化模型并提高泛化能力。
  5. 分类与回归:决策树可用于分类问题和回归问题。在分类问题中,叶子节点表示类别标签。在回归问题中,叶子节点表示一个数值。
  6. 特征重要性:决策树可以提供特征重要性的信息,即哪些特征对于分类或回归任务更为关键。这可以帮助特征选择和理解数据。
  7. 解释性:决策树模型具有很高的解释性,因为它们的决策过程可以直观地表示为一系列的规则。这使得决策树在需要解释机器学习模型决策的情况下非常有用。
  8. 容易过拟合:决策树在训练数据上容易过拟合,因此常常需要剪枝等正则化方法来降低模型复杂度。

决策树的一些常见变体包括随机森林(通过多个决策树进行集成)、梯度提升树(通过迭代建立多个决策树),以及CART(分类与回归树)等。

决策树在许多领域都有广泛的应用,包括医疗诊断、金融风险评估、自然语言处理、图像处理等。它们的优点包括易于理解、易于可视化、高效计算和适用于各种数据类型。但需要注意的是,决策树可能对数据中的噪声敏感,并且可能需要进一步的处理来提高性能。

3、决策树分类原理

基本原理

决策树分类原理是一种基于树状结构的监督学习算法,用于解决分类问题。其基本原理涉及将数据分成不同的类别,以构建树状结构,使决策树能够对新数据进行分类。下面是决策树分类的基本原理:

  1. 初始节点:决策树的根节点包含整个训练数据集。初始时,所有训练样本都属于同一个类别或标签。
  2. 属性选择:选择一个最佳属性或特征来进行数据分割。这个选择通常基于某个属性的判别能力,目标是将数据分成尽可能纯净的子集。不纯度的度量方式有多种,包括信息增益、基尼不纯度和均方误差等。选择属性的过程可以看作是在节点上进行一个属性测试,例如,如果某个特征的值大于某个阈值,则分到左子树,否则分到右子树。
  3. 分裂节点:根据选择的属性,将数据集分成多个子集,每个子集对应一个分支。这些分支成为决策树的内部节点。
  4. 递归构建:重复上述过程,对每个内部节点递归地选择最佳属性,并分割数据,直到满足停止条件。停止条件可以是树达到最大深度、节点包含的样本数小于某个阈值、或者数据集在某个节点上已经完全纯净(所有样本属于同一类别)。
  5. 叶子节点:当决策树构建完成后,所有终止分裂的节点称为叶子节点。叶子节点包含一个类别或标签,表示在该节点上的样本属于该类别。
  6. 分类:对于新的数据点,从根节点开始,根据每个节点上的属性测试,沿着适当的分支移动,直到达到叶子节点。最终的叶子节点的类别即为决策树对新数据点的分类结果。

总的来说,决策树分类的原理是通过递归地选择属性并分裂数据,构建一个树状结构,使得每个叶子节点代表一个类别。这样,当新的数据点到达树的叶子节点时,可以根据叶子节点的类别标签来进行分类预测。决策树分类具有直观性、易解释性和适用性广泛的特点,但需要小心处理过拟合问题,通常需要剪枝等正则化技术。

数学公式

决策树分类的数学原理涉及到属性选择和分割数据的数学方法,以及如何确定叶子节点的类别。以下是决策树分类的主要数学原理:

信息熵(Entropy):信息熵是一个用于度量数据不纯度或混乱程度的概念。

对于一个二分类问题,信息熵的计算公式如下:eq?H%28X%29%20%3D%20-%5Csum_%7Bi%3D1%7D%5E%7Bc%7D%20p_i%20%5Clog_2%28p_i%29%3D-%5Csum_%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%7CC_k%7C%7D%7B%7CX%7C%7D%20%5Clog_2%28%5Cfrac%7B%7CC_k%7C%7D%7B%7CX%7C%7D%29

其中,H(X) 表示数据集 X 的信息熵,c 表示类别的数量,pi 表示第 i 个类别在数据集中的占比。信息熵越高,表示数据集越不纯。

条件熵:eq?H%28D%7CA%29%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%7CD_i%7C%7D%7B%7CD%7C%7DH%28D_i%29%3D-%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%5Cfrac%7B%7CD_i%7C%7D%7B%7CD%7C%7D%5Csum_%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%7CD_%7Bik%7D%7C%7D%7B%7CD_i%7C%7D%20%5Clog_2%28%5Cfrac%7B%7CD_%7Bik%7D%7C%7D%7B%7CD_i%7C%7D%29

eq?C_k表示属于某个类别的样本数)

信息增益(Information Gain):信息增益是衡量在选择某个属性后信息熵减少的程度。

在决策树中,选择信息增益最大的属性来进行分割。

信息增益的计算公式如下:eq?%5Ctext%7BInformation%20Gain%7D%28X%2C%20A%29%20%3D%20H%28X%29%20-%20%5Csum_%7Bv%20%5Cin%20%5Ctext%7BValues%7D%28A%29%7D%20%5Cfrac%7B%7CX_v%7C%7D%7B%7CX%7C%7D%20%5Ccdot%20H%28X_v%29

其中,X 表示当前节点的数据集,A 表示属性,Values(A) 表示属性 A 可能的取值,Xv 表示属性A 取值为v时的数据子集。

基尼不纯度(Gini Impurity):基尼不纯度是另一种用于度量数据不纯度的指标。

对于一个二分类问题,基尼不纯度的计算公式如下:eq?Gini%28X%29%20%3D%201%20-%20%5Csum_%7Bi%3D1%7D%5E%7Bc%7D%20p_i%5E2

其中,Gini(X) 表示数据集 X 的基尼不纯度,c 表示类别的数量,pi 表示第 i 个类别在数据集中的占比。

基尼不纯度越低,表示数据集越纯。

基尼增益(Gini Gain):基尼增益是衡量在选择某个属性后基尼不纯度减少的程度。

公式:eq?%5Ctext%7BGini%20Gain%7D%28X%2C%20A%29%20%3D%20Gini%28X%29%20-%20%5Csum_%7Bv%20%5Cin%20%5Ctext%7BValues%7D%28A%29%7D%20%5Cfrac%7B%7CX_v%7C%7D%7B%7CX%7C%7D%20%5Ccdot%20Gini%28X_v%29

在决策树中,选择基尼增益最大的属性来进行分割。基尼增益的计算公式与信息增益类似,但使用基尼不纯度来度量。

决策树构建过程:决策树的构建过程是通过递归选择最佳属性来分割数据集,直到满足停止条件。通常,停止条件包括树达到最大深度、节点包含的样本数小于某个阈值,或者数据集在某个节点上已经完全纯净(所有样本属于同一类别)。

剪枝(Pruning):决策树容易过拟合训练数据,为了避免过拟合,可以采用剪枝策略。剪枝是删除某些子树或叶子节点,以简化模型并提高泛化能力。常见的剪枝方法包括预剪枝和后剪枝。

总的来说,决策树分类的数学原理涉及使用信息熵、信息增益、基尼不纯度和基尼增益等指标来选择最佳属性进行数据分割,并通过递归构建树状结构来实现分类。这些指标和方法帮助决策树在数据集中找到最佳的属性

4、信息熵的作用

信息熵在信息理论和机器学习中有着重要的作用,主要体现在以下几个方面:

  1. 度量信息不确定性: 信息熵用来度量一个随机变量或数据集的信息不确定性。信息熵越高,表示不确定性越大,反之亦然。在机器学习中,我们经常使用信息熵来衡量数据集的纯度或不纯度。例如,在决策树中,我们选择属性进行划分时通常希望子集的信息熵尽可能低,从而提高分类的准确性。
  2. 特征选择: 在特征工程中,我们可以使用信息熵来衡量不同特征对目标变量的贡献。选择具有高信息熵的特征意味着这些特征包含更多关于目标变量的信息,因此可能更有用于建立模型。
  3. 决策树构建: 决策树算法中的属性选择依赖于信息熵。通过计算每个属性的信息增益或信息增益比,决策树可以选择最优的属性来进行数据集的划分,从而构建出具有良好泛化性能的决策树模型。
  4. 编码与压缩: 在信息编码和数据压缩中,信息熵有助于设计高效的编码方案。香农编码就是一种基于信息熵的数据压缩方法,它能够实现最短的编码长度,以便节省存储空间和传输带宽。
  5. 随机事件分析: 在概率论和统计学中,信息熵用于描述随机事件的不确定性或信息量。它是衡量信息的一种重要指标,可用于研究随机事件的性质和分布。

总之,信息熵是一个重要的概念,它帮助我们理解和处理信息的不确定性,对于数据分析、模型构建和信息处理等领域都具有广泛的应用价值。

5决策树的划分依据之一:信息增益

5.1、定义与公式

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

即公式为:eq?g%28D%2CA%29%3DH%28D%29-H%28D%7CA%29

带入前面提到的公式,则eq?g%28D%2CA%29为:

eq?g%28D%2CA%29%3D-%5Csum_%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%20%5Clog_2%28%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%29-%28-%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%7CD_i%7C%7D%7B%7CD%7C%7D%20%5Csum_%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%7CD_%7Bik%7D%7C%7D%7B%7CD_i%7C%7D%20%5Clog_2%28%20%5Cfrac%7B%7CD_%7Bik%7D%7C%7D%7B%7CD_i%7C%7D%29%29

用通俗的话来说,就是:当知道了某一个特征之后,对于某一事件的不确定性减少了,即信息熵减少了,则称为信息增益。

5.2手动计算案例

下面的案例是一个贷款案例,给定多个特征,判断是否贷款的可能性:

数据情况如下:

7942120ba9b54854a0dc75e327dd626e.png

下面是具体的计算,需要计算出决策树的根节点,即“知道了哪一个特征之后,对于是否贷款的问题,减少了最多的不确定性”。

总的信息熵为"是/否":eq?H%28D_%7Ball%7D%29%3D-%5Csum_%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%20%5Clog_2%28%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%29%3D-%28%5Cfrac%7B6%7D%7B15%7D%5Clog_2%5Cfrac%7B6%7D%7B15%7D+%5Cfrac%7B9%7D%7B15%7D%5Clog_2%5Cfrac%7B9%7D%7B15%7D%29

下面是条件熵:

①条件为"知道年龄"这一特征:eq?H%28D_%7Ball%7D%7Cage%29%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%7CD_i%7C%7D%7B%7CD%7C%7DH%28D_i%29

eq?H%28D_%7Ball%7D%7Cage%29%3D%5Cfrac%7B1%7D%7B3%7DH%28youth%29+%5Cfrac%7B1%7D%7B3%7DH%28middle%5Chspace%7B0.1cm%7Dage%29+%5Cfrac%7B1%7D%7B3%7DH%28old%5Chspace%7B0.1cm%7Dage%29

青年:eq?H%28youth%29%3D-%5Csum_%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%20%5Clog_2%28%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%29%3D-%28%5Cfrac%7B2%7D%7B5%7D%5Clog_2%5Cfrac%7B2%7D%7B5%7D+%5Cfrac%7B3%7D%7B5%7D%5Clog_2%5Cfrac%7B3%7D%7B5%7D%29

中年:eq?H%28middle%5Chspace%7B0.1cm%7Dage%29%3D-%5Csum_%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%20%5Clog_2%28%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%29%3D-%28%5Cfrac%7B2%7D%7B5%7D%5Clog_2%5Cfrac%7B2%7D%7B5%7D+%5Cfrac%7B3%7D%7B5%7D%5Clog_2%5Cfrac%7B3%7D%7B5%7D%29

老年:eq?H%28old%5Chspace%7B0.1cm%7Dage%29%3D-%5Csum_%7Bk%3D1%7D%5E%7BK%7D%20%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%20%5Clog_2%28%5Cfrac%7B%7CC_k%7C%7D%7B%7CD%7C%7D%29%3D-%28%5Cfrac%7B1%7D%7B5%7D%5Clog_2%5Cfrac%7B1%7D%7B5%7D+%5Cfrac%7B4%7D%7B5%7D%5Clog_2%5Cfrac%7B4%7D%7B5%7D%29

②条件为"知道是否有工作"这一特征:eq?H%28D_%7Ball%7D%7Cwork%29%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%7CD_i%7C%7D%7B%7CD%7C%7DH%28D_i%29

eq?H%28D_%7Ball%7D%7Cwork%29%3D%5Cfrac%7B5%7D%7B15%7DH%28be%20%5Chspace%7B0.1cm%7Din%20%5Chspace%7B0.1cm%7Demployment%20%29+%5Cfrac%7B10%7D%7B15%7DH%28worklessness%29

③条件为"知道是否有房子"这一特征:eq?H%28D_%7Ball%7D%7Chouse%29%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%7CD_i%7C%7D%7B%7CD%7C%7DH%28D_i%29

eq?H%28D_%7Ball%7D%7Chouse%29%3D%5Cfrac%7B6%7D%7B15%7DH%28own%20%5Chspace%7B0.1cm%7D%20a%5Chspace%7B0.1cm%7D%20house%29+%5Cfrac%7B9%7D%7B15%7DH%28houselessness%29

④条件为"知道信贷情况"这一特征:eq?H%28D_%7Ball%7D%7Ccredit%5Chspace%7B0.1cm%7D%20position%29%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20%5Cfrac%7B%7CD_i%7C%7D%7B%7CD%7C%7DH%28D_i%29

eq?H%28D_%7Ball%7D%7Ccredit%5Chspace%7B0.1cm%7D%20position%29%3D%5Cfrac%7B4%7D%7B15%7DH%28tiptop%29+%5Cfrac%7B6%7D%7B15%7DH%28good%29+%5Cfrac%7B5%7D%7B15%7DH%28ordinary%29

根据"青年"的过程,以此类推,最终得出信息增益g(D,A)最高的是(条件为"知道是否有房子"这一特征),所以就把判断是否有房子,作为决策树的根节点,树以此延申。

5.3、log值逼近

对数的基本性质:

e043ba8a105c40f7969aceb727e0e48d.png

如果想要具体的值,可以用泰勒公式或麦克劳林展开式:

泰勒公式:eq?f%28x%29%20%3D%20f%28a%29%20+%20f%27%28a%29%28x%20-%20a%29%20+%20%5Cfrac%7Bf%27%27%28a%29%7D%7B2%21%7D%28x%20-%20a%29%5E2%20+%20%5Cfrac%7Bf%27%27%27%28a%29%7D%7B3%21%7D%28x%20-%20a%29%5E3%20+%20%5Cldots

麦克劳林公式:eq?f%28x%29%20%3D%20%5Csum_%7Bn%3D0%7D%5E%7B%5Cinfty%7D%20%5Cfrac%7Bf%5E%7B%28n%29%7D%28a%29%7D%7Bn%21%7D%28x%20-%20a%29%5En

eq?%5Clog_x%20y的泰勒公式和麦克劳林公式如下:

eq?%5Clog_x%20y%20%3D%20%5Clog_a%20y%20+%20%5Cfrac%7B1%7D%7B%5Cln%20a%7D%5Cleft%28%5Cfrac%7By%27%7D%7By%7D%5Cright%29%28x%20-%20a%29%20+%20%5Cfrac%7B1%7D%7B2%21%5Cln%20a%7D%5Cleft%28%5Cfrac%7By%27%27%7D%7By%7D%5Cright%29%28x%20-%20a%29%5E2%20+%20%5Cfrac%7B1%7D%7B3%21%5Cln%20a%7D%5Cleft%28%5Cfrac%7By%27%27%27%7D%7By%7D%5Cright%29%28x%20-%20a%29%5E3%20+%20%5Cldots%20+%20O%5Cleft%28%28x%20-%20a%29%5En%5Cright%29

eq?%5Clog_x%20y%20%3D%20%5Cfrac%7B1%7D%7B%5Cln%201%7D%5Cleft%28%5Cfrac%7By%27%7D%7By%7D%5Cright%29x%20+%20%5Cfrac%7B1%7D%7B2%21%5Cln%201%7D%5Cleft%28%5Cfrac%7By%27%27%7D%7By%7D%5Cright%29x%5E2%20+%20%5Cfrac%7B1%7D%7B3%21%5Cln%201%7D%5Cleft%28%5Cfrac%7By%27%27%27%7D%7By%7D%5Cright%29x%5E3%20+%20%5Cldots%20+%20O%28x%5En%29

6、决策树的三种算法实现

决策树是一种常用的机器学习算法,用于分类和回归任务。以下是三种常见的决策树算法的实现方式:

  1. ID3(Iterative Dichotomiser 3)算法:ID3算法是决策树的早期算法,主要用于分类任务。它基于信息熵来选择每个节点的划分属性,以最大程度地减少不确定性。以下是ID3算法的关键步骤:
    • 计算每个属性的信息增益。
    • 选择信息增益最高的属性作为划分属性。
    • 递归地构建树,直到满足终止条件(例如,达到叶子节点或最大深度)。
  2. C4.5算法:C4.5算法是ID3算法的改进版本,它可以用于分类和回归任务。与ID3不同,C4.5使用信息增益比来选择最佳的划分属性。以下是C4.5算法的关键步骤:
    • 计算每个属性的信息增益比。
    • 选择信息增益比最高的属性作为划分属性。
    • 处理缺失值。
    • 递归地构建树,直到满足终止条件。
  3. CART(Classification and Regression Trees)算法:CART算法是一种多用途的决策树算法,可以用于分类和回归任务。与ID3和C4.5不同,CART使用基尼不纯度来选择最佳的划分属性。以下是CART算法的关键步骤:
    • 计算每个属性的基尼不纯度。
    • 选择基尼不纯度最低的属性作为划分属性。
    • 递归地构建树,直到满足终止条件。

这些是三种常见的决策树算法的基本实现方式。每种算法都有其优点和局限性,选择哪种算法通常取决于具体的问题和数据集。实际应用中,您可以使用机器学习库(如scikit-learn)中提供的现成实现来构建决策树模型。在使用这些库时,您可以轻松选择算法,并进行参数调整以获得最佳性能。

7、API

class sklearn.tree.DecisionTreeClassifier(criterion='gini', max_depth=None,random_state=None)

决策树分类器

criterion:默认是'gini'系数,也可以选择信息增益的熵'entropy'

max_depth:树的深度大小

random_state:随机数种子

其中会有些超参数:max_depth:树的深度大小

其它超参数会结合随机森林讲解

8两个代码案例

8.1、决策树分类鸢尾花数据集

流程:

获取数据集

划分数据集

决策树预估器

模型评估:对比真实值和预测值,计算准确率

可视化

代码:

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/9/1 23:50
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz'''
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)决策树分类器criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’max_depth:树的深度大小random_state:随机数种子其中会有些超参数:max_depth:树的深度大小其它超参数会结合随机森林讲解
'''
def decision_iris():"""用决策树对鸢尾花进行分类:return:"""# 1)获取数据集iris = load_iris()# 2)划分数据集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)# 3)决策树预估器estimator = DecisionTreeClassifier(criterion="entropy")estimator.fit(x_train, y_train)# 4)模型评估# 方法1:直接比对真实值和预测值y_predict = estimator.predict(x_test)print("y_predict:\n", y_predict)print("直接比对真实值和预测值:\n", y_test == y_predict)# 方法2:计算准确率score = estimator.score(x_test, y_test)print("准确率为:\n", score)# 可视化决策树export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)
if __name__ == '__main__':decision_iris()

代码解释:

  1. sklearn.datasets中导入load_iris函数,用于加载鸢尾花数据集。
  2. 使用load_iris函数加载鸢尾花数据集,并将数据集保存在变量iris中。
  3. 使用train_test_split函数将数据集划分为训练集和测试集,并将特征数据存储在x_trainx_test中,将目标数据(标签)存储在y_trainy_test中。random_state参数用于控制随机划分的种子,以确保划分结果可重复。
  4. 创建一个决策树分类器(DecisionTreeClassifier),使用信息熵(entropy)作为划分标准(criterion="entropy")。
  5. 使用训练集数据(x_trainy_train)来拟合决策树模型,即训练模型。
  6. 使用训练好的模型进行预测,将测试集数据x_test输入模型,得到预测结果,并将预测结果存储在y_predict中。
  7. 打印预测结果y_predict以及直接比对真实值和预测值的结果,这里使用了布尔运算符==来比较真实标签和预测标签是否相等,输出一个布尔数组表示每个样本的分类是否正确。
  8. 使用模型的score方法计算分类准确率,将测试集数据x_test和真实标签y_test输入模型,得到准确率的评估结果。
  9. 最后,使用export_graphviz函数将训练好的决策树可视化,并将可视化结果保存为名为"iris_tree.dot"的文件,以便后续生成决策树的图形化表示。

结果

036bad41dc1e466a9c43dda8b3a3472a.png

可以看到,同样的鸢尾花数据集预测,使用决策树比之前的KNN算法准确率提高了很多,KNN算法是一种懒算法,不适用于数据量稍大的情景。

决策树

05dc6e2770b04010aa9359d245738b99.png

8.2、泰坦尼克号乘客生存预测

泰坦尼克号数据

在泰坦尼克号和titanic2数据帧描述泰坦尼克号上的个别乘客的生存状态。这里使用的数据集是由各种研究人员开始的。其中包括许多研究人员创建的旅客名单,由Michael A. Findlay编辑。我们提取的数据集中的特征是票的类别,存活,乘坐班,年龄,登陆,home.dest,房间,票,船和性别。

数据网址:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt

如果无法访问,可以访问阿里云的地址:泰坦尼克生存预测数据集_数据集-阿里云天池

完整的数据集文件,也可以在本地找到

分析

选择我们认为重要的几个特征 ['pclass', 'age', 'sex']

填充缺失值

特征中出现类别符号,需要进行one-hot编码处理(DictVectorizer)

x.to_dict(orient="records") 需要将数组特征转换成字典数据

数据集划分

决策树分类预测

代码

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/9/1 23:50
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier'''
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)决策树分类器criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’max_depth:树的深度大小random_state:随机数种子其中会有些超参数:max_depth:树的深度大小其它超参数会结合随机森林讲解
'''
def decisioncls():"""决策树进行乘客生存预测"""# 1、获取数据titan = pd.read_csv("./data/titanic/titanic.csv")# 2、数据的处理x = titan[['pclass', 'age', 'sex']]y = titan['survived']# print(x , y)# 缺失值需要处理,将特征当中有类别的这些特征进行字典特征抽取x['age'].fillna(x['age'].mean(), inplace=True)# 对于x转换成字典数据x.to_dict(orient="records")# [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]dict = DictVectorizer(sparse=False)x = dict.fit_transform(x.to_dict(orient="records"))print(dict.get_feature_names_out())print(x)# 分割训练集合测试集x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)# 进行决策树的建立和预测dc = DecisionTreeClassifier(max_depth=5)dc.fit(x_train, y_train)print("预测的准确率为:", dc.score(x_test, y_test))# 可视化决策树# export_graphviz(dc, out_file="titanic_tree.dot", feature_names=dict.get_feature_names_out())if __name__ == '__main__':decisioncls()# decision_iris()

代码解释

  1. 通过pd.read_csv函数从CSV文件中读取泰坦尼克号的数据,并将数据存储在名为titan的Pandas DataFrame中。
  2. titan中选择特征列'pclass'(船舱等级)、'age'(年龄)、和'sex'(性别)作为模型的输入特征x,并将'survived'(生存情况)列作为模型的目标输出y
  3. 处理缺失值:使用x['age'].fillna(x['age'].mean(), inplace=True)'age'列中的缺失值用该列的均值填充。
  4. 对特征进行字典特征抽取:使用DictVectorizer将特征数据转换为字典数据,并进行独热编码,以便决策树模型能够处理类别型特征。
  5. 打印特征列的名称和转换后的特征数据,以查看转换的结果。
  6. 使用train_test_split函数将数据集划分为训练集(x_trainy_train)和测试集(x_testy_test)。
  7. 创建决策树分类器对象dc,设置最大深度为5。
  8. 使用训练数据x_trainy_train来训练决策树分类器。
  9. 使用测试数据x_testy_test进行生存情况的预测,并计算模型的准确率。
  10. 打印模型的预测准确率,即模型在测试集上正确预测的比例。

总结而言,这段代码加载了泰坦尼克号的乘客数据,进行了数据预处理,包括处理缺失值和特征编码,然后使用决策树分类器训练模型,并计算了模型在测试集上的准确率,以评估模型的性能。这是一个典型的机器学习分类问题的实例。

结果

67cbcdd544264d4d9f367ef8dc6fa088.png

决策树

33b036fc4561489ba628cfbdde780237.png

8.3如何可视化dot文件

工具:(能够将dot文件转换为pdf、png)

安装graphviz:

ubuntu:sudo apt-get install graphviz Mac:brew install graphviz

Windows:下载zip压缩包,解压缩,把bin路径添加到系统环境变量

Windows终端运行命令:dot -Tpng tree.dot -o tree.png

上面得到的是黑白的可视化,如果想要彩色的,则需要调整一下参数:

50d2052430324e80a007e5d75f571d17.png

9、总结

优点:简单的理解和解释,树木可视化。

缺点:决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。

改进:减枝cart算法(决策树API当中已经实现,随机森林参数调优有相关介绍)

随机森林

注:企业重要决策,由于决策树很好的分析能力,在决策过程应用较多, 可以选择特征

相关文章:

分类算法系列⑤:决策树

目录 1、认识决策树 2、决策树的概念 3、决策树分类原理 基本原理 数学公式 4、信息熵的作用 5、决策树的划分依据之一:信息增益 5.1、定义与公式 5.2、⭐手动计算案例 5.3、log值逼近 6、决策树的三种算法实现 7、API 8、⭐两个代码案例 8.1、决策树…...

前端面试(基础)

一、CSS 1.说一下CSS的盒模型。 在HTML页面中的所有元素都可以看成是一个盒子 盒子的组成:内容content、内边距padding、边框border、外边距margin 盒模型的类型: 标准盒模型 margin border padding content IE盒模型 margin content(border…...

element-ui switch开关组件二次封装,添加loading效果,点击时调用接口后改变状态

先看效果: element-ui中的switch开关无loading属性(在element-plus时加入了),而且点击时开关状态就会切换,这使得在需要调用接口后再改变开关状态变得比较麻烦。 思路:switch开关外包一层div,给…...

【GAN小白入门】Semi-Supervised GAN 理论与实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊🚀 文章来源:K同学的学习圈子论文原文:Semi-Supervised Learning with Generative Adversarial Networks.pdf在学习GAN的时候你有没有想过这样一个问题呢,如果我们生成的图像是带有标签的,例如数…...

Python自动化测试(1)-自动化测试及基本技术手段概述

生产力概述 在如今以google为首的互联网时代,软件的开发和生产模式都已经发生了变化, 在《参与感》一书提到:某位从微软出来的工程师很困惑,微软在google还有facebook这些公司发展的时候,为何为感觉没法有效还击&…...

小程序中如何查看会员的余额和变更记录

​通过查看会员的余额和变更记录,可以帮助商家更好地管理会员资金,提供更好的服务和用户体验。下面将介绍小程序中如何查看会员的余额以及余额的变更记录。 1. 找到指定的会员卡。在管理员后台->会员管理处,找到需要查看余额和记录的会员…...

【项目经验】elementui--table表格自定义表头及bug

一.思路 首先我们肯定得循环表头,我们原生js封装的表格的实现原理就是这样。其次我们要把自己循环的label显示出来,对应的prop也要和表格数据相对应。用div标签循环都会出现错误(div里面套column),大家不要踩坑。第一…...

flink实现kafka、doris精准一次说明

前言说明:本文档只讨论数据源为kafka的情况实现kafka和doris的精准一次写入 flink的kafka连接器已经实现了自动提交偏移量到kafka,当flink中的数据写入成功后,flink会将这批次数据的offset提交到kafka,程序重启时,kafka中记录了当前groupId消费的offset位置,开始消费时将…...

【git】git commit、push之前自动执行脚本

可以使用 Git 的钩子(hooks)功能。Git 钩子是在特定事件发生时执行自定义脚本的方式。 下面是一个使用 pre-commit 钩子的例子,用于在执行 git commit 之前自动执行脚本: 进入你的 Git 仓库的根目录。进入 .git/hooks 目录&…...

基于springboot+vue的加盟店管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

Gin中的Cookie和Session的用法

Gin中的Cookie和Session的用法 文章目录 Gin中的Cookie和Session的用法介绍Cookie代码演示 Session代码展示 介绍 cookie 和 session 是 Web 开发中常用的两种技术,主要用于跟踪用户的状态信息。 Cookie func (c *Context) Cookie(name string, value string, max…...

【算法】反悔贪心

文章目录 反悔贪心力扣题目列表630. 课程表 III871. 最低加油次数LCP 30. 魔塔游戏2813. 子序列最大优雅度 洛谷题目列表P2949 [USACO09OPEN] Work Scheduling GP1209 [USACO1.3] 修理牛棚 Barn RepairP2123 皇后游戏(🚹省选/NOI− TODO) 相关…...

Hadoop的安装和使用,Windows使用shell命令简单操作HDFS

1,Hadoop简介 Hadoop是一个能够对大量数据进行分布式处理的软件框架,并且是以一种可靠、高效、可伸缩的方式进行处理的,它具有以下几个方面的特性。 高可靠性。 高效性。 高可扩展性。 高容错性。 成本低。 运行在Linux平台上。 支持多种编程…...

ubuntu上ffmpeg使用framebuffer显示video

这个主题是想验证使用fbdev(Linux framebuffer device),将video直接显示到Linux framebuffer上,在FFmpeg中对应的FFOutputFormat 就是ff_fbdev_muxer。 const FFOutputFormat ff_fbdev_muxer {.p.name "fbdev",.p.long_…...

82 # koa-bodyparser 中间件的使用以及实现

准备工作 安装依赖 npm init -y npm i koakoa 文档:https://koajs.cn/# koa 中不能用回调的方式来实现,因为 async 函数执行的时候不会等待回调完成 app.use(async (ctx, next) > {console.log(ctx.path, ctx.method);if (ctx.path "/login…...

计算一串输出数字的累加和

计算一个文件内数字的累加和 awk {sum$1}END{print sum} 直接抽取数据以后的打印是这样的 cat step-iostat.1125.log |grep sda |cut -c "49-56" |awk {sum$1}END{print sum}...

python包导入原理解析

原文链接: https://www.cnblogs.com/hi3254014978/p/15317976.html 根据编程经验的不同,我们在运行程序时可能经常或者偶尔碰到下面这些问题,仔细观察后会发现这些问题无一例外都出现了一个相同的短语,很容易就可以发现&#xff0…...

MNIST手写数字辨识-cnn网路 (机器学习中的hello world,加油)

用PyTorch实现MNIST手写数字识别(非常详细) - 知乎 (zhihu.com) 参考来源(这篇文章非常适合入门来看,每个细节都讲解得很到位) 一、模块函数用法-查漏补缺: 1.关于torch.nn.functional.max_pool2d()的用法: 上述示例…...

论文笔记《3D Gaussian Splatting for Real-Time Radiance Field Rendering》

项目地址 原论文 Abstract 最近辐射场方法彻底改变了多图/视频场景捕获的新视角合成。然而取得高视觉质量仍需神经网络花费大量时间训练和渲染,同时最近较快的方法都无可避免地以质量为代价。对于无边界的完整场景(而不是孤立的对象)和 10…...

数据库管理系统,数据库,sql的基本介绍以及它们之间的关系

数据库管理系统(Database Management System,简称DBMS)是一种软件工具或系统,用于管理和维护数据库的创建、访问、更新和管理。DBMS允许用户在数据库中存储、检索和操作数据,同时提供了数据安全性、完整性和一致性的控…...

【Flowable】Springboot使用Flowable(一)

一、项目依赖 <dependency><groupId>org.flowable</groupId><artifactId>flowable-engine</artifactId><version>6.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>my…...

戳泡泡小游戏

欢迎来到程序小院 戳泡泡 玩法&#xff1a; 鼠标点击上升的起泡泡&#xff0c;点击暴躁记录分数&#xff0c;不要让泡泡越过屏幕&#xff0c;共有三次复活生命&#xff0c;会有随机星星出现&#xff0c;点击即可暴躁全屏哦^^。开始游戏https://www.ormcc.com/play/gameStart/1…...

Redis缓存

1. Redis缓存相关问题 1.1 缓存穿透 缓存穿透是指查询一个数据库一定不存在的数据。 我们以前正常的使用Redis缓存的流程大致是&#xff1a; 1、数据查询首先进行缓存查询 2、如果数据存在则直接返回缓存数据 3、如果数据不存在&#xff0c;就对数据库进行查询&#xff0…...

mysql 插入更新数据

insert into insert into 语句进行插入时&#xff0c;如果插入的字段包含 主键或者唯一索引字段&#xff0c;那么&#xff0c; 1&#xff09;主键或唯一索引 已存在&#xff0c;则插入失败 1062 - Duplicate entry 1 for key PRIMARY 2&#xff09;只有主键或者唯一索 引不存…...

系统架构设计高级技能 · 软件产品线

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 软件产品线 一、产品线概述二、产品线的过程模型2.1 双生命…...

C语言学习系列-->字符函数和字符串函数

文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…...

尖端AR技术如何在美国革新外科手术实践?

AR智能眼镜已成为一种革新性的工具&#xff0c;在外科领域具有无穷的优势和无限的机遇。Vuzix与众多医疗创新企业建立了长期合作关系&#xff0c;如Pixee Medical、Medacta、Ohana One、Rods & Cones、Proximie等。这些公司一致认为Vuzix智能眼镜可有效提升手术实践&#x…...

【木板】Python实现-附ChatGPT解析

1.题目 木板 时间限制:1s 空间限制:256MB 限定语言:不限题目描述: 小明有n块木板,第i (1<=i<=n) 块木板的长度为ai.小明买了一块长度为m的木料,这块木料可以切割成任意块,拼接到已有的木板上用来加长木板。 小明想让最短的木板尽量长。 请问小明加长木板后,最短木板…...

第一章:绪论

1.1 系统架构概述 架构是体现在组件中的一个系统的基本组织、它们彼此的关系与环境的关系以及指导它的设计和发展的原则。 系统是组织起来完成某一特定功能火一组功能的组件集。系统这个术语包括了单独的应用程序、传统意义上的系统、子系统、系统之系统、产品线、整个企业及…...

C++面试知识点总结

知识点总结 <<符号表示该语句将把这个字符串发送给cout&#xff1b;该符号指出了信息流动的路径&#xff1b;cout的对象属性包括一个插入运算符&#xff08;<<&#xff09;&#xff0c;它可以将其右侧的信息插入到流中&#xff0c;endl:重起一行。在输出流中插入en…...

学院门户网站建设必要性/郑州优化公司有哪些

1 背景 需要一款redis可视化工具 2 工具推荐 一直以来我们习惯使用 RedisDesktopManager&#xff0c;但是库里面数据太多&#xff0c;会卡顿 推荐修复了此问题的工具 Another Redis Desktop Manager 3 下载 https://github.com/qishibo/AnotherRedisDesktopManager/releases…...

做微网站的公司哪家好呢/网站维护

88. 合并两个有序数组 倒过来遍历即可。 空间复杂度&#xff1a;O(1)O(1)O(1) class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 m - 1, p2 n - 1;int tail m n - 1;int cur;while (p1 > 0 || …...

出名的网站建设软件/网站推广怎么做才有效果

我原来的Fragment里面有下面单独的函数&#xff0c;一切都很好。但是我把它移到一个自己创建的类里面就出问题了。怎么办呢&#xff1f; public void onReadClick(View view) {InputStream stream getResources().openRawResource(R.raw.stock_record); //... } public voi…...

flash工作室网站模板/seo优化专员

1. 类和对象 1.1 类和对象的理解【理解】 客观存在的事物皆为对象 &#xff0c;所以我们也常常说万物皆对象。 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象类是对象的数据类型&#xff0c;类是具有相同属性和行为的一组对象的集合简单理解&#xff1a;…...

喀什网站建设公司/一键生成原创文案

Processing入门简介 http://blog.csdn.net/mysunnytime/article/details/16104723 Processing官方教程 https://processing.org/tutorials/gettingstarted/ Processing程序中重写了两个函数&#xff1a;setup()和draw()。 setup()是在程序开始时调用的函数&#xff0c;只执…...

怀柔做网站的公司/今日头条新闻军事

n个串长度为m 然后n个串 问可以最少移动多少次 然后是密码中有数字 字母 然后其他的 都至少一个 光标最初在左边 可以直接往右移到最后一个 处理出每行到数字 字母 其他的最小移动数目 然后暴力 列举 数字 字母 其他 出现的行 #include<stdio.h> #include<algorithm…...