AI算法22-决策树算法Decision Tree | DT

目录

决策树算法概述

决策树算法背景

决策树算法简介

决策树算法核心思想

决策树算法的工作过程

特征选择

信息增益

信息增益比

决策树的生成

ID3算法

C4.5的生成算法

决策树的修剪

算法步骤

决策树算法的代码实现

决策树算法的优缺点

优点

缺点

决策树算法的应用场景

金融行业

医疗行业

电商行业

社交媒体

数据挖掘

回归任务

分类任务

教育领域

能源领域


决策树算法概述

决策树算法背景

我们在日常生活中经常会遇到一些选择需要去做一些选择,比如我们在找工作的时候每个人都希望能找到一个好的工作,但是公司那么多,工作种类那么多,什么样的工作才能算是好工作,这个时候就需要我们对众多的工作去做一个判断。

最常用的一种方法就是制定几个可以衡量工作好坏的指标,比如公司所处的行业是什么、应聘的岗位是什么、投资人是谁、薪酬待遇怎么样等等。评判一个工作好坏的指标有很多个,但是每一个指标对工作好坏这一结果的决策能力是不一样的,为了更好的对每一个指标的决策能力做出判断,我们引入一个可以量化信息决策能力的概念,这个概念就是信息熵。

信息熵是用来度量(量化)信息的,一条信息的信息量与其不确定性有着直接的联系,当我们需要了解清楚一件不确定的事情的时候,我们就需要了解大量的信息。

决策树算法简介

决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。

决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。 数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测(就像上面的银行官员用他来预测贷款风险)。

从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树。

一个决策树包含三种类型的节点:

根节点:第一个选择点,通常用矩形框来表式

非叶子节点与分支:中间过程,通常用圆圈何竖线来表式

叶子节点:最终的决策结果,通常用三角形来表示决策树的组成

决策树算法核心思想

决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据集进行分割,使得对各个子数据集有一个最好的分类过程,这一过程对应着对特征空间的划分,也对应着决策树的构建。

开始构建根节点,将所有的训练数据集都放在根节点,选择一个最有特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下获得最好的分类。如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到对应的叶节点中去;如果还有子集不能够被基本正确分类,那么就对这些子集新的选择最优特征,继续对其进行分割,构建相应的结点。如此递归下去,直到所有的训练数据子集被基本正确分类,或者没有合适的特征为止。最后每个子集都被分到叶节点上,即都有了明确的分类,这就生成了一颗决策树。

根节点是决策树最开始的结点,内部结点是可以继续分类的结点。

利用上面递归的方法可能对训练数据有很好的预测能力,但是对未知数据集未必有很好的分类能力,可能发生过拟合的现象,这就需要对决策树进行剪枝,让树变得简单一些,从而拥有更好的泛化能力。

决策树算法的工作过程

特征选择

特征选择就是选择对训练数据具有分类能力的特征,也就是我们在背景里面提到的对工作好坏评判起作用的指标,这样就可以提高决策树学习的效率。如果一个特征的分类能力与随机分类的结果没什么差异,则称这个特征是没有分类能力的。一般我们把这类特征是直接去掉的,我们优先那些能够对我们的分类起到决定作用的特征,我们在具体选取的时候会用到两个准则:信息增益或信息增益比。

信息增益

在信息论和概率统计中,熵表示随机变量不确定性的度量。设X是一个取有限个值的离散随机变量,其概率分布为:P(X=xi)=pi,i=1,2,...,n。

则随机变量X的熵定义为H(X)=-∑pi log pi。

因熵只依赖于X的分布,而与X无关,所以可将X的熵记作H(p),即H(p)=-∑pi log pi。

熵越大,随机变量的不确定性就越大。

当pi=1或pi=1时,H(p)等于0,此时,随机变量是完全没有不确定性的。当pi=0.5时,H(p)等于1,此时,熵取值最大,随机变量不确定性最大。

  • 条件熵

设有随机变量(X,Y)其联合概率分布为:P(X=xi,Y=yi)=Pij,条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。随机变量X给定条件下随机变量Y的条件熵H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望:H(Y|X)=∑pi H(Y|X=xi)。

  • 信息增益

