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

python机器学习——决策树

决策树

# 模块导入
from sklearn.tree import ExtraTreeRegressor as ETR, DecisionTreeRegressor as DTR

ExtraTreeRegressorDecisionTreeRegressor是scikit-learn库中的两种回归模型,用于拟合和预测连续型目标变量。

决策树是一种基于树结构的机器学习算法,用于解决分类和回归问题。它通过对数据的特征进行一系列判断和分支,逐步将数据集划分成不同的子集,最终得到一个基于特征的树形结构,用于预测新数据的类别或数值。

决策树算法的核心思想是在每个节点上选择最有价值的特征进行划分,使得子节点间的纯度尽可能高,同时保持树的简单性。在分类任务中,纯度通常指子节点中样本所属类别的比例;在回归任务中,纯度通常指子节点中样本目标变量的方差或标准差

决策树在处理离散型和连续型特征时有不同的处理方式,其中最常见的方法是使用信息增益、信息增益比、基尼指数等指标进行节点划分。对于过拟合问题,可以通过剪枝、随机森林等方法进行处理。

两种树对比

DecisionTreeClassifier和DecisionTreeRegressor是决策树算法的两个变体,用于解决分类和回归问题。它们的主要区别在于所解决的问题类型和输出类型。

  1. DecisionTreeClassifier(决策树分类器):
    • 问题类型:DecisionTreeClassifier用于解决分类问题,即将样本分为不同的类别。
    • 输出类型:其输出是一个离散的类别标签,表示样本属于哪个类别。
  2. DecisionTreeRegressor(决策树回归器):
    • 问题类型:DecisionTreeRegressor用于解决回归问题,即预测连续目标变量的值。
    • 输出类型:其输出是一个连续的数值,表示预测的目标变量的值。

除了上述区别,DecisionTreeClassifier和DecisionTreeRegressor在算法实现上也有一些略微的差异:

  • 分割准则:分类树通常使用基尼系数(Gini index)或熵(entropy)来度量特征的重要性,以选择最佳的分割点。而回归树通常使用平方误差(mean squared error)作为分割准则。
  • 剪枝策略:为了防止过拟合,决策树通常需要进行剪枝。对于分类树来说,常用的剪枝策略有预剪枝和后剪枝。对于回归树来说,通常采用贪心策略进行自底向上的剪枝。

总结起来,DecisionTreeClassifier和DecisionTreeRegressor主要区别在于解决的问题类型和输出类型。前者适用于分类问题,输出离散类别标签;后者适用于回归问题,输出连续数值。

决策树中的专业名词

  • 节点(Node):表示决策树上的一个数据处理单元,包含一个或多个子节点和一个父节点。
  • 根节点(Root Node):表示决策树的起始节点,没有父节点。
  • 叶节点(Leaf Node):表示决策树的终止节点,没有子节点。
  • 内部节点(Internal Node):表示除根节点和叶节点外的其他节点,拥有一个或多个子节点。
  • 特征(Feature):表示决策树划分节点时使用的属性或特征值,可以是离散型或连续型。
  • 阈值(Threshold):表示用于划分连续型特征的阈值,通常是根据特征值的中位数或平均值确定的。
  • 深度(Depth):表示决策树从根节点到某个节点的路径长度,根节点的深度为0。
  • 路径(Path):表示从根节点到叶节点的一条路径,由一系列节点和边组成。
  • 分支(Branch):表示从一个节点到其子节点的一条边。
  • 剪枝(Pruning):表示对决策树进行修剪,以防止模型过拟合。常用的剪枝方法有预剪枝(Pre-Pruning)和后剪枝(Post-Pruning)。
  • 信息增益(Information Gain):表示在某个节点上划分前后数据集的信息熵差异,用于选择最佳划分特征。
  • 基尼指数(Gini Index):表示在某个节点上划分前后数据集的基尼系数差异,用于选择最佳划分特征。

DecisionTreeRegressor

导入模块

from sklearn.tree import DecisionTreeRegressor, ExtraTreeRegressor

创建模型对象

dtr = DecisionTreeRegressor(max_depth=None, criterion='mse', splitter='best', random_state=None)

