news 2026/1/29 9:29:08

机器学习中的决策树算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器学习中的决策树算法

摘要:决策树是一种基于树形结构的分类和预测算法,通过递归拆分数据生成决策规则。它分为分类树(用于类别预测)和回归树(用于数值预测)两种类型,使用基尼指数或信息增益作为分割标准。算法通过计算基尼分数、拆分数据集和评估所有分割来构建树结构,最终形成由决策节点和终端节点组成的预测模型。Python实现中可利用scikit-learn库加载鸢尾花数据集,训练决策树分类器并评估准确率,还能可视化树结构。该算法简单直观,适合处理分类问题,但需注意过拟合风险。

目录

决策树算法的类型

决策树算法的实现

基尼指数

分裂创作

建树

第一部分:终端节点的创建

第二部分:递归拆分

预测

假设

Python 实现

完整实现示例


决策树算法是一种基于层次树的算法,用于根据一组规则对结果进行分类或预测。它的工作原理是根据输入特征的值将数据拆分为子集。该算法递归地拆分数据,直到达到一个点,使每个子集的数据属于同一类或目标变量的值相同。由此生成的树是一组决策规则,可用于进行预测或分类新数据。

决策树算法通过选择最佳特征来在每个节点分割数据。最好的特征是能带来最多信息增益或最多熵减少的特征。信息增益是通过在特定特征处拆分数据所获得的信息量,而熵则是数据随机性或无序性的度量。算法利用这些指标确定最佳特征 在每个节点分割数据。

以下给出的二叉树示例,用于预测一个人是否适合,提供年龄、饮食习惯和锻炼习惯等多种信息——

在上述决策树中,问题是决策节点,最终结果是叶子。

决策树算法的类型

决策树算法主要有两种类型 −

  • 分类树− 分类树用于将数据分类为不同的类别或类别。它的工作原理是根据输入特征的值将数据划分为子集,并将每个子集分配给不同的类别。

  • 回归树− 回归树用于预测数值或连续变量。它的工作原理是根据输入特征的值将数据划分为子集,并为每个子集分配一个数值。

决策树算法的实现

基尼指数

它是用于评估数据集中二元分裂的成本函数名称,并与类别目标变量成功或失败相关。

基尼指数越高,均匀性越高。完美的基尼指数值为0,最差值为0.5(对于2类问题)。分裂的基尼指数可以通过以下步骤计算 −

  • 首先,利用公式p^2+q^2计算子节点的基尼指数,这是成功与失败概率的平方和。

  • 接着,利用该分段中每个节点的加权基尼得分计算分裂的基尼指数。

分类与回归树(CART)算法使用基尼方法生成二元分割。

分裂创作

拆分基本上就是在数据集中包含一个属性和一个值。我们可以通过以下三个部分创建数据集分割 −

  • 第一部分:基尼得分计算 − 我们刚在上一节讨论过这一部分。

  • 第二部分:拆分数据集− 可以定义为将数据集分为两行列表,每个行的索引为属性,并有该属性的拆分值。在从数据集中获得右组和左组后,我们可以利用第一部分计算的基尼分数来计算分裂的值。拆分值将决定属性属于哪个组。

  • 第三部分:评估所有拆分− 在找到基尼分数并拆分数据集后,下一步是评估所有拆分。为此,首先我们必须将每个属性关联的每个值作为候选拆分进行检查。然后我们需要通过评估拆分成本来找到最佳的拆分方案。最佳分割将作为决策树中的节点使用。

建树

我们知道树有根节点和终端节点。创建根节点后,我们可以通过以下两部分 − 构建树

第一部分:终端节点的创建

在创建决策树的终端节点时,一个重要点是决定何时停止增长树或创建更多终端节点。它可以通过两个标准实现,即最大树深度和最小节点记录数,具体如下 −

  • 最大树深度− 顾名思义,是树中根节点之后节点的最大数量。一旦树达到最大深度,即树拥有最大终端节点数,我们必须停止添加终端节点。

  • 最小节点记录− 它可以定义为给定节点负责的最少训练模式数量。一旦树达到这些最小节点记录或以下,我们必须停止添加终端节点。

终端节点用于最终预测。

第二部分:递归拆分

当我们理解了何时创建终端节点后,现在可以开始构建我们的树了。递归拆分是一种构建树的方法。在这种方法中,一旦创建了节点,我们可以递归地在每个数据组上创建子节点(添加到现有节点上的节点),这些数据是通过拆分数据集生成的,通过反复调用同一个函数。

预测

构建决策树后,我们需要对其做出预测。基本上,预测涉及在决策树中导航,并使用特定的数据行。

我们可以像上面一样,借助递归函数做出预测。同样的预测例程会再次调用左节点或子节点。

假设

以下是我们在创建决策树时所做的一些假设 −

  • 在准备决策树时,训练集作为根节点。

  • 决策树分类器倾向于特征值为类别。如果你想使用连续值,那么在建模之前必须先进行离散化。

  • 基于属性值,记录被递归分布。

  • 统计方法将用于将属性放置在根节点 i.e.as 内部节点的任何节点位置。

Python 实现

