决策树(Decision Tree)详细解释(带示例)

目录

基本概念

关键要素

工作原理

算法流程

示例

[Python 案例](#Python 案例)


决策树是一种广泛应用于机器学习和数据挖掘领域的算法,以下从基本概念、工作原理、算法流程等方面详细介绍:

基本概念

决策树是一种基于树结构的分类和回归算法,它通过对样本数据的特征进行测试和划分,将数据逐步分类或预测出数值结果。树中的每个内部节点表示一个属性上的测试,分支是测试输出,叶节点是类别或值。

关键要素

  • 节点
    • 根节点:决策树的起始节点,包含所有样本数据,是整个决策过程的开始。
    • 内部节点:每个内部节点对应一个特征的测试条件,根据该特征的不同取值将样本数据划分到不同的子节点。
    • 叶节点:表示决策的结果,即样本所属的类别或预测的数值。
  • 分支:连接节点之间的边,代表了特征的不同取值或取值范围,数据根据特征值沿着相应的分支向下传递。

工作原理

  • 特征选择:决策树构建的核心是选择合适的特征进行划分,以使得划分后的子节点数据纯度更高。常见的衡量指标有信息增益、信息增益比、基尼指数等。以信息增益为例,它衡量的是使用某个特征进行划分后,数据集信息熵的减少程度。信息增益越大,说明该特征对分类的贡献越大。
  • 树的生成:从根节点开始,根据选定的最优特征将数据集划分为多个子集,每个子集对应一个分支,然后对每个子集递归地进行特征选择和划分,直到满足预设的停止条件,如所有样本属于同一类别、没有更多特征可选择或达到预设的树的深度等。
  • 剪枝:为了防止过拟合,在决策树构建完成后,通常会进行剪枝操作。通过去掉一些分支来简化决策树结构,提高模型的泛化能力。

算法流程

  1. 开始时,将所有训练数据作为根节点。
  2. 计算每个特征的信息增益或其他划分指标。
  3. 选择信息增益最大或指标最优的特征作为当前节点的分裂特征。
  4. 根据该特征的不同取值,将数据划分为不同的子集,为每个子集创建一个子节点。
  5. 对每个子节点递归地重复步骤 2-4,直到满足停止条件。
  6. 对生成的决策树进行剪枝,得到最终的决策树模型。

示例

假设有一个判断某个人是否会去打篮球的数据集,包含三个特征:天气、温度、是否有朋友邀请,以及对应的是否去打篮球的结果,具体数据如下:

天气 温度 是否有朋友邀请 是否打篮球
晴天 高 是 是
晴天 中 是 是
阴天 高 否 否
阴天 中 是 是
雨天 低 否 否

首先计算各个特征的信息增益,假设计算后发现 "是否有朋友邀请" 的信息增益最大,则以 "是否有朋友邀请" 作为根节点进行划分。在 "是" 的分支下,基本都是 "是" 去打篮球,可将该分支的叶节点设为 "是";在 "否" 的分支下,再看其他特征,"天气" 的信息增益相对较大,以 "天气" 继续划分,"晴天" 和 "阴天" 的情况较少,假设根据已有数据判断 "晴天" 或 "阴天" 且无朋友邀请时不打篮球,"雨天" 且无朋友邀请时也不打篮球,最终构建出一个简单的决策树来判断是否会去打篮球。

Python 案例

下面使用 Python 的sklearn库来构建一个决策树分类器的案例,使用的是鸢尾花数据集:

python 复制代码
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import graphviz
from sklearn.tree import export_graphviz

# 加载鸢尾花数据集
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.2, random_state=42)

# 创建决策树分类器
clf = DecisionTreeClassifier()

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

# 预测测试集
y_pred = clf.predict(X_test)

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

# 可视化决策树
dot_data = export_graphviz(clf, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names,
                           filled=True, rounded=True, special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("iris_tree")

上述代码首先加载了鸢尾花数据集,然后将其划分为训练集和测试集,接着创建了一个决策树分类器并进行训练,最后对测试集进行预测并计算准确率,还将决策树进行了可视化。

相关推荐
米小虾2 小时前
Agent = 大脑 + 眼睛 + 手脚:一篇看懂现代 AI Agent 的骨架
人工智能
小小测试开发2 小时前
安全评测得分 0.9556 掉到 0.3257,只改了 top_k 和 prompt_style 之外的题面比例
人工智能·安全·prompt
slacker-kian2 小时前
[实践]-用LLM对文本结构化:把多段文本描述变成规范的 JSON 知识库
人工智能·llm·prompt·结构化·pydantic·one-shot 提示
死磕音视频2 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
品牌常新2 小时前
景区巡逻机器人怎么选?派宝S5全地形守护解析
运维·人工智能·机器人
凤山老林3 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
冬奇Lab3 小时前
LLM 驱动的自动化测试系列(13):Flaky Test 不是重跑几次就能解决的分类问题
人工智能·测试
血小溅3 小时前
当交付不再带来增长,医疗产品如何借 AI 持续进化?
人工智能
幻灭行度3 小时前
基于昇腾 910B NPU 部署 SenseVoiceSmall 语音识别服务
人工智能·语音识别