参数说明

  • max_depth:决策树的最大深度,默认为None,表示不限制深度。
  • criterion:节点划分的标准,可选’mse’(均方误差)或’mae’(平均绝对误差),默认为’mse’。
  • splitter:节点划分的策略,可选’best’(最优划分)或’random’(随机划分),默认为’best’。
  • random_state:随机种子,用于重复实验。

拟合模型

dtr.fit(X,y)

X是一个二维数组或者数据框,其中每一行代表一个样本,每一列表示一个特征

y是目标变量向量,是一个一维数组或列表,其中每个元素表示一个样本的目标值

预测

y_pred_dtr = dtr.predict(X_test)

其中X_test是我们待预测的新特征矩阵

示例代码

数据分为训练集和测试集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

train_test_split(X, y, test_size=0.2, random_state=42) 是一个常用的函数调用,用于将数据集 X 和对应的目标变量 y 划分为训练集和测试集。具体解释如下:

  • X:表示样本特征矩阵,其中每一行代表一个样本,每一列代表一个特征。
  • y:表示目标变量(或标签),是与样本特征矩阵 X 对应的目标值。
  • test_size=0.2:表示将数据集划分为训练集和测试集时,测试集的大小为全部数据的 20%。
  • random_state=42:表示设置随机数种子为 42,用于控制随机划分的重现性。

该函数会返回划分后的训练集和测试集,以便后续在机器学习模型中使用。具体返回结果会有以下四个元组:

  • X_train:表示划分后的训练集样本特征。
  • X_test:表示划分后的测试集样本特征。
  • y_train:表示划分后的训练集目标变量。
  • y_test:表示划分后的测试集目标变量。

通过这个函数可以确保训练集和测试集的划分是随机的,并且可以重复该划分过程。同时,通过指定随机数种子,可以使得每次运行时得到相同的划分结果,以保持实验的可重现性。

具体代码

from sklearn.datasets import load_diabetes # 导入糖尿病数据集
from sklearn.model_selection import train_test_split # 将数据划分为训练集和测试集
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error # 计算均方误差# 加载糖尿病数据集
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# X_train, X_test, y_train, y_test 分别是 训练集样本特征矩阵 测试集样本特征矩阵 训练集目标向量 测试集目标向量# 创建决策树回归模型dtr = DecisionTreeRegressor(max_depth=5, random_state=42)# 训练模型dtr.fit(X_train, y_train)# 预测测试集y_pred_dtr = dtr.predict(X_test)# 评估模型性能mse = mean_squared_error(y_test, y_pred_dtr)
print("均方误差 (MSE):", mse) # 3600 均方误差较大,需要改进模型

均方误差

均方误差(Mean Squared Error,MSE)是一种常用的回归模型评估指标。它用于衡量模型预测结果与真实值之间的差异程度,具体计算方式如下:

MSE = (1/n) * Σ(yᵢ - ŷᵢ)²

其中,n 是样本数量,yᵢ 是真实值,ŷᵢ 是模型的预测值。

MSE 的计算方法是将每个样本的预测误差平方后求和,再除以样本数量。因为误差被平方,所以 MSE 比较敏感,较大的误差会被放大,而较小的误差则相对较小。

对于 MSE 来说,**数值越小表示模型的预测结果与真实值之间的差异越小,模型的拟合能力越好。**当 **MSE 为0时,表示模型完全拟合了训练数据,但这可能意味着模型过于复杂,存在过拟合的风险。**通常情况下,我们希望选择一个使得 MSE 较小且在训练集和测试集上表现一致的模型。

需要注意的是,MSE 的值与数据集的单位相关,因此无法直接进行跨数据集的比较。在评估模型时,可以将 MSE 与其他模型的 MSE 进行比较,或者将其与问题的背景和要求相结合来进行评估,例如与实际误差的大小进行比较或与领域专家的知识相结合。

模型优化

要修改决策树的参数、进行剪枝以及使用基尼系数进行划分,使得模型更加优化,通常需要使用机器学习库来实现

首先,我们导入所需的库和数据集:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

加载鸢尾花数据集并将其分为训练集和测试集:

data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

创建决策树分类器对象,并设置参数:

clf = DecisionTreeClassifier(criterion='gini', max_depth=None, random_state=42)

