sk06.【scikit-learn基础】--『监督学习』之决策树 - 教程

news/2025/10/3 19:02:23/文章来源:https://www.cnblogs.com/slgkaifa/p/19124879

sk06.【scikit-learn基础】--『监督学习』之决策树 - 教程

决策树(Decision Tree)是一种常用的机器学习算法,广泛应用于分类和回归问题。

决策树通过树状结构来表示决策过程,每个内部节点代表一个特征或属性的测试,每个分支代表测试的结果,每个叶节点代表一个类别或值。

决策树的基本概念

  • 节点(Node):树中的每个点称为节点。根节点是树的起点,内部节点是决策点,叶节点是最终的决策结果。
  • 分支(Branch):从一个节点到另一个节点的路径称为分支。
  • 分裂(Split):根据某个特征将数据集分成多个子集的过程。
  • 纯度(Purity):衡量一个子集中样本的类别是否一致。纯度越高,说明子集中的样本越相似。

决策树的工作原理

决策树通过递归地将数据集分割成更小的子集来构建树结构。具体步骤如下:

  1. 选择最佳特征:根据某种标准(如信息增益、基尼指数等)选择最佳特征进行分割。
  2. 分割数据集:根据选定的特征将数据集分成多个子集。
  3. 递归构建子树:对每个子集重复上述过程,直到满足停止条件(如所有样本属于同一类别、达到最大深度等)。
  4. 生成叶节点:当满足停止条件时,生成叶节点并赋予类别或值。

决策树的构建标准

在构建决策树时,我们需要选择最佳特征进行分割,常用的标准有:

1. 信息增益(Information Gain)

用于分类问题,衡量选择某一特征后数据集的纯度提升。计算公式为:

其中 Entropy 是数据集的熵,用来衡量数据的不确定性。

2. 基尼指数(Gini Index)

也是用于分类问题的分裂标准,计算公式为:

其中 pi 是类别 i 的样本占比。基尼指数越小,表示数据集越纯净。

3. 均方误差(MSE)

用于回归问题,衡量预测值和真实值的差异。

MSE 越小,表示回归树的预测效果越好。

决策树的优缺点

优点

  • 易于理解和解释:决策树的结构直观,易于理解和解释。
  • 处理多种数据类型:可以处理数值型和类别型数据。
  • 不需要数据标准化:决策树不需要对数据进行标准化或归一化处理。

缺点

  • 容易过拟合:决策树容易过拟合,特别是在数据集较小或树深度较大时。
  • 对噪声敏感:决策树对噪声数据较为敏感,可能导致模型性能下降。
  • 不稳定:数据的小变化可能导致生成完全不同的树。

使用Python实现决策树

接下来,我们将使用Python的scikit-learn库来实现一个简单的决策树分类器。

1. 安装必要的库

首先,确保你已经安装了scikit-learn库。如果没有安装,可以使用以下命令进行安装:

pip install scikit-learn

2. 导入库并加载数据集

我们将使用scikit-learn自带的鸢尾花(Iris)数据集来演示决策树的使用。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
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=42)

3. 训练决策树模型

接下来,我们使用DecisionTreeClassifier来训练决策树模型。

# 创建决策树分类器
clf = DecisionTreeClassifier()
# 训练模型
clf.fit(X_train, y_train)

4. 预测与评估

使用训练好的模型对测试集进行预测,并评估模型的准确率。

# 对测试集进行预测
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}")
输出结果:
模型准确率: 1.00

5. 可视化决策树

为了更直观地理解决策树的结构,我们可以使用graphviz库来可视化决策树。

graphviz 下载地址:https://graphviz.org/download/

  • Windows 平台可以下载适用于 Windows 的安装包(.msi 文件)。
  • Linux 平台可以使用安装包的命令安装,如 apt install graphviz
  • macOS 平台安装命令 brew install graphviz。

也可以源码安装,下载最新的源码包(.tar.gz 文件)。

tar -zxvf graphviz-.tar.gz
cd graphviz-
./configure
make
sudo make install

安装完成后,可以通过以下命令验证 Graphviz 是否安装成功:

dot -V

输出类似以下内容,说明安装成功:

dot - graphviz version 12.2.1 (20241206.2353)

安装 graphviz 库:

pip install graphviz

然后,使用以下代码生成决策树的可视化图:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.tree import export_graphviz
import 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.3, 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(f"模型准确率: {accuracy:.2f}")
# 导出决策树为dot文件
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)
# 使用graphviz渲染决策树
graph = graphviz.Source(dot_data)
graph.render("iris_decision_tree")  # 保存为PDF文件
graph.view()  # 在浏览器中查看

执行以上代码,会生成一个 iris_decision_tree.pdf 文件,显示如下:

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

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

相关文章

20251001国庆模拟

Part 1 题目列表P7075 [CSP - S2020] 儒略日 P7076 [CSP - S2020] 动物园 P7077 [CSP - S2020] 函数调用 P7078 [CSP - S2020] 贪吃蛇Part 2 考试时间线 8:02 开题, 仅仅读了 10 分钟 T1 题目,就得出结论,大模拟。 …

