决策树算法新手入门:从基础理论到Python实现

决策树新手入门详细教程

    • 一、数学基础
      • 1. 信息熵
        • (1) 基本定义
        • (2) 条件熵
        • (3) 有关定律
      • 2. 信息增益
    • 二、决策树的组成
      • 1. 决策节点
      • 2. 叶子节点
      • 3. 决策树的深度
    • 三、决策树的建立(基于信息增益)—— ID3
      • 1. 计算根节点的信息熵
      • 2. 计算属性的信息增益
        • (1) 职业
        • (2) 年龄(以35岁为界)
        • (3) 收入(以10000为界)
        • (4) 学历(以高中为界)
      • 3. 接下来我们继续重复1,2的做法继续寻找合适的属性节点
        • 确定第二个属性节点
      • 4. 决策树建成
    • 四、决策树的另一划分标准——增益率(C4.5决策树算法)
      • 1. 引入原因
      • 2. 定义
      • 3. 例子
      • 4. 注意点
    • 五、决策树的另一划分标准——基尼指数(CART决策树)
      • 1. 定义
        • (1) 基尼值
        • (2) 基尼指数
      • 2. 决策树建立方法(分类回归均可用)
    • 六、剪枝处理
      • 1. 提出原因
      • 2. 剪枝与其处理基本策略
        • (1) 剪枝
        • (2) 基本策略
      • 3. 预剪枝
        • (1) 做法
        • (2) 具体例子
        • (3) 优缺点
      • 4. 后剪枝
        • (1) 做法
        • (2) 优缺点
      • 5. 另一种剪枝方法
    • 七、连续与缺失值
      • 1. 连续值处理
        • (1) 提出原因
        • (2) 做法
        • (3) 二分法
      • 2. 缺失值处理
        • (1) 提出原因
        • (2) 做法
    • 八、多变量决策树
    • 九、Python实现决策树

一、数学基础

1. 信息熵

(1) 基本定义

假设样本集合 D D D 共有 N N N 类,第 k k k 类样本所占比例为 p k p_k pk,则 D D D 的信息熵为:

H ( D ) = − ∑ k = 1 N p k log ⁡ 2 p k H(D) = - \sum_{k=1}^N p_k \log_2 p_k H(D)=k=1Npklog2pk

信息熵描述的是在结果出现之前对可能产生的信息量的期望,反映了结果的不确定性。信息熵越大,不确定性越大。 H ( D ) H(D) H(D) 的值越小,则 D D D 的纯度越高。

注:

  • 计算信息熵时约定:如果 p k = 0 p_k = 0 pk=0,则 p k log ⁡ 2 p k = 0 p_k \log_2 p_k = 0 pklog2pk=0
  • H ( D ) H(D) H(D) 的最小值是 0,最大值是 log ⁡ 2 N \log_2 N log2N

如下图所示为二元信源熵函数( H ( p ) H(p) H(p)):

在这里插入图片描述

(2) 条件熵

条件熵 H ( Y ∣ X ) H(Y|X) H(YX) 表示在已知随机变量 X X X 的条件下随机变量 Y Y Y 的不确定性。公式如下:

H ( Y ∣ X ) = ∑ i = 1 n p ( x i ) H ( Y ∣ X = x i ) H(Y|X) = \sum_{i=1}^{n} p(x_i) H(Y|X=x_i) H(YX)=i=1np(xi)H(YX=xi)

(3) 有关定律
  • X X X Y Y Y 相互独立,则 H ( Y ∣ X ) = H ( Y ) H(Y|X) = H(Y) H(YX)=H(Y)
  • H ( Y ∣ Y ) = 0 H(Y|Y) = 0 H(YY)=0

2. 信息增益

信息增益是一个统计量,用来描述一个属性区分数据样本的能力。信息增益越大,决策树就会越简洁。信息增益的程度用信息熵的变化程度来衡量。公式如下:

I G ( D , A ) = H ( D ) − H ( D ∣ A ) IG(D, A) = H(D) - H(D|A) IG(D,A)=H(D)H(DA)

二、决策树的组成

1. 决策节点

通过条件判断而进行分支选择的节点。例如,将某个样本中的属性值(特征值)与决策节点上的值进行比较,从而判断它的流向。

2. 叶子节点

没有子节点的节点,表示最终的决策结果。

3. 决策树的深度

所有节点的最大层次数。决策树具有一定的层次结构,根节点的层次数定为 0,从下面开始每一层子节点层次数 +1。

