news 2026/3/10 9:52:39

机器学习中的决策树算法

作者头像

张小明

前端开发工程师

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/3/5 16:34:27

GLM-TTS能否用于宠物训练指令?高频音调狗能听懂的命令

GLM-TTS能否用于宠物训练指令?高频音调狗能听懂的命令 在智能家庭设备日益渗透日常生活的今天,宠物不再只是陪伴者,也越来越成为“智能化管理”的对象。尤其是犬类行为训练这一传统上依赖人力与经验的领域,正悄然迎来技术变革——…

作者头像 李华
网站建设 2026/3/8 22:25:52

PHP工业控制系统状态轮询机制深度解析(高频查询优化方案)

第一章:PHP工业控制系统状态轮询机制概述在工业自动化领域,实时监控设备运行状态是保障生产连续性的关键环节。PHP作为一种广泛应用于Web后端开发的脚本语言,虽非传统意义上的实时系统编程语言,但通过合理设计的状态轮询机制&…

作者头像 李华
网站建设 2026/3/10 2:50:41

语音合成中的连读处理:中文词语间自然过渡效果评估

语音合成中的连读处理:中文词语间自然过渡效果评估 在智能音箱清晨播报天气、有声书娓娓道来故事、客服机器人流畅回应咨询的今天,我们对“机器说话”的期待早已超越了“能听清”,转而追求“像人说的一样自然”。尤其是在中文语境下&#xff…

作者头像 李华
网站建设 2026/3/7 16:31:12

GLM-TTS能否用于自动驾驶车载提示?驾驶场景语音设计

GLM-TTS能否用于自动驾驶车载提示?驾驶场景语音设计 在高速公路上,驾驶员正专注前方路况,突然中控台传来一句机械、平板的警告:“请注意车道偏离。”声音毫无起伏,像极了十年前导航仪的播报。他下意识瞥了一眼后视镜—…

作者头像 李华
网站建设 2026/3/4 10:03:29

E_WARNING还是E_ERROR?PHP日志级别与格式设置,你真的懂吗?

第一章:E_WARNING还是E_ERROR?PHP日志级别与格式设置,你真的懂吗?在PHP开发中,正确理解和配置错误日志级别是保障系统稳定性和可维护性的关键。不同的错误类型对应不同的严重程度,而日志的记录方式直接影响…

作者头像 李华
网站建设 2026/3/8 19:54:49

语音克隆不再难!手把手教你部署GLM-TTS并调用token资源

语音克隆不再难!手把手教你部署GLM-TTS并调用token资源 在短视频、AI主播和个性化语音助手日益普及的今天,你是否也想过:能不能让机器“长”出我的声音?过去这需要大量录音训练、昂贵算力支持,而现在,只需一…

作者头像 李华