线段树合并 [POI 2011] ROT-Tree Rotations

波兰人太神秘了,竟能出出来如此题目。 题意 给一棵树(读入不太寻常,这个容易处理,忽略不计), 每个叶子节点有一个权值,我们可以选择交换一些节点的左右子树(保证是二叉树,且要么是叶子要么左右子树都存在)。 …

CSS的选择器 - 指南

CSS的选择器 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…

ModuleNotFoundError: No module named wandb.keras

from wandb.keras import WandbCallback ModuleNotFoundError: No module named wandb.keras ================================ Successfully installed annotated-types-0.7.0 eval-type-backport-0.2.2 gitdb-4.0.1…

wordpress建站网注册公司流程和费用

0 前言 使用stm32官方可视化初始化代码生成工具STM32CubeMX生成的工程GCC编译选项默认不支持非对齐访问,在我们进行非对齐的访问时就会进入数据异常中断DAbt中。为了解决这一问题,我们需要在GCC编译选项中加上一处配置。 1 操作方法 右键STM32CubeIDE…

C# Net9的模块初始化器(Module Initializer)

Module Initializer 是为了让库/框架在程序集加载时,以 “CLR 保证的、只运行一次的、不依赖类型访问的” 方式执行初始化逻辑,从而避免静态构造函数的副作用和性能问题。Module Initializer 是为了让库/框架在程序集…

离线轻量大模型,Ollama部署到docker方法

来自豆包 将Ollama部署到Docker的步骤如下: 一、安装Docker环境启用系统功能(Windows系统):打开“控制面板” → “程序与功能” → “启用或关闭Windows功能”。 勾选 Hyper-V、虚拟机平台、Linux子系统(WSL)。…

flink执行图 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:华为Pura 80芯片细节曝光,预示着华为多款新品即将震撼登场!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

应用拓扑讲义整理 Chapter 6. 单纯复形(Simplicial Complexes)

Chapter 6. 单纯复形 6.1 单纯复形的基本概念 6.1.1 仿射空间 Definition 6.1(仿射空间)仿射空间是一个三元组 \((E, \overrightarrow E, +)\),其中 \(E\) 是点集,\(\overrightarrow E\) 是由自由向量或转移组成的…

完整教程:华为麒麟9010、9020、9030、9040系列芯片的性能参数及其与高通芯片的对比

完整教程:华为麒麟9010、9020、9030、9040系列芯片的性能参数及其与高通芯片的对比pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

AQS(ReentrantLock)源码浅析

管程 — Java同步的设计思想 管程:指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。 互斥:同一时刻只允许一个线程访问共享资源; 同步:线程之间如何通信、协作。 MESA模型 在管程的发展史上,先后出…

做网站app价格多少钱网站首页布局风格

编程笔记 html5&css&js 017 HTML样式 一、HTML样式二、CSS3小结 HTML样式是用来控制网页元素外观的一组属性和值。 一、HTML样式 可以通过以下几种方式来为HTML元素添加样式: 内联样式:直接在HTML元素的style属性中添加样式。例如:…

完整教程:【数据结构】快速排序与归并排序的实现

完整教程:【数据结构】快速排序与归并排序的实现2025-10-03 18:42 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

05. 事件处理

一、信号与槽在 QML 中,信号与槽机制是对象间通信的一种重要方式。它允许对象在其状态改变或发生特定事件时通知其他对象,并触发相应的处理函数。信号 是对象发出的通知,表明某个事件已经发生。槽 (信号处理器)是…

网站流量分析的指标有哪些wordpress京东主题

文章目录 第6章 逻辑斯谛回归与最大熵模型6.1 逻辑斯谛回归模型6.1.1 逻辑斯谛分布6.1.2 二项逻辑斯谛回归模型6.1.3 模型参数估计6.1.4 多项逻辑斯谛回归 《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第3章 k邻近邻法 《统计学习…

总结问题2 软工10.3

使用纯水机发生器公式进行不断的遍历, XN是上一个种子,它遍历出XN加1就是下一个种子。Jdk SIMULATOR outer point ln的方法中,它是利用了很多的重载,来实现不同的功能。关于4则运算,答题框的生成,可以以答题框为…

如何选择网站建设流程网站展示效果图

我想用来自Java的参数调用python程序。但是我的输出是空白。代码在这里。 Python代码在这里: import sys print(sys.argv[1]) Java代码在这里: public class PrintNumber{ public static void main(String[] args){ Process proc; try { proc Runtime.g…

BPL包无法调试的问题

转 由于系统结构是Host主程序动态加载BPL包的模式。所以用到了Package的调试,但无论如何有一个包就是无法调试(加断点不起作用)。经过N久的查找,发现: 1.包Package在编译,生成的时候会自动产生DCP和BPL文件,缺省…

学院网站群建设的目标网站开发背景和意义

国产大模型开源一哥再登场,最强双语LLM「全家桶」级开源!340亿参数超越Llama2-70B 为什么说大模型训练很难? - 知乎 GitHub - jeinlee1991/chinese-llm-benchmark: 中文大模型能力评测榜单:覆盖百度文心一言、chatgpt、阿里通义千…