信息增益表示在得知特征X的信息而使得类Y的不确定性减少的程度。

特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A在给定条件下D的经验条件熵H(D|A)之差,即g(D,A)=H(D)-H)(D|A)。

一般地,熵H(Y)与条件熵H(Y|X)之差称为互信息,决策树学习中的信息增益等价于训练数据集中的类与特征的互信息。

根据信息信息增益选择特征的方法是:对训练数据集(或子集)D,计算其每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征。

  • 信息增益算法步骤
  1. 计算训练数据集的经验熵H(D)
  2. 计算特征A对数据集D的经验条件熵H(D|A),这里的条件熵H(D|A)=∑pi H(D|A=Ai)=∑pi H(Di)=∑pi ∑p(Dik)log(p(Dik)),(Di中的i表示根据特征A将样本D分成i个类别,k表示样本D本身按照结果分成k个类别,比如前面的对一个工作好坏进行评定,根据工作内容好坏对样本进行分类,得到的类别数就是k;在拿特征A-工资待遇对样本进行分类得到样本类别数i),p(Dik)表示Di类别中类别k出现的概率,求取方法与朴素贝叶斯中对概率的求取方法一致,用似然估计,即用事件出现的频数的比值来代替概率。
  3. 计算信息增益g(D,A)

信息增益比

以信息增益作为划分训练数据集的特征,存在偏向于选取取值较多的特征的问题使用信息增益比可以对这一问题进行校正。

特征A对训练数据集D的信息增益比gR(D,A)定义为信息增益g(D,A)与训练数据集D关于特征A的值的熵HA(D)之比,即gR(D,A)=g(D,A)/HA(D)。其中

HA(D)=∑p(Di)log(p(Di))。

决策树的生成

常用的决策树生成的方法有ID3、C4.5、CART、Random Forest、Adaboost、GBDT、Xgboost、LightGBM算法。本篇也着重介绍这两种算法。

ID3算法

ID3算法的核心是在决策树各个结点的上应用信息增益准则选择特征,递归地构建决策树。

具体方法就是从根节点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法,构建决策树;直至所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。

C4.5的生成算法

C4.5和ID3算法相似,C4.5是在ID3的基础上进行了改进,从ID3用信息增益来选取特征改成了用信息增益比来选取特征,其他步骤均与ID3算法一致,不展开阐述。

决策树的修剪

决策树生成算法是通过递归的方法产生决策树,直到不能继续下去为止,这样产生的树往往对训练数据的分类很准确,但对未知数据的分类却没那么准确,即出现过拟合的现象。过拟合的原因在于学习时过度考虑如何提高训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的方法是考虑决策树的复杂度,对已生成的决策树进行简化,我们把这种对已生成的树进行简化的过程称为剪枝。

剪枝是从已生成的树上裁掉一些子树或叶节点,并将其根结点或父节点作为新的叶节点,从而简化分类树模型。

决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树T的叶节点个数为|T|,t是树T的叶节点,该叶结点由Nt个样本点,其中k类的样本点由Ntk个,k=1,2,...,K,Ht(T)为叶节点t上的经验熵,α≥0为参数,则决策树学习的损失函数可以定义为:

再来看一下常规意义上的损失函数:

公式的前半部分表示训练误差,对于这一部分,我们希望他的值越小越好,后半部分是正则化项,是为了防止过拟合而加的一个惩罚项。

所以我们可以把决策树的损失函数写成:

上式中,C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,|T|表示模型复杂度,参数参数α≥0控制两者之间的影响。较大的α促使选择较简单的模型(树),较小的α促使选择较复杂的模型(树)。α=0意味着只考虑模型与训练数据的拟合程度,不考虑模型的复杂度。

剪枝,就是当α确定时,选择损失函数最小的模型,即损失函数最小的子树。

算法步骤

输入:生成算法产生的整个树T,参数α

输出:修剪后的子树Tα

  1. 计算每个结点的经验熵
  2. 递归地从树的叶节点向上回缩,设一组叶节点回缩到其父节点之前与之后的整体树分别为TB与TA,其对应的损失函数值分别为Cα(TB)与Cα(TA),如果:图片,则进行剪枝,即将父节点变为新的叶节点。
  3. 返回步骤2,直到不能继续为止,得到损失函数最小的子树Tα。