决策树的学习一般包括:特征选择,决策树的生成,决策树的修剪。

三、决策树的建立(基于信息增益)—— ID3

我们通过一个例子来说明如何根据以下信息构建一棵预测是否贷款的决策树。我们可以看到有4个影响因素:职业、年龄、收入和学历。

1. 计算根节点的信息熵

假设样本集合 D D D 中“是”占 50%,“否”占 50%,则:

H ( D ) = − ( 1 2 log ⁡ 2 1 2 + 1 2 log ⁡ 2 1 2 ) = 1 H(D) = -(\frac{1}{2} \log_2 \frac{1}{2} + \frac{1}{2} \log_2 \frac{1}{2}) = 1 H(D)=(21log221+21log221)=1

2. 计算属性的信息增益

(1) 职业

假设职业属性的熵为 H ( 职业 ) = 0.934 H(\text{职业}) = 0.934 H(职业)=0.934,则:

I G ( D , 职业 ) = H ( D ) − H ( 职业 ) = 1 − 0.934 = 0.066 IG(D, \text{职业}) = H(D) - H(\text{职业}) = 1 - 0.934 = 0.066 IG(D,职业)=H(D)H(职业)=10.934=0.066

(2) 年龄(以35岁为界)

假设年龄属性的熵为 H ( 年龄 ) = 1 H(\text{年龄}) = 1 H(年龄)=1,则:

I G ( D , 年龄 ) = H ( D ) − H ( 年龄 ) = 1 − 1 = 0 IG(D, \text{年龄}) = H(D) - H(\text{年龄}) = 1 - 1 = 0 IG(D,年龄)=H(D)H(年龄)=11=0

(3) 收入(以10000为界)

假设收入属性的熵为 H ( 收入 ) = 0.734 H(\text{收入}) = 0.734 H(收入)=0.734,则:

I G ( D , 收入 ) = H ( D ) − H ( 收入 ) = 1 − 0.734 = 0.266 IG(D, \text{收入}) = H(D) - H(\text{收入}) = 1 - 0.734 = 0.266 IG(D,收入)=H(D)H(收入)=10.734=0.266

(4) 学历(以高中为界)

假设学历属性的熵为 H ( 学历 ) = 0.734 H(\text{学历}) = 0.734 H(学历)=0.734,则:

I G ( D , 学历 ) = H ( D ) − H ( 学历 ) = 1 − 0.734 = 0.266 IG(D, \text{学历}) = H(D) - H(\text{学历}) = 1 - 0.734 = 0.266 IG(D,学历)=H(D)H(学历)=10.734=0.266

选择信息增益最大的属性作为划分属性,即选择“收入”。

3. 接下来我们继续重复1,2的做法继续寻找合适的属性节点

确定第二个属性节点

假设“收入”为节点后,“是”占 50%,“否”占 50%,因此 H = 1 H=1 H=1

4. 决策树建成

最终我们得到了如下的决策树:

       收入/    \>10000  <=10000/          \
学历          学历
/  \          /  \
是  否        否  是

四、决策树的另一划分标准——增益率(C4.5决策树算法)

1. 引入原因

信息增益准则对可取值数目较多的属性有所偏好。为减少这种偏好可能带来的不利影响,可以选择增益率。

2. 定义

增益率公式如下:

G a i n R a t i o ( D , A ) = I G ( D , A ) I V ( A ) GainRatio(D, A) = \frac{IG(D, A)}{IV(A)} GainRatio(D,A)=IV(A)IG(D,A)

其中,属性 A A A 的固有值 I V ( A ) IV(A) IV(A) 定义为:

I V ( A ) = − ∑ i = 1 V ∣ D i ∣ ∣ D ∣ log ⁡ 2 ∣ D i ∣ ∣ D ∣ IV(A) = - \sum_{i=1}^{V} \frac{|D_i|}{|D|} \log_2 \frac{|D_i|}{|D|} IV(A)=i=1VDDilog2DDi

3. 例子

计算“收入”的信息增益率:

I V ( 收入 ) = − ( 3 10 log ⁡ 2 3 10 + 4 10 log ⁡ 2 4 10 + 3 10 log ⁡ 2 3 10 ) = 1.556 IV(\text{收入}) = -(\frac{3}{10} \log_2 \frac{3}{10} + \frac{4}{10} \log_2 \frac{4}{10} + \frac{3}{10} \log_2 \frac{3}{10}) = 1.556 IV(收入)=(103log2103+104log2104+103log2103)=1.556

