机器学习算法-决策树算法

news2024/9/23 23:47:20

文章目录

    • 什么是决策树?
      • 决策树的基本概念
      • 决策树的构建过程
      • 决策树的优缺点
        • 优点:
        • 缺点:
      • 决策树的优化
      • 决策树的应用
      • 决策树的实现工具
    • 特征选择准则
      • 1. 信息增益(Information Gain)
        • 计算公式:
        • 熵(Entropy)定义:
        • 特点:
      • 2. 信息增益比(Gain Ratio)
        • 计算公式:
        • 分割信息(SplitInfo)定义:
        • 特点:
      • 3. 基尼指数(Gini Index)
        • 计算公式:
        • 特点:
      • 4. 基尼减少量(Gini Decrease)
        • 计算公式:
        • 特点:
      • 选择准则的对比
      • 实际应用
      • Python 示例
    • 决策树剪枝算法
      • 1. 预剪枝(Pre-pruning)
        • 1.1 设置最大深度(Max Depth)
        • 1.2 设置最小样本数(Min Samples Split)
        • 1.3 设置最小信息增益(Min Impurity Decrease)
      • 2. 后剪枝(Post-pruning)
        • 2.1 成本复杂度剪枝(Cost Complexity Pruning)
        • 2.2 最小误差剪枝(Minimum Error Pruning)
        • 2.3 错误估计剪枝(Error-Based Pruning)
      • Python 示例
      • 总结

什么是决策树?

决策树(Decision Tree)是一种常用的数据挖掘和机器学习算法,主要用于分类和回归任务。决策树通过从根节点到叶节点的路径来表示决策规则,其中每个内部节点代表一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一个类别或输出值。

决策树的基本概念

  1. 节点(Nodes)

    • 根节点(Root Node):决策树的起始点,没有输入边。
    • 内部节点(Internal Nodes):代表属性上的测试。
    • 叶节点(Leaf Nodes):代表类别或输出值,没有输出边。
  2. 分支(Branches)

    • 代表从父节点到子节点的路径,对应于属性测试的不同结果。
  3. 路径(Path)

    • 从根节点到叶节点的一条路径代表一条决策规则。

决策树的构建过程

决策树的构建通常遵循自顶向下的递归划分策略,即从根节点开始,不断选择最优属性进行划分,直到满足停止条件为止。常见的决策树算法包括:

  1. ID3

    • 使用信息增益(Information Gain)作为划分标准。
    • 信息增益越大,说明该属性对分类的影响越大。
  2. C4.5

    • 使用信息增益比(Gain Ratio)作为划分标准,解决了信息增益偏向选择具有较多分支的属性的问题。
    • 信息增益比 = 信息增益 / 属性熵(Split Information)。
  3. CART(Classification and Regression Trees)

    • 既可以用于分类也可以用于回归任务。
    • 使用基尼指数(Gini Index)作为划分标准。

决策树的优缺点

优点:
  1. 易于理解和解释:决策树的结构类似于人类的决策过程,易于可视化和解释。
  2. 无需对数据进行标准化处理:决策树对输入数据的尺度不敏感。
  3. 支持多类分类:决策树可以轻松处理多类分类问题。
  4. 支持特征选择:决策树在构建过程中自然地选择了最重要的特征。
缺点:
  1. 过拟合:决策树容易过拟合,特别是在训练数据量较大或特征较多的情况下。
  2. 不稳定:小的数据变动可能导致生成完全不同的树结构。
  3. 偏斜数据:对于不平衡的数据集,决策树的表现较差。
  4. 局部最优:每次只选择当前最佳属性进行划分,可能导致全局次优解。