决策树算法的代码实现

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.tree import export_graphviz
import graphviz# 加载数据集
data = load_iris()
X = data.data
y = data.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建决策树分类器
clf = DecisionTreeClassifier(random_state=42)# 训练模型
clf.fit(X_train, y_train)# 使用训练好的模型进行预测
y_pred = clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")# 导出决策树的dot文件
dot_data = export_graphviz(clf, out_file=None, feature_names=data.feature_names,class_names=data.target_names,filled=True, rounded=True,  special_characters=True)# 使用graphviz渲染图形
graph = graphviz.Source(dot_data)
# 保存树图为文件
graph.render("iris_tree")  

决策树算法的优缺点

优点

易于理解:决策树的结构直观,易于人类理解。模型的决策过程可以通过树状图的形式清晰地展示出来。

数据要求低:决策树算法不需要数据是正态分布的,也不需要数据是线性可分的,因此它对数据的要求较低。

特征处理简单:决策树算法可以处理数值型和类别型数据,不需要复杂的特征工程。

可处理混合数据类型:决策树可以同时处理连续变量和离散变量。

可视化:决策树的结果可以很容易地通过树状图进行可视化,有助于理解模型的决策逻辑。

易于实现:许多机器学习库(如scikit-learn)都提供了决策树的实现,使用起来非常方便。

处理非线性问题:决策树能够处理非线性问题,因为它通过树状结构将数据分割成多个区域。

不需要参数估计:在决策树的构建过程中,不需要对数据进行参数估计。

缺点

容易过拟合:决策树容易生成过于复杂的树,导致模型在训练数据上表现很好,但在测试数据上表现不佳。

不稳定:小的数据变动可能会导致生成完全不同的决策树,这使得模型的泛化能力较差。

对噪声敏感:决策树对噪声数据和异常值非常敏感,这些数据可能会影响树的构建和预测结果。

需要剪枝:为了减少过拟合和提高模型的泛化能力,通常需要对决策树进行剪枝处理,这增加了模型训练的复杂性。

计算成本高:随着树的深度增加,决策树的计算成本会显著增加,尤其是在处理大规模数据集时。

对连续变量的分割点选择:决策树在处理连续变量时,需要选择一个合适的分割点,这可能会影响模型的性能。

不平衡数据集表现不佳:在不平衡的数据集中,决策树可能会偏向于多数类,导致少数类的预测效果不佳。

模型解释性有限:虽然决策树的可视化有助于理解模型,但当树变得非常复杂时,理解其决策逻辑可能会变得困难。

决策树算法的应用场景

金融行业

  1. 信用评估:决策树可以用于评估客户的信用风险,帮助银行和金融机构决定是否批准贷款。
  2. 欺诈检测:通过分析交易模式和客户行为,决策树可以识别潜在的欺诈行为。
  3. 投资决策:决策树可以辅助投资者在复杂的市场环境中做出投资决策。

医疗行业

  1. 疾病诊断:决策树可以用于辅助医生进行疾病诊断,通过分析病人的症状和检查结果来预测疾病类型。
  2. 药物疗效预测:通过分析患者的基因和病史,决策树可以预测药物的疗效和副作用。
  3. 医疗风险评估:决策树可以帮助医疗机构评估手术风险和治疗计划的可行性。

电商行业

  1. 商品推荐:决策树可以分析用户的行为和偏好,推荐适合的商品。
  2. 销售预测:通过分析历史销售数据,决策树可以预测未来的销售趋势。
  3. 用户行为分析:决策树可以分析用户在网站上的行为,优化用户体验和提高转化率。

社交媒体

  1. 情感分析:决策树可以分析用户在社交媒体上的言论,判断其情感倾向。
  2. 事件预测:通过分析用户的行为和互动,决策树可以预测可能发生的事件。
  3. 用户行为分析:决策树可以帮助社交媒体平台了解用户的行为模式和偏好。

数据挖掘

  1. 特征选择:决策树可以用于特征选择,通过计算特征的重要性来筛选出对预测结果影响最大的特征。
  2. 异常检测:决策树可以用于异常检测,通过构建深度较大的树来识别数据集中的异常点。