其中,criterion参数设置了用于划分的准则,这里选择了基尼系数(gini index)。max_depth参数表示树的最大深度,设置为None表示不限制深度。random_state参数用于确定每次运行时的随机性,以便结果可重复。

拟合(训练)决策树分类器:

clf.fit(X_train, y_train)

使用训练好的模型进行预测:

y_pred = clf.predict(X_test)

计算预测的准确率:

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

接下来,我们可以进行剪枝。

首先,我们可以使用预剪枝设置max_depth参数限制树的最大深度:

clf_pruned = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)

然后,重复之前的拟合、预测和准确率计算过程:

clf_pruned.fit(X_train, y_train)
y_pred_pruned = clf_pruned.predict(X_test)
accuracy_pruned = accuracy_score(y_test, y_pred_pruned)
print("剪枝后的准确率:", accuracy_pruned)

最后,基于基尼系数的划分是决策树算法的默认选择,所以不需要额外的代码来设置它。

相关文章:

python机器学习——决策树

决策树 # 模块导入 from sklearn.tree import ExtraTreeRegressor as ETR, DecisionTreeRegressor as DTRExtraTreeRegressor和DecisionTreeRegressor是scikit-learn库中的两种回归模型,用于拟合和预测连续型目标变量。 决策树是一种基于树结构的机器学习算法&…...

__attribute__((__used__)) 和 __attribute__((__section__(“*“ “*“)))的使用

见&#xff1a;haproxy代码 C语言注册函数和调用函数&#xff0c;便于模块化开发和编程。 #include <stdio.h>#ifdef __APPLE__ #define HA_SECTION(s) __attribute__((__section__("__DATA, " s))) #define HA_SECTION_START(s) __asm("…...

webgoat-(A1)SQL Injection

SQL Injection (intro) SQL 命令主要分为三类&#xff1a; 数据操作语言 &#xff08;DML&#xff09;DML 语句可用于请求记录 &#xff08;SELECT&#xff09;、添加记录 &#xff08;INSERT&#xff09;、删除记录 &#xff08;DELETE&#xff09; 和修改现有记录 &#xff…...

Flink的API分层、架构与组件原理、并行度、任务执行计划

Flink的API分层 Apache Flink的API分为四个层次&#xff0c;每个层次都提供不同的抽象和功能&#xff0c;以满足不同场景下的数据处理需求。下面是这四个层次的具体介绍&#xff1a; CEP API&#xff1a;Flink API 最底层的抽象为有状态实时流处理。其抽象实现是Process Functi…...

Transformer:开源机器学习项目,上千种预训练模型 | 开源日报 No.66

huggingface/transformers Stars: 113.5k License: Apache-2.0 这个项目是一个名为 Transformers 的开源机器学习项目&#xff0c;它提供了数千种预训练模型&#xff0c;用于在文本、视觉和音频等不同领域执行任务。该项目主要功能包括&#xff1a; 文本处理&#xff1a;支持…...

Corel VideoStudio 会声会影2024剪辑中间的视频怎么删 剪辑中音乐太长怎么办

我很喜欢视频剪辑软件Corel VideoStudio 会声会影2024&#xff0c;因为它使用起来很有趣。它很容易使用&#xff0c;但仍然给你很多功能和力量。视频剪辑软件Corel VideoStudio 会声会影2023让我与世界分享我的想法&#xff01;“这个产品的功能非常多&#xff0c;我几乎没有触…...

数据结构初阶---复杂度的OJ例题

复杂度的OJ例题 一、消失的数字1.思路一2.思路二3.思路三 二、旋转数组1.思路一2.思路二3.思路三 一、消失的数字 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(N)时间内完成吗&#xff1f; 链接&#xff1a;力扣&…...

Prometheus|云原生|grafana的admin用户密码重置备忘记录

很久很久以前部署的一个Prometheus套装里的grafana密码给忘记了&#xff0c;回忆总是很痛苦&#xff0c;因此还是在这里简单的记录一下&#xff0c;下次就不需要满世界反翻找了。 一&#xff0c; 改库重置密码为admin grafana密码存放在哪里的&#xff1f; 必须说明一下&am…...

[hive]中的字段的数据类型有哪些