决策树的优化

  1. 剪枝(Pruning)

    • 预剪枝(Pre-pruning):在树的构建过程中提前终止生长,防止过拟合。
    • 后剪枝(Post-pruning):先生成完整的树,然后自底向上地修剪掉不影响准确率的子树。
  2. 集成方法(Ensemble Methods)

    • 随机森林(Random Forest):通过集成多个决策树来提高预测的准确性和稳定性。
    • 梯度提升树(Gradient Boosting Trees):通过迭代地添加新的树来修正已有模型的错误。

决策树的应用

决策树广泛应用于各种领域,包括但不限于:

  1. 客户细分:根据客户的特征进行分类,以便制定个性化的营销策略。
  2. 医疗诊断:根据病人的症状和检查结果来预测疾病。
  3. 信用评分:评估客户的信用风险。
  4. 欺诈检测:识别潜在的欺诈行为。

决策树的实现工具

  1. Python 中的 scikit-learn

    • 提供了 DecisionTreeClassifier 和 DecisionTreeRegressor 类来构建分类和回归决策树。
  2. R 语言

    • 包括 rpart 包用于构建决策树。

通过理解和应用决策树算法,你可以有效地解决许多分类和回归问题。如果你有具体的问题或需要进一步的解释,请随时告诉我。

特征选择准则

决策树的特征选择准则是构建决策树过程中非常重要的步骤,它决定了如何选择最佳的分割属性。不同的特征选择准则会影响决策树的质量和性能。以下是几种常用的特征选择准则:

1. 信息增益(Information Gain)

信息增益是最常用的特征选择准则之一,它衡量了使用某个特征进行分割后,数据集不确定性的减少程度。

计算公式:

[ IG(A) = Entropy(D) - Entropy(A) ]

  • ( Entropy(D) ) 是原始数据集 ( D ) 的熵。
  • ( Entropy(A) ) 是使用特征 ( A ) 进行分割后的加权平均熵。
熵(Entropy)定义:

信息熵公式

特点:
  • 信息增益越大,说明该特征对数据集的分类贡献越大。
  • 信息增益偏向于选择具有较多唯一值的特征,因为它更容易减少熵。

2. 信息增益比(Gain Ratio)

信息增益比是为了解决信息增益偏向选择具有较多唯一值的特征的问题而提出的。

计算公式:

信息增益比

分割信息(SplitInfo)定义:

在这里插入图片描述

特点:
  • 信息增益比通过除以分割信息来标准化信息增益,使得选择特征更加公平。

3. 基尼指数(Gini Index)

基尼指数用于衡量数据集的纯度,通常用于 CART 算法中。

计算公式:

在这里插入图片描述

特点:
  • 基尼指数越小,说明数据集的纯度越高。
  • 基尼指数的计算相对简单,适用于二分类或多分类问题。

4. 基尼减少量(Gini Decrease)

在 CART 算法中,使用基尼减少量来衡量使用某个特征进行分割后的基尼指数减少量。

计算公式:

基尼减少量

特点:
  • 基尼减少量越大,说明该特征对数据集的分类贡献越大。

选择准则的对比

  1. 信息增益

    • 直观易懂,计算简单。
    • 偏向于选择具有较多唯一值的特征。
  2. 信息增益比

    • 通过除以分割信息来避免信息增益的偏向性。
    • 计算稍微复杂一些,但更公平。
  3. 基尼指数

    • 计算简单,适用于分类任务。
    • 不需要计算对数函数,更适合数值计算。

实际应用

在实际应用中,不同的特征选择准则可能会导致不同的决策树结构。通常,选择哪种准则取决于具体的应用场景和数据特点。例如:

  • 如果数据集中特征的唯一值差异很大,可以选择信息增益比来避免偏向。
  • 如果数据集比较简单,可以选择信息增益或基尼指数来简化计算。

Python 示例

以下是使用 scikit-learn 构建决策树并指定不同特征选择准则的示例:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import numpy as np

# 加载数据集
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_info_gain = DecisionTreeClassifier(criterion='entropy')
clf_info_gain.fit(X_train, y_train)
print("Accuracy using Information Gain:", clf_info_gain.score(X_test, y_test))