让我们用一个流行的分类任务数据集 Iris 数据集,在 Python 中实现决策树算法。其中包含150朵鸢尾花样本,每种花具有四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。花朵分为三个纲:长花、绿花和维吉尼亚。

首先,我们导入必要的库并加载数据集 −

import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier # Load the iris dataset iris = load_iris() # Split the dataset into training and testing sets X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0)

然后我们创建一个决策树分类器的实例,并用训练集 − 进行训练

# Create a Decision Tree classifier dtc = DecisionTreeClassifier() # Fit the classifier to the training data dtc.fit(X_train, y_train)

我们现在可以使用训练好的分类器对测试集 − 进行预测

# Make predictions on the testing data y_pred = dtc.predict(X_test)

我们可以通过计算分类器的准确性 − 来评估其性能

# Calculate the accuracy of the classifier accuracy = np.sum(y_pred == y_test) / len(y_test) print("Accuracy:", accuracy)

我们可以用 Matplotlib 库 − 可视化决策树

import matplotlib.pyplot as plt from sklearn.tree import plot_tree # Visualize the Decision Tree using Matplotlib plt.figure(figsize=(20,10)) plot_tree(dtc, filled=True, feature_names=iris.feature_names, class_names=iris.target_names) plt.show()

sklearn.tree模块中的plot_tree函数可用于绘制决策树。我们可以输入训练好的决策树分类器,填充参数填充节点颜色,feature_names参数标记特征,以及标记目标类的class_names参数。我们还指定了figsize参数 设置图形大小并调用显示函数以显示图表。

完整实现示例

以下是使用 iris 数据集 − 的完整示例,使用 Python 中

import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier # Load the iris dataset iris = load_iris() # Split the dataset into training and testing sets X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0) # Create a Decision Tree classifier dtc = DecisionTreeClassifier() # Fit the classifier to the training data dtc.fit(X_train, y_train) # Make predictions on the testing data y_pred = dtc.predict(X_test) # Calculate the accuracy of the classifier accuracy = np.sum(y_pred == y_test) / len(y_test) print("Accuracy:", accuracy) # Visualize the Decision Tree using Matplotlib import matplotlib.pyplot as plt from sklearn.tree import plot_tree plt.figure(figsize=(20,10)) plot_tree(dtc, filled=True, feature_names=iris.feature_names, class_names=iris.target_names) plt.show()

输出

这将生成一个如下的决策树图——

Accuracy: 0.9777777777777777

如你所见,图中展示了决策树的结构,每个节点代表基于特征值的决策,每个叶节点代表一个类别或数值。每个节点的颜色表示该节点样本的多数类别或数值,底部的数字表示到达该节点的样本数量。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/26 23:09:11

【智能家居开发内幕】:PHP工程师必须掌握的7个场景模式优化策略

第一章:PHP在智能家居系统中的角色与挑战PHP作为一种成熟且广泛部署的服务器端脚本语言,近年来在智能家居系统的后端开发中展现出独特价值。尽管现代物联网生态更常提及Node.js或Python,PHP凭借其稳定的LAMP架构支持、丰富的扩展库以及成熟的…

作者头像 李华
网站建设 2026/1/25 4:42:18

【PHP物联网协议解析实战】:掌握5大核心协议的底层通信机制

第一章:PHP物联网协议解析概述 在物联网(IoT)快速发展的背景下,设备间通信依赖于多种轻量级网络协议。PHP 作为一种广泛应用于 Web 开发的脚本语言,虽然并非传统意义上的嵌入式或实时系统开发语言,但凭借其…

作者头像 李华
网站建设 2026/1/26 12:50:58

PHP构建智能家居自动化系统(场景模式开发全解析)

第一章:PHP构建智能家居自动化系统概述随着物联网技术的快速发展,智能家居系统逐渐走入日常生活。PHP 作为一种成熟且广泛使用的服务器端脚本语言,凭借其快速开发、丰富的库支持以及与 Web 技术的天然集成能力,正被越来越多地应用…

作者头像 李华
网站建设 2026/1/27 19:41:29

权限控制难题一网打尽,基于PHP低代码的RBAC与ABAC融合实践

第一章:PHP低代码权限管理的现状与挑战在当前快速迭代的企业应用开发中,低代码平台凭借其高效构建能力成为主流选择。PHP作为长期活跃于Web开发领域的语言,被广泛集成于各类低代码系统中,尤其在权限管理模块中承担着核心角色。然而…

作者头像 李华
网站建设 2026/1/25 4:42:13

PHP服务性能突降?阈值设置不当是元凶(监控调优实战案例曝光)

第一章:PHP服务性能突降?阈值设置不当是元凶(监控调优实战案例曝光)在一次线上PHP服务突发性能下降的排查中,团队发现系统负载飙升但CPU与内存使用率却处于正常范围。深入分析后定位到问题根源:APM监控工具…

作者头像 李华
网站建设 2026/1/25 4:42:11

揭秘PHP如何驱动智能家居场景模式:从入门到精通的3个关键步骤

第一章:PHP 智能家居场景模式概述在现代物联网架构中,智能家居系统通过集成传感器、执行器与中央控制逻辑,实现对家庭环境的自动化管理。PHP 作为一种成熟的服务器端脚本语言,虽然常用于 Web 开发,但在轻量级智能家居场…

作者头像 李华