Hive中提供了多种数据类型用于定义表的字段。以下是Hive中常见的数据类型&#xff1a; 布尔类型&#xff08;Boolean&#xff09;&#xff1a;用于表示true或false。 字符串类型&#xff08;String&#xff09;&#xff1a;用于表示文本字符串。 整数类型&#xff08;Intege…...

第六章 树【数据结构和算法】【精致版】

第六章 树【数据结构和算法】【精致版】 前言版权第六章 树6.1 应用实例6.2 树的概念6.2.1树的定义与表示6.2.2 树的基本术语6.2.3树的抽象数据类型定义 6.3 二叉树6.3.1二叉树的定义6.3.2 二叉树的性质6.3.3 二叉树的存储 6.4 二叉树的遍历6.4.1 二叉树的遍历及递归实现**1-二…...

第九章:Dynamic Symbolic Execution

文章目录 Dynamic Symbolic Executionoverviewmotivationdynamic symbolic execution常用的其他技术对比Random Testingsymbolic executionCombined static and symbolic - Dynamic Execution (DSE)step1: 初始化两个具体的值 x,ystep2: 根据定义得出 z 的 concrete value 和 s…...

在搜索引擎中屏蔽csdn

csdn是一个很好的技术博客&#xff0c;里面信息很丰富&#xff0c;我也喜欢在csdn上做技术笔记。 但是CSDN体量太大&#xff0c;文章质量良莠不齐。当在搜索引擎搜索技术问题时&#xff0c;搜索结果中CSDN的内容占比太多&#xff0c;导致难以从其他优秀的博客平台中获取信息。因…...

Linux开发工具的使用(vim、gcc/g++ 、make/makefile)

文章目录 一 &#xff1a;vim1:vim基本概念2:vim的常用三种模式3:vim三种模式的相互转换4:vim命令模式下的命令集- 移动光标-删除文字-剪切/删除-复制-替换-撤销和恢复-跳转至指定行 5:vim底行模式下的命令集 二:gcc/g1:gcc/g的作用2:gcc/g的语法3:预处理4:编译5:汇编6:链接7:函…...

MySQL(10):创建和管理表

基础知识 在 MySQL 中&#xff0c;一个完整的数据存储过程总共有 4 步&#xff0c;分别是&#xff1a;创建数据库、确认字段、创建数据表、插入数据。 要先创建一个数据库&#xff0c;而不是直接创建数据表&#xff1a;从系统架构的层次上看&#xff0c;MySQL 数据库系统从大到…...

Python赋值给另一个变量且不改变原变量

Python赋值给另一个变量且不改变原变量 在Python中&#xff0c;如果你想将一个变量的值赋给另一个变量&#xff0c;同时保持原变量不变&#xff0c;你可以使用复制&#xff08;copy&#xff09;而不是引用&#xff08;reference&#xff09;。Python中的变量通常是通过引用&…...

PHP进销存ERP系统源码

PHP进销存ERP系统源码 系统介绍&#xff1a; 扫描入库库存预警仓库管理商品管理供应商管理。 1、电脑端手机端&#xff0c;手机实时共享&#xff0c;手机端一目了然。 2、多商户Saas营销版 无限开商户&#xff0c;用户前端自行注册&#xff0c;后台管理员审核开通 3、管理…...

npm i 报错:Cannot read properties of null (reading ‘refs‘)

问题: 旧项目要更改东西&#xff0c;重新部署上线的时候&#xff0c;发现页面显示有异常。当时在开发环境是没有问题的。后经排查是一个引入swiper的页面报错了&#xff0c;只要注释掉swiper插件&#xff0c;就没问题了&#xff0c;但这肯定是不行的。 原因&#xff1a; npm和…...

C#学习中关于Visual Studio中ctrl+D快捷键(快速复制当前行)失效的解决办法

1、进入VisualStudio主界面点击工具——>再点击选项 2、进入选项界面后点击环境——>再点击键盘&#xff0c;我们可用看到右边的界面的映射方案是VisualC#2005 3、 最后点击下拉框&#xff0c;选择默认值&#xff0c;点击之后确定即可恢复ctrlD的快捷键功能 4、此时可以正…...

银河E8,吉利版Model 3:5米大车身、45寸大屏、首批8295座舱芯