# 使用信息增益比
clf_info_gain_ratio = DecisionTreeClassifier(criterion='gini')
clf_info_gain_ratio.fit(X_train, y_train)
print("Accuracy using Information Gain Ratio:", clf_info_gain_ratio.score(X_test, y_test))

# 使用基尼指数
clf_gini = DecisionTreeClassifier(criterion='gini')
clf_gini.fit(X_train, y_train)
print("Accuracy using Gini Index:", clf_gini.score(X_test, y_test))

通过理解和应用这些特征选择准则,可以有效地构建和优化决策树模型。如果你有具体的问题或需要进一步的解释,请随时告诉我。

决策树剪枝算法

决策树剪枝(Pruning)是为了防止过拟合而采取的一种技术。通过剪枝,可以减少决策树的复杂度,使其更简洁、更易于解释,并且在新的数据上表现更好。剪枝分为两种主要类型:预剪枝(Pre-pruning)和后剪枝(Post-pruning)。

1. 预剪枝(Pre-pruning)

预剪枝是在构建决策树的过程中提前停止树的增长,以防止过拟合。常见的预剪枝方法包括:

1.1 设置最大深度(Max Depth)
  • 定义:限制决策树的最大深度,超过该深度则不再继续分裂。
  • 优点:简单直观,易于实现。
  • 缺点:可能会过早停止,导致欠拟合。
1.2 设置最小样本数(Min Samples Split)
  • 定义:设置一个节点必须拥有的最小样本数才能继续分裂。
  • 优点:可以防止过拟合,同时保留足够的信息。
  • 缺点:需要调整参数以找到最佳值。
1.3 设置最小信息增益(Min Impurity Decrease)
  • 定义:只有当分裂后的信息增益大于某个阈值时,才继续分裂。
  • 优点:可以防止不必要的分裂,提高模型的泛化能力。
  • 缺点:需要调整阈值。

2. 后剪枝(Post-pruning)

后剪枝是在决策树完全构建之后,通过删除某些子树来简化模型。常见的后剪枝方法包括:

2.1 成本复杂度剪枝(Cost Complexity Pruning)
  • 定义:通过引入一个剪枝参数 α 来衡量子树的复杂度和误差,选择最佳的剪枝方案。

  • 计算公式
    在这里插入图片描述

    其中,Error(T) 是树 ( T ) 的误差,|Leaf(T)| 是叶子节点的数量。

  • 优点:能够找到最优的剪枝方案。

  • 缺点:需要通过交叉验证来确定剪枝参数 α。

2.2 最小误差剪枝(Minimum Error Pruning)
  • 定义:从决策树的底部开始,逐个删除子树,并通过交叉验证来评估剪枝前后模型的性能。
  • 优点:直观易懂,易于实现。
  • 缺点:可能会过度剪枝,导致欠拟合。
2.3 错误估计剪枝(Error-Based Pruning)
  • 定义:通过估计删除子树后的误差增加量来决定是否剪枝。
  • 优点:可以更精确地控制剪枝的程度。
  • 缺点:需要更多的计算资源。

Python 示例

以下是使用 scikit-learn 进行决策树剪枝的示例:

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

# 加载数据集
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.set_params(max_depth=3)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("Accuracy with max_depth=3:", accuracy_score(y_test, y_pred))

# 预剪枝示例:设置最小样本数
clf.set_params(min_samples_split=20)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("Accuracy with min_samples_split=20:", accuracy_score(y_test, y_pred))

# 后剪枝示例:成本复杂度剪枝
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities

clfs = []
for ccp_alpha in ccp_alphas:
    clf = DecisionTreeClassifier(random_state=42, ccp_alpha=ccp_alpha)
    clf.fit(X_train, y_train)
    clfs.append(clf)