G a i n R a t i o ( D , 收入 ) = 0.266 1.556 = 0.171 GainRatio(D, \text{收入}) = \frac{0.266}{1.556} = 0.171 GainRatio(D,收入)=1.5560.266=0.171

4. 注意点

增益率准则对可取值数目较少的属性有所偏好。因此,基于增益率的决策树建立方法是:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

五、决策树的另一划分标准——基尼指数(CART决策树)

1. 定义

(1) 基尼值

基尼值 G i n i ( D ) Gini(D) Gini(D) 反映了从数据集 D D D 中随机抽取两个样本,其类别标记不一致的概率,表示数据集整体的不确定性。

G i n i ( D ) = 1 − ∑ k = 1 N p k 2 Gini(D) = 1 - \sum_{k=1}^{N} p_k^2 Gini(D)=1k=1Npk2

(2) 基尼指数

基尼指数表示经属性 a a a 分割后数据集 D D D 的不确定性。

G i n i I n d e x ( D , a ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ G i n i ( D i ) GiniIndex(D, a) = \sum_{i=1}^{n} \frac{|D_i|}{|D|} Gini(D_i) GiniIndex(D,a)=i=1nDDiGini(Di)

2. 决策树建立方法(分类回归均可用)

  • 分类:在候选属性集合中,选择那个划分后基尼指数最小的属性为最优划分属性。
  • 回归:用平方误差最小化准则。

六、剪枝处理

1. 提出原因

决策树分支可能过多,导致过拟合。决策树越复杂,过拟合的程度会越高。因此,通过剪枝来降低过拟合的风险。

2. 剪枝与其处理基本策略

(1) 剪枝

剪枝是指将一颗子树的子节点全部删掉,根节点作为叶子节点。

(2) 基本策略
  • 预剪枝:在决策树生成的过程中进行剪枝判断。
  • 后剪枝:在生成决策树之后进行剪枝处理。

3. 预剪枝

(1) 做法

在决策树生成过程中,对每个节点进行是否剪枝判断。通过验证集提升验证集精度,不进行裁剪,否则进行裁剪,并将当前节点标记为叶子节点。

(2) 具体例子

以“学历”为例,选取第5个样本为验证集:

  • 不划分时:验证集精度为50%
  • 划分时:验证集精度为100%

因此需要划分,不剪枝。

(3) 优缺点

优点: 预剪枝降低了过拟合风险,减少训练和测试时间开销。

缺点: 有些分支的当前划分虽不能提升泛化能力,但后续划分可能提高性能。预剪枝可能导致欠拟合风险。

4. 后剪枝

(1) 做法

生成决策树后,自底向上地对决策节点进行剪枝判断。通过验证集提升验证集精度,对子树进行剪枝。

(2) 优缺点

优点: 后剪枝通常保留更多分支,泛化能力优于预剪枝。

缺点: 后剪枝训练时间开销较大。

5. 另一种剪枝方法

通过最小化决策树整体的损失函数来实现剪枝。损失函数为:

L ( T ) = ∑ t ∈ T ∣ t ∣ H t + α ∣ T ∣ L(T) = \sum_{t \in T} |t| H_t + \alpha |T| L(T)=tTtHt+αT

其中, ∣ T ∣ |T| T 是树的叶结点个数, t t t 是树的叶结点, ∣ t ∣ |t| t 为叶结点上样本点数目, H t H_t Ht 为叶结点上的经验熵, α \alpha α 为控制参数。

七、连续与缺失值

1. 连续值处理

(1) 提出原因

连续属性的可取值数目较多,不能直接用于节点划分。

(2) 做法

使用连续属性离散化技术。最简单的方法是二分法。

(3) 二分法

提取划分节点的所有可能值,对这些值从小到大排序,选择最佳划分点。

2. 缺失值处理

(1) 提出原因

在样本获取过程中,可能会出现属性数据缺失。

(2) 做法

当缺失数据较少时,直接舍弃;当缺失数据较多时,修改信息增益公式进行处理。

八、多变量决策树

每个决策节点是一个线性分类器,多个属性组合成一组分类规则。这种决策树相对复杂,训练时间更长。

九、Python实现决策树

以下是使用 Python 和 scikit-learn 库实现决策树的示例代码:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import tree# 数据集导入
iris = load_iris()
features = iris.data  # 属性特征
labels = iris.target  # 分类标签# 训练集,测试集分类
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.3, random_state=1)# 创建决策树分类器
clf = tree.DecisionTreeClassifier(criterion='entropy', max_depth=3)
clf = clf.fit(train_features, train_labels)  # 训练模型# 预测测试集的标签
test_labels_predict = clf.predict(test_features)# 将预测结果与实际结果进行对比
score = accuracy_score(test_labels, test_labels_predict)
print("CART分类树的准确率 %.4lf" % score)# 生成决策树可视化的dot文件
dot_data = tree.export_graphviz(clf, out_file='iris_tree.dot')