回归任务

  1. 房价预测:决策树可以用于预测房价,通过分析房屋的特征和市场数据来估计其价值。
  2. 股票价格预测:决策树可以用于预测股票价格,分析市场趋势和经济指标。

分类任务

  1. 垃圾邮件分类:决策树可以用于识别和过滤垃圾邮件。
  2. 疾病诊断:在医疗领域,决策树可以辅助诊断疾病,通过分析症状和检查结果来预测疾病类型。

教育领域

  1. 课程推荐:决策树可以分析学生的学习习惯和成绩,推荐适合的课程和学习资源。

能源领域

能源消耗预测:决策树可

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

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

相关文章

Unity游戏开发入门:从安装到创建你的第一个3D场景

目录 引言 一、Unity的安装 1. 访问Unity官网 2. 下载Unity Hub 3. 安装Unity Hub并安装Unity编辑器 二、创建你的第一个项目 1. 启动Unity Hub并创建新项目 2. 熟悉Unity编辑器界面 3. 添加基本对象 4. 调整对象属性 5. 添加光源 三、运行与预览 引言 Unity&…

html 单页面引用vue3和element-plus

引入方式: element-plus基于vue3.0,所以必须导入vue3.0的js文件,然后再导入element-plus自身所需的js以及css文件,导入文件有两种方法:外部引用、下载本地使用 通过外部引用ElementPlus的css和js文件 以及Vue3.0文件 …

冒泡,选择,插入,希尔排序

目录 一. 冒泡排序 1. 算法思想 2. 时间复杂度与空间复杂度 3. 代码实现 二. 选择排序 1. 算法思想 2. 时间复杂度与空间复杂度 3. 代码实现 三.插入排序 1. 直接插入排序 (1). 算法思想 (2). 时间复杂度与空间复杂度 (3). 代码实现 2. 希尔排序 (1). 算法思想 …

昇思25天学习打卡营第23天 | 基于MindSpore的红酒分类实验

学习心得:基于MindSpore的红酒分类实验 在机器学习的学习路径中,理解和实践经典算法是非常重要的一步。最近我进行了一个有趣的实验,使用MindSpore框架实现了K近邻(KNN)算法进行红酒分类。这个实验不仅加深了我对KNN算…

云手机结合自主ADB命令接口 提升海外营销效率

现在,跨境电商直播已经成为在线零售的重要渠道,在大环境下,确保直播应用的稳定性和用户体验至关重要。 云手机支持自主ADB命令接口,为电商直播营销提供了技术支持,使得应用开发、测试、优化和运维更加高效。 什么是A…

卷积神经网络学习问题总结

问题一: 深度学习中的损失函数和应用场景 回归任务: 均方误差函数(MSE)适用于回归任务,如预测房价、预测股票价格等。 import torch.nn as nn loss_fn nn.MSELoss() 分类任务: 交叉熵损失函数&…

用go实现限流算法

文章目录 固定窗口优缺点:适用场景:总结: 滑动窗口优缺点:适用场景:总结: 漏桶限流器优缺点:适用场景:总结: 令牌桶优缺点:适用场景:总结&#xf…

SpringBoot结合ip2region实现博客评论显示IP属地

你好呀,我是小邹。 在现代的Web应用中,特别是博客和论坛类网站,为用户提供地理定位服务(如显示用户所在地理位置)可以极大地增强用户体验。本文将详细探讨如何使用Java和相关技术栈来实现在博客评论中显示用户的地址信…

NXP i.MX8系列平台开发讲解 - 3.19 Linux TTY子系统(二)

专栏文章目录传送门:返回专栏目录 Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】 目录 1. Linux 串口驱动 1.1 Uart 驱动注册流程 1.2 uart 操作函数 1.3 line discipline 2. Linux tty应用层使用…

【 DHT11 温湿度传感器】使用STC89C51读取发送到串口、通过时序图编写C语言

文章目录 DHT11 温湿度传感器概述接线数据传送通讯过程时序图检测模块是否存在 代码实现总结对tmp tmp << 1;的理解对sendByte(datas[0]/10 0x30);的理解 DHT11 温湿度传感器 使用80C51单片机通过读取HDT11温湿度传感的数据&#xff0c;发送到串口。 通过时序图编写相应…