# 选择最佳剪枝参数
scores = [clf.score(X_test, y_test) for clf in clfs]
best_alpha_idx = np.argmax(scores)
best_clf = clfs[best_alpha_idx]
best_ccp_alpha = ccp_alphas[best_alpha_idx]

print("Best ccp_alpha:", best_ccp_alpha)
print("Accuracy with best ccp_alpha:", scores[best_alpha_idx])

总结

通过预剪枝和后剪枝,可以有效地防止决策树过拟合,并提高模型的泛化能力。选择合适的剪枝方法取决于具体的应用场景和数据特点。预剪枝通常更简单,易于实现,而后剪枝通常可以获得更精确的模型。

如果你有具体的问题或需要进一步的解释,请随时告诉我。

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

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

相关文章

ubuntu20.4安装Qt5.15.2

ubantu20.4镜像下载地址: https://releases.ubuntu.com/focal/ubuntu-20.04.6-desktop-amd64.iso Qt5.15.2下载地址: https://download.qt.io/official_releases/online_installers/ 安装步骤 1、进入地址后选择对应安装包,我这是ubuntu…

Redis进阶(二)--Redis高级特性和应用

文章目录 第二章、Redis高级特性和应用一、Redis的慢查询1、慢查询配置2、慢查询操作命令3、慢查询建议 二、Pipeline三、事务1、Redis的事务原理2、Redis的watch命令3、Pipeline和事务的区别 四、Lua1、Lua入门(1)安装Lua(2)Lua基…

虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天

SETUP:工具和插件 工具:elevenlabs或者讯飞,用于Speech Synthesis(语音合成,text to speech)。 https://elevenlabs.io/app/speech-synthesis/text-to-speechhttps://elevenlabs.io/app/speech-synthesis…

海外云手机——跨国业务的高效工具

海外云手机是一种基于云计算的虚拟手机服务,依托海外服务器实现跨国网络访问。这项服务不仅具备传统智能手机的所有功能,还突破了地域限制,为跨国业务提供更加便捷、高效、安全的解决方案。 随着全球化的加速和互联网的快速普及,跨…

C语言深入理解指针五(18)

文章目录 前言一、回调函数是什么?二、qsort使用举例使用qsort函数排序整型数据使用qsort函数排序结构数据 三、qsort的模拟实现总结 前言 本篇将会很有意思! 一、回调函数是什么? 回调函数就是一个通过函数指针调用的函数。   如果你把函数…

代码随想录27期|Python|Day52|​动态规划|​647. 回文子串|516. 最长回文子序列

本文是动态规划的回文字符串部分。 647. 回文子串 本题需要搞清楚dp的定义、遍历顺序和递推公式。 1、dp数组的定义 由图片可知,不同于之前的dp数组直接定义为当前遍历到的位置处题目所要求得值,而是应该定义为i为开始,j为结束的子串是否是…

探索音视频SDK的双重核心:客户端与服务端的协同作用

在当今的数字化时代,音视频技术已成为连接人与人、人与世界的重要桥梁。从社交娱乐到在线教育,从远程医疗到视频会议,音视频技术的应用无处不在,极大地丰富了我们的生活方式和工作模式。本文将深入探讨音视频SDK的两大核心类别——…

横版闯关手游【全明星时空阿拉德】Linux手工服务端+运营后台+双app端

横版闯关手游【时空阿拉德】(【全明星阿拉德】)阿拉德系列2022整理Linux手工服务端余额充值后台安卓苹果双端。 运营后台看目录结构是thinkphp开发的。 代码免费下载:百度网盘

DNAT和SNAT实践

NAT分SNAT和DNAT两种。从名字上区分: SNAT将源IP地址替换为出口网络的IP地址,以便内网地址可以访问外网服务。一般受限于公网IP有限,一个内网集合想访问外网服务,则用统一的出口做代理。出口配置公网IP,帮助从此发出的…

Java重修笔记 第五十四天 坦克大战(二)常用的绘图方法、画出坦克图形