输出结果:

决策树的准确率 0.9556

生成的 iris_tree.dot 文件可以通过以下命令生成决策树图片:

dot -Tpng iris_tree.dot -o iris_tree.png

至此,我们已经成功地使用决策树进行了分类,并生成了可视化的决策树图像。希望这篇文章对你理解决策树有所帮助!

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

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

相关文章

【升华】python基础包NumPy学习

NumPy是使用Python进行科学计算的基础软件包。除其他外&#xff0c;它包括&#xff1a; 功能强大的N维数组对象。精密广播功能函数。集成 C/C和Fortran 代码的工具。强大的线性代数、傅立叶变换和随机数功能。 # 1、安装包 $ pip install numpy# 2、进入python的交互式界面 $…

蓄电池在线监测:保障电力安全的智能之选---安科瑞 吴雅芳

一、蓄电池在线监测的重要性 随着科技的飞速发展&#xff0c;蓄电池在各个领域的应用日益广泛&#xff0c;从通信、电力到金融、医疗等行业&#xff0c;蓄电池都扮演着至关重要的角色。然而&#xff0c;蓄电池在使用过程中也面临着诸多问题。 蓄电池老化可能导致鼓胀、短路、漏…

React 子组件调用父组件的方法,以及互相传递数据

<script type"text/babel" data-type"module"> import React, { StrictMode, useState } from react; import { createRoot } from react-dom/client;const ParentComponent () > {const [message, setMessage] useState("")//父组件…

【火山引擎】 Chat实践 | 大模型调用实践 | python

目录 一 前期工作 二 Doubao-pro-4k_test实践 一 前期工作 1 已在火山方舟控制台在线推理页面创建了推理接入点 ,接入大语言模型并获取接入点 ID。 2 已参考安装与初始化中的步骤完成 SDK 安装和访问凭证配置

基于SSM的个性化商铺系统【附源码】

基于SSM的个性化商铺系统 效果如下&#xff1a; 用户登录界面 app首页界面 商品信息界面 店铺信息界面 用户功能界面 我的订单界面 后台登录界面 管理员功能界面 用户管理界面 商家管理界面 店铺信息管理界面 商家功能界面 个人中心界面 研究背景 研究背景 科学技术日新月异…

LeetCode-3191 使二进制数组全部等于1的最少操作次数

又来到了今天的每日一题&#xff0c;距离上次更新每日一题得有十天了。 主要原因是这十天的题要么简单到爆&#xff0c;要么难到爆&#xff0c;再要么就是最近学校安排实训&#xff0c;时间比较紧。 废话不多说&#xff0c;来看看今天的题目。 题目很简单&#xff0c;就是给个…

CTF(五)

导言&#xff1a; 本文主要讲述在CTF竞赛中&#xff0c;web类题目easyphp。 靶场链接&#xff1a;攻防世界 (xctf.org.cn) 参考文章原文链接&#xff1a;Web安全攻防世界05 easyphp&#xff08;江苏工匠杯&#xff09;_攻防世界 easyphp-CSDN博客 一&#xff0c;观察页面。…

校验台账生成网络事业调查表的方法

校验台账生成网络事业调查表的方法 一、打开教育事业统计调查表学校&#xff08;机构&#xff09;信息管理标准化台账“采集信息核查辅助工具二、导入本校台账并校验三、调查表统计导出四、完 一、打开教育事业统计调查表学校&#xff08;机构&#xff09;信息管理标准化台账“…

在ESP-IDF环境中如何进行多文件中的数据流转-FreeRTOS实时操作系统_流缓存区“xMessageBuffer”

一、建立三个源文件和对应的头文件 建立文件名&#xff0c;如图所示 图 1-1 二、包含相应的头文件 main.h 图 2-1 mess_send.h mess_rece.h和这个中类似,不明白的大家看我最后面的源码分享 图2-2 三、声明消息缓存区的句柄 大家注意&#xff0c;在main.c中定义的是全局变…

Nodemon 深入解析与使用

目录 1. 基本知识2. Demo3. 高级配置 1. 基本知识 Nodemon 深入解析与使用指南 Nodemon 是一个强大的开发工具&#xff0c;用于监控 Node.js 应用程序中的文件变更&#xff0c;能自动重启应用&#xff0c;极大提高开发效率 基本的优点如下&#xff1a; 自动化&#xff1a;避…

【C语言】循环嵌套:乘法表

循环嵌套&#xff0c;外层循环执行一次&#xff0c;内层循环执行i次。分别控制 在循环的过程中加一层循环。 多层循环属于循环嵌套、嵌套循环 #include <stdio.h> #include <math.h> /* 功能&#xff1a;循环嵌套 乘法表 时间&#xff1a;2024年10月 地点&#xf…

Chrome谷歌浏览器加载ActiveX控件之JT2Go控件

背景 JT2Go是一款西门子公司出品的三维图形轻量化预览解决工具&#xff0c;包含精确3D测量、基本3D剖面、PMI显示和改进的选项过滤器等强大的功能。JT2Go控件是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;由于微软禁用IE浏览器&#xff0c;导致JT2Go…

视频画面变糊是平台在做手脚吗?

人气视频博主“影视飓风”一条新发布的视频被全网下架&#xff0c;这两日更是引起轩然大波&#xff0c;不仅频上热门&#xff0c;甚至还有不少数码与视频同行为其抱不平。那么影视飓风到底发布了一条什么视频&#xff1f;又为何会惨被全网下架呢&#xff1f; 10月8日&#xff0…

笔记-static关键字

1.static关键字内存说明 2.访问特点 package com.test.Statics2;import com.test.statics.Student;public class Test {public static void main(String[] args) {// 静态成员中访问非静态成员// method3() // 错误-不能直接调用&#xff0c;需要new对象调用Test test01 new T…

Java 类和对象详解(上 )

个人主页&#xff1a; 鲤鱼王打挺-CSDN博客 Java专栏&#xff1a;https://blog.csdn.net/2401_83779763/category_12801101.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12801101&sharereferPC&sharesource2401_83779763&sharefromfrom_link &…

Vue3的Composition组合式API(computed计算属性、watch监视属性、watchEffect函数)

目录 1. computed计算属性2. watch监视属性2.1 watch监视ref定义的数据2.2 watch监视reactive定义的数据 3. watchEffect函数 1. computed计算属性 与Vue2中的computed配置功能一致。使用示例如下&#xff1a; Student.vue 计算属性的简写只能进行读取&#xff1b;完整写法有…

【vivado】vivado联合modelsim仿真

操作步骤 1 编译Vivado仿真库2 设置仿真工具和库路径3 启动modelsim仿真 1 编译Vivado仿真库 等待编译完成。 2 设置仿真工具和库路径 打开vivado工程文件&#xff0c; 点击tool–>Setting 更改编译器为modelsimulator&#xff0c;并悬着编译库文件 3 启动modelsim仿真…

整理—MySQL

目录 NOSQL和SQL的区别 数据库三大范式 MySQL 怎么连表查询 MySQL如何避免重复插入数据&#xff1f; CHAR 和 VARCHAR有什么区别&#xff1f; Text数据类型可以无限大吗&#xff1f; 说一下外键约束 MySQL的关键字in和exist mysql中的一些基本函数 SQL查询语句的执行顺…

Java爬虫:从入门到精通实战指南

在信息技术飞速发展的今天&#xff0c;数据已成为最宝贵的资源之一。Java作为一种成熟且功能强大的编程语言&#xff0c;不仅在企业级应用开发中占据主导地位&#xff0c;也成为了编写爬虫程序的理想选择。Java爬虫能够自动化地从网页或API中提取数据&#xff0c;为数据分析、机…

如何利用边缘计算网关进行工厂设备数据采集?天拓四方

边缘计算网关集成了数据采集、处理和传输功能&#xff0c;位于传感器和执行器组成的设备层与云计算平台之间。它能够实时处理和响应本地设备的数据请求&#xff0c;减轻云平台的压力&#xff0c;提高数据处理的速度和效率。同时&#xff0c;边缘计算网关还可以将处理后的数据上…