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

news2024/9/21 12:46:28

目录

决策树算法概述

决策树算法背景

决策树算法简介

决策树算法核心思想

决策树算法的工作过程

特征选择

信息增益

信息增益比

决策树的生成

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.coloradmin.cn/o/1939089.html

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

相关文章

深入解析HNSW:Faiss中的层次化可导航小世界图

层次化可导航小世界(HNSW)图是向量相似性搜索中表现最佳的索引之一。HNSW 技术以其超级快速的搜索速度和出色的召回率,在近似最近邻(ANN)搜索中表现卓越。尽管 HNSW 是近似最近邻搜索中强大且受欢迎的算法,…

Latex使用心得1

本周暑期课程大作业需要使用Latex模板,采用的是老师给的IEEE的格式。从最开始不知道Latex是什么,到摸索着把大作业的小论文排版完成,其中也有一些心得体会。写在这里记录一下,以便以后回来再看,有更多的思考沉淀。 1、…

视觉巡线小车——STM32+OpenMV(三)

目录 前言 一、OpenMV代码 二、STM32端接收数据 1.配置串口 2.接收数据并解析 总结 前言 通过视觉巡线小车——STM32OpenMV(二),已基本实现了减速电机的速度闭环控制。要使小车能够自主巡线,除了能够精准的控制速度之外&#xff0…

Java周总结7.20day

一,异常 异常 :指的是程序在运行过程中报错,然后停止运行,控制台显示错误。 注意事项:异常本身是一个类,出现异常会创建一个异常类的对象并抛出, public class DemoTest { public static void …

python—爬虫爬取电影页面实例

下面是一个简单的爬虫实例,使用Python的requests库来发送HTTP请求,并使用lxml库来解析HTML页面内容。这个爬虫的目标是抓取一个电影网站,并提取每部电影的主义部分。 首先,确保你已经安装了requests和lxml库。如果没有安装&#x…

海思arm-hisiv400-linux-gcc 交叉编译rsyslog 记录心得

需要编译rsyslog,参考海思3536平台上rsyslog交叉编译、使用-CSDN博客和rsyslog移植(亲测成功)_rsyslog交叉编译-CSDN博客 首先下载了要用到的一些库的源码,先交叉编译这些库 原来是在centos6上交叉编译的,结果编译时报缺少软件要…

使用vue3模拟element-ui中el-tabs的实现

一. 最终实现 组件没有背景颜色, 为了凸显组件文字,才设置了背景颜色 二. 使用 <wq-tabs v-model"activeName" style"background:grey; padding: 20px"><wq-tab-pane label"User" name"first">User</wq-tab-pane&g…

多任务高斯过程数学原理和Pytorch实现示例

高斯过程其在回归任务中的应用我们都很熟悉了&#xff0c;但是我们一般介绍的都是针对单个任务的&#xff0c;也就是单个输出。本文我们将讨论扩展到多任务gp&#xff0c;强调它们的好处和实际实现。 本文将介绍如何通过共区域化的内在模型(ICM)和共区域化的线性模型(LMC)&…

驱动LSM6DS3TR-C实现高效运动检测与数据采集(10)----融合磁力计进行姿态解算

驱动LSM6DS3TR-C实现高效运动检测与数据采集.10--融合磁力计进行姿态解算 概述视频教学样品申请源码下载硬件准备DataLogFusion磁力计校准过程初始化磁力计MFX_Arithmetic_Init卡尔曼滤波算法演示 概述 MotionFX库包含用于校准陀螺仪、加速度计和磁力计传感器的例程。 将磁力计…

【网络】windows和linux互通收发

windows和linux互通收发 一、windows的udp客户端代码1、代码剖析2、总体代码 二、linux服务器代码三、成果展示 一、windows的udp客户端代码 1、代码剖析 首先我们需要包含头文件以及lib的一个库&#xff1a; #include <iostream> #include <WinSock2.h> #inclu…

swiftui中onChange函数的使用,监听变量的变化

在 SwiftUI 中&#xff0c;onChange 修饰符用于在指定值发生变化时执行某些操作。它允许你监听一个状态或绑定值的变化&#xff0c;并在变化发生时运行一些代码。这个功能非常适合需要对状态变化做出响应的场景。 使用示例&#xff1a; struct AppStorageTest: View {State p…

友力科技数据中心搬迁方案

将当前运行机房中的所有设备、应用系统安全搬迁至新数据中心机房&#xff0c;实现平滑切换、平稳过渡&#xff0c;最大限度地降低搬迁工作对业务的影响。 为了确保企事业单位能够顺利完成数据中心机房搬迁工作&#xff0c;我们根据实际经验提供了4个基本原则&#xff0c;希望能…

【Linux】编辑器vscode与linux的联动

1.vscode简单学习 vscode是编辑器&#xff0c;可以写各种语言的程序 下载链接&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 来用一下vscode 我们保存了就能在我们的那个文件夹里面看到这个 这个就是编辑器&#xff0c;跟我们的文本文件好像差不多&#…

RPM、YUM 安装 xtrabackup 8 (mysql 热备系列一)包含rpm安装 mysql 8 配置主从

RPM安装 percona-xtrabackup-80-8.0.35-30.1.el7.x86_64.rpm 官网&#xff1a; https://www.percona.com/ 下载地址&#xff1a; https://www.percona.com/downloads wget https://downloads.percona.com/downloads/percona-distribution-mysql-ps/percona-distribution-mysq…

51单片机14(独立按键实验)

一、按键介绍 1、按键是一种电子开关&#xff0c;使用的时候&#xff0c;只要轻轻的按下我们的这个按钮&#xff0c;按钮就可以使这个开关导通。 2、当松开这个手的时候&#xff0c;我们的这个开关&#xff0c;就断开开发板上使用的这个按键&#xff0c;它的内部结构&#xff…

从千台到十万台,浪潮信息InManage V7解锁智能运维密码

随着大模型技术的深度渗透&#xff0c;金融行业正经历着前所未有的智能化变革。从“投顾助手”精准导航投资蓝海&#xff0c;到“智能客服”秒速响应客户需求&#xff0c;大模型以其对海量金融数据的深度挖掘与高效利用&#xff0c;正显著提升金融服务的智能化水准&#xff0c;…

Java:拦截器简介和应用示例(多个拦截器+校验token是否为空)

JAVA 拦截器 简介 拦截器和过滤器均可以拦截http请求&#xff0c;过滤器偏向于基础设施工作&#xff0c;拦截器偏向于业务&#xff0c;拦截器允许在执行Controller之前做验证预处理&#xff0c;在Controller执行之后对返回对象做加工处理。可以用于&#xff1a;权限检查、日志…

2014年全国大学生数学建模竞赛C题生猪养殖管理(含word论文和源代码资源)

文章目录 一、部分题目二、部分论文三、部分源代码四、完整word版论文和源代码 一、部分题目 2014高教社杯全国大学生数学建模竞赛题目 C题 生猪养殖场的经营管理 某养猪场最多能养10000头猪&#xff0c;该养猪场利用自己的种猪进行繁育。养猪的一般过程是&#xff1a;母猪配…

第3关 -- Git 基础知识

任务1: 破冰活动&#xff1a;自我介绍 任务2: 实践项目&#xff1a;构建个人项目 MeiHuaYiShu

【BUG】已解决:ModuleNotFoundError: No module named ‘_ctypes‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘_ctypes‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城…