常用的绘图方法 1.设置当前画笔的颜色,可多次调用 public abstract void setColor(Color c) 参数:c -颜色 2. 画一条直线 public abstract void drawLine(int x1, int y1, int x2, int y2) 参数:x1 - 第一个点的 x坐标。 y1 - 第一点的 y坐…

Git使用—把当前仓库的一个分支push到另一个仓库的指定分支、基于当前仓库创建另一个仓库的分支并推送到对应仓库(mit6828)

目录 背景提示 将当前仓库的一个分支push到另一个仓库的指定分支 直接基于仓库rep1中的某个分支创建新的分支并将其推送到目标仓库rep2 补充 参考链接 背景提示 最近打算做一下mit6.828的项目,这个仓库使用问题困扰了自己一段时间,由于6828官方提供…

92、K8s之ingress下集

一、ingress 1.1、两种部署方式 1、ingress------------deployment nodeport ​ daemonset hostnetwork----每台设备只能有一个pod,因为直接使用宿主机的端口,所以只能开启一个pod。 2、ingress------svc------deployment里面的pod,这种…

文件IO编程

文章目录 文件描述符相关系统调用文件有关的系统调用文件操作函数--creat函数文件操作函数--open函数文件操作函数--read函数文件操作函数--write函数文件操作函数--close函数文件操作函数--lseek函数缓冲区的大小对性能的影响 实验:调用系统函数,实现文…

Linux:体系结构和操作系统管理

目录 一、冯诺依曼体系结构 1.问题1 2.问题2 二、操作系统管理 一、冯诺依曼体系结构 本章将会谈论一下对冯诺依曼计算机体系结构的理解。 在2024年,几乎所有的计算机,都遵守冯诺依曼体系结构。 冯诺依曼体系结构是应用在硬件层面的,而硬…

Docker高级管理--Compose容器编排与私有仓库(Docker技术集群与应用)

本文介绍了Docker的三大工具:Docker Machine用于创建和管理Docker主机,Docker Compose用于单引擎模式下的多容器应用部署和管理,而Docker Swarm则是一个集群管理工具,提供微服务应用编排功能。Docker Machine支持在不同环境配置Do…

【代码随想录训练营第42期 Day56打卡 - 图论Part6 - 并查集2 - 冗余连接问题

目录 一、做题心得 二、题目与题解 题目一:108. 冗余连接 题目链接 题解:并查集 题目二:109. 冗余连接II 题目链接 题解:并查集 三、小结 一、做题心得 冗杂连接问题是图论章节应用并查集的经典问题。所有的顶点通过边相…

Redis 篇- 实战项目中使用 Redis 实现经典功能(异步秒杀商品、点赞功能、共同关注的好友、投喂功能)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 使用 Redis 实现异步秒杀 1.1 基于 Lua 脚本判断是否符合条件:库存是否充足、一人一单 1.2 基于 Redis 中的 Stream 实现消息队列 1.3 使用 Java 操作…

Unity Hub自动安装指定版本Unity的Android开发环境

Unity开发Android环境要求SDK、DNK、JDK、Gradle版本都要对才能发布APK,自己去配置很容易出错。Unity Hub可以自动安装指定版本Unity的Android开发环境。 1.安装国内用的UnityHub(我这里用的3.3.2-c6) 2.找到对应的Unity版本 3.点击【从Unit…

docker管理redis集群

1.拉取redis镜像 docker pull redis拉取完成 [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis latest a617c1c92774 3 years ago 105MB2.运行redis容器 docker run -itd --name redis-test01 -p 6379:6379…

谈谈PCIe VID、DID、SSID、SSVID背后的智慧

PCIe Vendor ID 想了半天还是觉得从“ID是什么”这个问题开始比较好。那么ID是什么?ID就是身份。那身份又是什么?身份就是一个合理存在,用于区分不同个体。为什么叫“合理存在”呢?如果国家不给你发身份证,你就是黑户…