作者 | Amy 编辑 | 德新 吉利银河E8在曝光后多次引爆热搜&#xff0c;李书福更是赞誉有加&#xff0c;称其为「买了就直接享受」。这款备受瞩目的车型于 10月30日晚首次亮相。 虽然新车外观在今年上海车展上早已曝光&#xff0c;但这次的发布会却带来了不少惊喜。新车架构以及…...

技术分享 | 被测项目需求你理解到位了么?

需求分析是开始测试工作的第一步&#xff0c;产品会先产出一个需求文档&#xff0c;然后会组织需求宣讲&#xff0c;在需求宣讲中分析需求中是否存在问题&#xff0c;然后宣讲结束后&#xff0c;通过需求文档分析测试点并且预估排期。所以对于需求的理解非常重要。 需求文档 …...

[MRCTF2020]你传你呢1

提示 只对php以及phtml文件之类的做了防护content-type.htaccess文件 这里就不整那么麻烦直接抓包测试 首先对后缀测试看过滤了哪些 (php php3 pht php5 phtml phps) 全部被ban了 到这里的后续思路通过上传一些配置文件把上传的图片都以php文件执行 尝试上传图片码, 直接上传成…...

一些对程序员有用的网站

当你遇到问题时 Stack Overflow&#xff1a;订阅他们的每周新闻和任何你感兴趣的主题Google&#xff1a;全球最大搜索引擎必应&#xff1a;在你无法使用Google的时候CSDN&#xff1a;聊胜于无AI导航一号AI导航二号 新闻篇 OSCHINA&#xff1a;中文开源技术交流社区 针对初学…...

小程序使用echarts(超详细教程)

小程序使用echarts第一步就是先引用到小程序里面&#xff0c;可以直接从这里下载 文件很多&#xff0c;我们值下载 ec-canvas 就好&#xff0c;下载完成后&#xff0c;直接放在pages同级目录下 index.js 在我们需要的页面的 js 文件顶部引入 // pages/index/index.js impor…...

js控制输入框中的光标位置

主要逻辑 主要应用selectionStart、selectionEnd来实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…...

Openssl生成证书-nginx使用ssl

Openssl生成证书并用nginx使用 安装openssl yum install openssl -y创库目录存放证书 mkdir /etc/nginx/cert cd /etc/nginx/cert配置本地解析 cat >>/etc/hosts << EOF 10.10.10.21 kubernetes-master.com EOF10.10.10.21 主机ip、 kubernetes-master.com 本…...

Go语言实现数据结构栈和队列

Go语言实现数据结构栈和队列 1、栈 package mainimport "fmt"func main(){// 创建栈stack : make([]int, 0)// push压入栈stack append(stack, 10)// pop弹出v : stack[len(stack)-1]// 10fmt.Println(v)stack stack[:len(stack)-1]// 检查栈空// truefmt.Printl…...

【vscode】Window11环境下vscode使用Fira Code字体【教程】

【vscode】Window11环境下vscode使用Fira Code字体【教程】 文章目录 【vscode】Window11环境下vscode使用Fira Code字体【教程】1. 下载Fira Code字体2. 安装Fira Code字体3. 配置vscode4. 效果如下Reference 如果想要在Ubuntu环境下使用Fira Code字体&#xff0c;可以参考我的…...

Sandcastle生成文档

下载: https://github.com/EWSoftware/SHFB/releases 使用Sandcastle生成Api文档需要使用对应程序集的注释xml 程序集dll作为数据源&#xff0c;通过对xml dll数据解析生成文档&#xff1b;所以主体步骤如下&#xff1a; 程序集资源生成创建配置.shfbproj项目编译构建文档 …...

P1368 【模板】最小表示法

题目描述 小敏和小燕是一对好朋友。 他们正在玩一种神奇的游戏&#xff0c;叫 Minecraft。 他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的&#xff0c;而且由于机器的要求&#xff0c;他们只能做到把这个工艺品最左边的方块放到最右边。 他们想&#xff0c;…...

【Hive】内部表(Managed Table)和外部表(External Table)相关知识点

在Hive中,有两种类型的表:外部表(External Table)和内部表(Managed Table)。它们在数据存储和管理方式上存在一些重要的区别。 本文就来对这些知识做一个总结。 1、如何在hive中创建内部表和外部表? 2、内部表和外部表的一些区别。 3、怎么查看一个表是内部表还是外部表…...