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

news/2024/9/17 15:14:10/ 标签: 机器学习, 算法, 决策树

文章目录

    • 什么是决策树
    • 特征选择准则
      • 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 语言

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

特征选择准则

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

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.impuritiesclfs = []
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.ppmy.cn/news/1524153.html

相关文章

SprinBoot+Vue教务管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

MySQL原理之UUID主键分析,插入或更新语法分析

文章目录 1 MySQL不能用UUID做主键1.1 前言1.2 mysql和程序实例1.2.1 准备工作1.2.2 开始测试1.2.3 程序写入结果1.2.4 效率测试结果 1.3 使用uuid和自增id的索引结构对比1.3.1 自增id1.3.2 uuid 1.4 自增id缺点1.5 雪花算法 2 插入或更新2.1 on duplicate key2.1.1 定义2.1.2 …

计算机网络练级第一级————认识网络

目录 网络搁哪? 网络的发展史(了解) 独立模式: 网络互联: 局域网时期: 广域网时期: 什么是协议 TCP/IP五层/四层模型 用官话来说: 我自己的话来说 第一层应用层&#xff1…

LLM大模型学习:NLP三大特征抽取器(CNN/RNN/TF)

NLP三大特征抽取器(CNN/RNN/TF) 结论:RNN已经基本完成它的历史使命,将来会逐步退出历史舞台;CNN如果改造得当,将来还是有希望有自己在NLP领域的一席之地;而Transformer明显会很快成为NLP里担当…

Redis 篇-深入了解基于 Redis 实现消息队列(比较基于 List 实现消息队列、基于 PubSub 发布订阅模型之间的区别)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 消息队列的认识 2.0 基于 List 实现消息队列 2.1 基于 List 实现消息队列的优缺点 3.0 基于 PubSub 实现消息队列 3.1 基于 PubSub 的消息队列优缺点 4.0 基于 St…

DC 板 boot 测 nor 兼容性记录(qspi )

DC 板 boot 测 nor 兼容性记录(qspi ) 软件问题: 1、DC板在跑 qspi时,在跑ddr 初始化部分需要修改以下参数,否则会在fsbl stage1 或者 stage 3 出错。 Board配置选 ad101_v10; 2、由于socket与DC板接触可能…

超详细,手把手带你源码启动 Thingsboard-Gateway + MQTT 接入设备

超详细,手把手带你源码启动 Thingsboard-Gateway MQTT 接入设备 前置条件 thingsboard,我这里选择的是本地源码启动postgresql,这里采用的是个人服务器部署的公共服务EMQX,这里同样采用服务器部署的公共服务MQTTX 客户端Mysql【…

《JavaScript:前端开发的核心力量》

在当今的数字时代,JavaScript 无疑是前端开发中最重要的编程语言之一。它的强大功能和灵活性使得网页变得更加动态、交互性更强。本文将深入探讨 JavaScript 的各个方面,包括其历史、特点、基本语法、高级特性以及实际应用。 一、JavaScript 的历史 Java…

MDK编译过程、文件及_attribute__关键字

一.MDK编译过程及文件说明 1.MDK 的编译过程 2.编译结果说明 在工程的编译提示输出信息中有一个语句“Program Size:Codexx RO-dataxx RW-dataxx ZIdataxx”,它说明了程序各个域的大小,编译后,应用程序中所有具有同一性质的数据…

揭开面纱--机器学习

一、人工智能三大概念 1.1 AI、ML、DL 1.1.1 什么是人工智能? AI:Artificial Intelligence 人工智能 AI is the field that studies the synthesis and analysis of computational agents that act intelligently AI is to use computers to analog and instead…

11. 建立你的第一个Web3项目

11. 建立你的第一个Web3项目 在这一部分,我们将带你一步步地建立一个简单的Web3项目,从环境搭建到智能合约的创建与部署,再到开发一个去中心化应用(dApp)并与智能合约交互。这是你迈向Web3开发的第一步。 1. 环境搭建…

Groovy -> Groovy 集合操作

List的增删改查 [1, 2, 3, 4] [1, 2, 3, 4, 5, 6] [2, 3, 4] [3, 4] [1, 2, 3, 4] [3, 4, 10] [3, 4, 20] Element: 3 Element: 4 Element: 20 contains 3// log [1, 2, 3, 4] [1, 2, 3, 4, 5, 6] [2, 3, 4] [3, 4] [1, 2, 3, 4] [3, 4, 10] [3, 4, 20] Element: 3 Element: 4…

浅谈C#之任务调度TaskScheduler

一、基本介绍 TaskScheduler 是一个抽象类,用于控制任务的执行方式,特别是它们如何被安排到线程池中的线程上执行。 TaskScheduler 负责将 Task 对象排队并决定何时、以何种方式执行这些任务。 二、TaskScheduler的作用 调度任务:将任务分配…

【网络安全】密码学概述

1. 密码学概述 1.1 定义与目的 密码学是一门研究信息加密和解密技术的科学,其核心目的是确保信息在传输和存储过程中的安全性。密码学通过加密算法将原始信息(明文)转换成难以解读的形式(密文),只有拥有正…

MQ-2烟雾传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 mq2.h文件 mq2.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 MQ-2气体传感器是一种常用的气体传感器,用于检测空气中的烟雾浓度。工作原理是基于半导…

设计模式-行为型模式-状态模式

1.状态模式的定义 允许一个对象在其内部状态改变时改变他的行为,用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题,状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活变化&…

计算987654321*123456789

#include <stdio.h>int main() {int a[9] {9,8,7,6,5,4,3,2,1};int b[9] {1,2,3,4,5,6,7,8,9};int c[20] {0};//定义第三个数组装乘积值int flag 0;//定义一个标志位int count 0;//定义一个进位//先进位再相加for(int i 0;i < 9;i)//遍历数组a的每一位{for(int …

AI学习者的Python快速入门指南

Python 已成为 AI 和数据科学的事实标准编程语言。尽管存在无需编码的解决方案&#xff0c;但学习编程仍然是构建完全定制化 AI 项目或产品的必要途径。在本文中&#xff0c;我将分享一个 Python 入门快速指南&#xff0c;帮助初学者进行 AI 开发。我会先介绍基础知识&#xff…

2024数学建模国赛A题详细思路:基于空间几何运动学和优化模型matlab求解

2024数学建模国赛A题“板凳龙”闹元宵 2024高教社杯数学建模竞赛A题B题C题D题E题完整成品文章和全部问题的解题代码完整版本更新如下&#xff1a;https://www.yuque.com/u42168770/qv6z0d/rytbc1nelty1mu4o % 定义常量 L_head 3.41; % 龙头长度&#xff08;米&#xff09; L…

RS®FSWP 相位噪声分析仪和 VCO 测试仪信号源和组件的高端分析

FSWP 相位噪声分析仪和VCO测试仪 价格实惠&#xff0c;性能出众 R&SFSWP 相位噪声分析仪和 VCO 测试仪结合噪声极低的内部源与互相关技术&#xff0c;具备高灵敏度。它可在数秒内测量高度稳定的信号源的相位噪声。 R&SFSWP 还具备脉冲信号测量、加性相位噪声&…