2024-07-18 Unity插件 Odin Inspector8 —— Type Specific Attributes

文章目录 1 说明2 特定类型特性2.1 AssetList2.2 AssetSelector2.3 ChildGameObjectsOnly2.4 ColorPalette2.5 DisplayAsString2.6 EnumPaging2.7 EnumToggleButtons2.8 FilePath2.9 FolderPath2.10 HideInInlineEditors2.11 HideInTables2.12 HideMonoScript2.13 HideReferenc…

STM32学习(3)--GPIO输入

GPIO输入 3.1GPIO输入1.按键介绍2.传感器模块介绍3.硬件电路4.C语言知识点补充&#xff08;1&#xff09;C语言数据类型&#xff08;2&#xff09;C语言宏定义&#xff08;3&#xff09;C语言typedef(4)C语言结构体&#xff08;5&#xff09;C语言枚举 3.2按键控制LED代码1.mai…

Python爬虫(基本流程)

1. 确定目标和范围 明确需求&#xff1a;确定你需要从哪些网站抓取哪些数据。合法性&#xff1a;检查目标网站的robots.txt文件&#xff0c;了解哪些内容可以被抓取。数据范围&#xff1a;确定爬取数据的起始和结束点&#xff0c;比如时间范围、页面数量等。 2. 选择合适的工…

深入理解Linux网络(二):UDP接收内核探究

深入理解Linux网络&#xff08;二&#xff09;&#xff1a;UDP接收内核探究 一、UDP 协议处理二、recvfrom 系统调⽤实现 一、UDP 协议处理 udp 协议的处理函数是 udp_rcv。 //file: net/ipv4/udp.c int udp_rcv(struct sk_buff *skb) {return __udp4_lib_rcv(skb, &udp_…

pyspark使用 graphframes创建和查询图的方法

1、安装graphframes的步骤 1.1 查看 spark 和 scala版本 在终端输入&#xff1a; spark-shell --version 查看spark 和scala版本 1.2 在maven库中下载对应版本的graphframes https://mvnrepository.com/artifact/graphframes/graphframes 我这里需要的是spark 2.4 scala 2.…

(南京观海微电子)——电感的电路原理及应用区别

电感 电感是导线内通过交流电流时&#xff0c;在导线的内部及其周围产生交变磁通&#xff0c;导线的磁通量与生产此磁通的电流之比。 当电感中通过直流电流时&#xff0c;其周围只呈现固定的磁力线&#xff0c;不随时间而变化&#xff1b;可是当在线圈中通过交流电流时&am…

linux内核中list的基本用法

内核链表 1 list_head 结构 为了使用链表机制&#xff0c;驱动程序需要包含<linux/types.h>头文件&#xff0c;该文件定义了如下结构体实现双向链&#xff1a; struct list_head {struct list_head *next, *prev; };2 链表的初始化 2.1 链表宏定义和初始化 可使用以…

智慧职校就业管理:开启校园招聘会新模式

在智慧职校的就业管理系统中&#xff0c;校园招聘会的出现&#xff0c;为学生们提供了一个展示自我、探寻职业道路的舞台&#xff0c;同时也为企业搭建了一座直面未来之星的桥梁。这一功能&#xff0c;凭借其独特的优势与前沿的技术&#xff0c;正在重新定义校园与职场之间的过…

react Jsx基础概念和本质

什么是jsx jsx是JavaScript和XML(HTML)的缩写&#xff0c;表示在js代码中编写HTML模板结构&#xff0c;它是react中编写UI模板的方式 const message this is message function App(){return (<div><h1>this is title</h1>{message}</div>) } jsx优…

【SpringBoot】 jasypt配置文件密码加解密

目前我们对yml配置文件中的密码都是明文显示&#xff0c;显然这不安全&#xff0c;有的程序员离职了以后可能会做一些非法骚操作&#xff0c;所以我们最好要做一个加密&#xff0c;只能让领导架构师或者技术经理知道这个密码。所以这节课就需要来实现一下。 我们可以使用jasypt…