AI算法24-决策树C4.5算法

目录

决策树C4.5算法概述

决策树C4.5算法简介

决策树C4.5算法发展历史

决策树C4.5算法原理

信息熵(Information Entropy)

信息增益(Information Gain)

信息增益比(Gain Ratio)

决策树C4.5算法改进

决策树C4.5算法流程

步骤1:数据准备

步骤2:计算信息熵

步骤3:选择最优特征

步骤4:递归构建决策树

步骤5:决策树剪枝(可选)

决策树C4.5算法代码实现

决策树C4.5算法的优缺点

优点

缺点

决策树C4.5算法的应用场景

金融领域

医疗领域

电商领域

数据挖掘

机器学习研究

教育领域

环境监测


决策树C4.5算法概述

决策树C4.5算法简介

C4.5算法是由Ross Quinlan开发的用于产生决策树的算法。该算法是对Ross Quinlan之前开发的ID3算法的一个扩展。C4.5算法产生的决策树可以被用作分类目的,因此该算法也可以用于统计分类。 C4.5算法与ID3算法一样使用了信息熵的概念,并和ID3一样通过学习数据来建立决策树

C4.5算法是数据挖掘十大算法之一,它是对ID3算法的改进,相对于ID3算法主要有以下几个改进

  1. 用信息增益比来选择属性
  2. 在决策树的构造过程中对树进行剪枝
  3. 对非离散数据也能处理
  4. 能够对不完整数据进行处理

决策树C4.5算法发展历史

最早的决策树算法是由Hunt等人于1966年提出的CLS。当前最有影响的决策树算法是由Quinlan于1986年提出的ID3和1993年提出的C4.5.其他早期算法还包括CART,FACT,CHAID算法。后期的算法主要有SLIQ, SPRINT, PUBLIC等。

传统的决策树分类算法主要是针对小数据集的,大都要求训练集常驻内存,这使得在处理数据挖掘任务时,传统决策树算法在可伸展性,精度和效率方面受到了很大的限制。而在实际的数据挖掘应用中我们面临的数据集往往是容量巨大的数据库或者数据仓库,在构造决策树时需要将庞大的数据在主存和缓存中不停地导入导出,使得运算效率大大降低。针对以上问题,许多学者提出了处理大型数据集的决策树算法。

A

B

C

1

年份

事件

相关论文

2

1993

Ross QuinlanID3算法扩展,发明了C4.5算法

C4.5: Programs for Machine Learning. Morgan Kaufmann Publishers.ISBN1-55860-238-0

3

2002

讲解了离散类数据挖掘的标杆属性选择技术,其中讲解了C4.5在大数据挖掘的应用。

Hall M A, Holmes G. Benchmarking Attribute Selection Techniques for Discrete Class Data Mining[J]. IEEE Transactions on Knowledge & Data Engineering, 2002, 15(6):1437-1447.

决策树C4.5算法原理

在深入了解C4.5算法之前,有必要明确几个核心概念和度量指标。本节将重点介绍信息熵、信息增益、以及信息增益比,这些都是C4.5算法决策树构建中的关键因素。

信息熵(Information Entropy)

信息熵是用来度量一组数据的不确定性或混乱程度的。它是基于概率论的一个概念,通常用以下数学公式来定义:

信息增益(Information Gain)

信息增益表示通过某个特征进行分裂后,数据集不确定性(即信息熵)下降的程度。信息增益通常用以下数学公式来定义:

信息增益比(Gain Ratio)

信息增益比是信息增益与该特征导致的数据集分裂复杂度(Split Information)的比值。用数学公式表示为:

决策树C4.5算法改进

在ID3中:

信息增益

按属性A划分数据集S的信息增益Gain(S,A)为样本集S的熵减去按属性A划分S后的样本子集的熵,即

在此基础上,C4.5计算如下:

分裂信息

利用引入属性的分裂信息来调节信息增益

信息增益率

信息增益率将分裂信息作为分母,属性取值数目越大,分裂信息值越大,从而部分抵消了属性取值数目所带来的影响。

相比ID3直接使用信息熵的增益选取最佳属性,避免因某属性有较多分类取值因而有较大的信息熵,从而更容易被选中作为划分属性的情况。

决策树C4.5算法流程

在这一部分中,我们将深入探讨C4.5算法的核心流程。流程通常可以分为几个主要步骤,从数据预处理到决策树的生成,以及后续的决策树剪枝。下面是更详细的解释:

步骤1:数据准备

在决策树的构建过程中,首先需要准备一个训练数据集。这个数据集应该包含多个特征(或属性)和一个目标变量(或标签)。数据准备阶段也可能包括数据清洗和转换。

步骤2:计算信息熵

信息熵是一个用于衡量数据不确定性的度量。在C4.5算法中,使用信息熵来评估如何分割数据。

步骤3:选择最优特征

在决策树的每一个节点,算法需要选择一个特征来分割数据。选择哪个特征取决于哪个特征会导致信息熵最大的下降(或信息增益最大)。

步骤4:递归构建决策树

一旦选择了最优特征并根据该特征分割了数据,算法将在每个分割后的子集上递归地执行同样的过程,直到满足某个停止条件(如,所有数据都属于同一类别或达到预设的最大深度等)。

步骤5:决策树剪枝(可选)

决策树剪枝是一种优化手段,用于去除决策树中不必要的节点,以防止过拟合。

决策树C4.5算法代码实现

import numpy as npclass Node:def __init__(self, gini, num_samples, num_samples_per_class, predicted_class):self.gini = giniself.num_samples = num_samplesself.num_samples_per_class = num_samples_per_classself.predicted_class = predicted_classself.feature_index = 0self.threshold = 0self.left = Noneself.right = Nonedef split(nodeX, nodeY, nodeX_col, split_index, split_value):left_indices = nodeX[:, nodeX_col] < split_valueright_indices = nodeX[:, nodeX_col] >= split_valuenodeY_left = nodeY[left_indices]nodeX_left = nodeX[left_indices]nodeY_right = nodeY[right_indices]nodeX_right = nodeX[right_indices]return nodeX_left, nodeY_left, nodeX_right, nodeY_rightdef calculate_gini(groups, classes):gini = 0.0n_instances = float(sum([len(group) for group in groups]))for group in groups:size = float(len(group))if size == 0:continuescore = 0.0group_classes = [row[-1] for row in group]for class_val in classes:p = group_classes.count(class_val) / sizescore += p * pgini += (1.0 - score) * (size / n_instances)return ginidef get_split(dataset, labels):class_values = list(set(labels))b_index, b_value, b_score, b_groups = 999, 999, 999, Nonefor index in range(len(dataset[0])-1):for row in dataset:groups = [row[index] < value for value in row[index]]score = calculate_gini(groups, class_values)if score < b_score:b_index, b_value, b_score, b_groups = index, row[index], score, groupsreturn {'index': b_index, 'value': b_value, 'groups': b_groups}def to_terminal(group):outcomes = [row[-1] for row in group]return outcomes.index(max(set(outcomes), key=outcomes.count))def split_dataset(dataset, labels, index, value):left, right = list(), list()for row, label in zip(dataset, labels):if row[index] < value:left.append(row)else:right.append(row)return left, rightdef grow_tree(dataset, labels, depth=0):labels = [label[-1] for label in labels]dataset, labels = shuffle(dataset, labels)best问答, groups = get_split(dataset, labels)left, right = split_dataset(dataset, labels, best问答['index'], best问答['value'])del (best问答['groups'])# 判断是否终止if not left or not right:return to_terminal(dataset)# 递归生成子树node = Node(gini=best问答['score'], num_samples=len(dataset), num_samples_per_class=[len(l) for l in labels], predicted_class=best问答['value'])if len(left) > 0:node.left = grow_tree(left, labels, depth+1)if len(right) > 0:node.right = grow_tree(right, labels, depth+1)return nodedef print_tree(node, depth=0):if isinstance(node, tuple):print("\n" + depth*"  " + str(node))else:print("L:" + str(node.feature_index) + " <= " + str(node.threshold))print("\n" + depth*"  " + "Predict: " + str(node.predicted_class))if node.left:print_tree(node.left, depth+1)if node.right:print("L:" + str(node.feature_index) + " > " + str(node.threshold))print("\n" + depth*"  " + "Predict: " + str(node.predicted_class))print_tree(node.right, depth+1)def predict(node, row):if row[node.feature_index] <= node.threshold:if node.left:return predict(node.left, row)return node.predicted_classelse:if node.right:return predict(node.right, row)return node.predicted_classdef shuffle(dataset, labels):combined = list(zip(dataset, labels))np.random.shuffle(combined)dataset, labels = zip(*combined)return list(dataset), list(labels)def decision_tree_classifier(train_file_path):train_data = np.loadtxt(train_file_path, delimiter=',')train_data = np.array(train_data, dtype=np.float)train_dataset = train_data[:, :-1]train_labels = train_data[:, -1]tree = grow_tree(train_dataset, train_labels)print_tree(tree)test_data = np.loadtxt("test_data.txt", delimiter=',')test_dataset = test_data[:, :-1]test_labels = test_data[:, -1]predictions = list()for row in test_dataset:prediction = predict(tree, row)predictions.append(prediction)accuracy = sum([predictions[i] == test_labels[i] for i in range(len(test_labels))]) / float(len(test_labels))print("Accuracy: " + str(accuracy))if __name__ == "__main__":decision_tree_classifier("train_data.txt")

这段代码实现了C4.5算法的基本功能,包括数据的读取、决策树的生成、预测和准确率计算。你可以将训练数据和测试数据分别保存在train_data.txt和test_data.txt文件中,然后运行代码进行训练和测试。

决策树C4.5算法的优缺点

优点

  1. 易于理解和解释:决策树是白盒模型,每个节点的决策逻辑清晰,易于理解和解释。例如,银行可以轻易地解释给客户为什么他们的贷款申请被拒绝 。
  2. 能够处理非线性关系:C4.5算法能很好地处理特征与目标变量之间的非线性关系。例如,在电子商务网站中,用户年龄和购买意愿之间可能存在非线性关系,C4.5算法能捕捉到这种关系 。
  3. 对缺失值有较好的容忍性:C4.5算法可以容忍输入数据的缺失值,使其在医疗诊断等场景中仍然有效 。
  4. 处理连续属性:C5算法能够处理连续属性,通过单点离散化的方法选择最优的划分属性 。
  5. 剪枝优化:C4.5算法通过引入剪枝技术,能够有效地提升模型的泛化能力,减少过拟合的风险 。

缺点

  1. 容易过拟合:C4.5算法非常容易产生过拟合,尤其是当决策树很深的时候。例如,如果一个决策树模型在股票市场预测问题上表现得异常好,那很可能是该模型已经过拟合了 。
  2. 对噪声和异常值敏感:由于决策树模型在构建时对数据分布的微小变化非常敏感,因此噪声和异常值可能会极大地影响模型性能。例如,在识别垃圾邮件的应用中,如果训练数据包含由于标注错误而导致的噪声,C4.5算法可能会误将合法邮件分类为垃圾邮件 。
  3. 计算复杂度较高:C4.5算法在特征维度非常高时可能会有较高的计算成本。例如,在基因表达数据集上,由于特征数可能达到数千或更多,使用C4.5算法可能会导致计算成本增加 。
  4. 时间耗费大:C5算法在处理连续值时,需要计算所有可能的切分点,这使得算法的时间复杂度较高 。
  5. 未解决回归问题:C4.5算法主要用于分类问题,并未解决回归问题 。

决策树C4.5算法的应用场景

金融领域

  1. 信用评分:C4.5算法可以用于评估客户的信用风险,帮助银行和金融机构决定是否批准贷款或信用卡申请。通过构建决策树模型,可以对客户进行分类,从而为贷款审批提供依据。
  2. 风险评估:在金融风控中,C4.5算法可以分析客户的财务状况、信用评分等特征,评估贷款违约风险。

医疗领域

  1. 疾病诊断:C4.5算法可以用于辅助医生进行疾病诊断。通过对病人的特征进行分类,可以辅助医生做出更准确的诊断和治疗方案。
  2. 治疗方案选择:在医疗领域,C4.5算法还可以用于选择最佳的治疗方案,通过对病人的病情和治疗反应进行分析,提供个性化的治疗建议。

电商领域

  1. 商品推荐:在电商领域,C4.5算法可以分析用户的购买历史和行为特征,构建决策树模型,为用户推荐合适的商品。
  2. 用户细分:通过分析用户的行为数据,C4.5算法可以帮助电商平台进行用户细分,提供个性化的服务和营销策略。

数据挖掘

  1. 数据分类:C4.5算法在数据挖掘中用于将数据集分类,通过递归地将数据集划分成更小的子集,形成树状结构,以便进行决策。
  2. 特征选择:C4.5算法通过信息增益比(Gain Ratio)来选择最优的划分属性,构建决策树,从而在数据挖掘中实现高效的特征选择。

机器学习研究

  1. 算法比较:C4.5算法常与其他决策树算法(如ID3、CART和Random Forests)进行比较,研究其在不同应用场景下的适用性和性能表现。
  2. 模型优化:在机器学习研究中,C4.5算法的剪枝策略和对连续属性的处理机制被广泛研究,以提高模型的泛化能力和计算效率。

教育领域

  1. 学生评估:C4.5算法可以用于教育领域,通过分析学生的学习表现、行为特征等,预测学生的学业成绩或学习习惯。

环境监测

  1. 污染预测:在环境科学中,C4.5算法可以用于预测空气质量或水污染情况,通过对环境数据的分析,提供污染控制的建议。

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

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

相关文章

Golang中读写锁的底层实现

目录 Sync.RWMutex 背景与机制 接口简单介绍 sync.RWMutex 数据结构 读锁流程 RLock RUnlock RWMutex.rUnlockSlow 写锁流程 Lock Unlock Sync.RWMutex 背景与机制 从逻辑上&#xff0c;可以把 RWMutex 理解为一把读锁加一把写锁&#xff1b; 写锁具有严格的排他性&…

【python】OpenCV—Extreme Points in the Contour

文章目录 1、需求描述2、功能实现3、更多的例子4、完整代码5、参考 1、需求描述 给一张图片&#xff0c;找出其轮廓&#xff0c;并画出轮廓的上下左右极值点 输入图片 输出效果 2、功能实现 # 导入必要的包 import imutils import cv2 # 加载图像&#xff0c;将其转换为灰度…

vue3 + antd vue 纯前端 基于xlsx 实现导入excel 转 json,将json数据转换XLSX并下载(下载模版)

一、导入 0、关键代码 // 安装插件 npm i xlsx/yarn add xlsx // 导入xlsx import * as XLSX from xlsx; 点击提交的时候才整理数据。上传的时候文件保存在 state.form.file[0] 中的 // 定义字段映射关系 const fieldMap {sheet2json: {技能名称: skill_name,技能等级: …

uni-app 影视类小程序开发从零到一 | 开源项目分享

引言 在数字娱乐时代&#xff0c;移动设备已成为我们生活中不可或缺的一部分&#xff0c;尤其是对于电影爱好者而言&#xff0c;随时随地享受精彩影片成为一种日常需求。爱影家&#xff0c;一款基于 uni-app 开发的影视类小程序&#xff0c;正是为此而生。它不仅提供了丰富的影…

【Django+Vue3 线上教育平台项目实战】购物车与订单模块的精简实现与数据安全策略

文章目录 前言一、购物车模块1.后端核心逻辑2.前端页面代码3.操作流程及演示 二、订单模块1.订单模块模型类设计1.展示订单信息a.页面展示b.前端核心代码c.后端核心逻辑 2.订单是否使用优惠券与积分a.页面展示b.前端核心代码 3.订单支付方式a.页面展示b.前端核心代码 4.提交订单…

PyTorch Autograd内部实现

原文&#xff1a; 克補 爆炸篇 25s (youtube.com) 必应视频 (bing.com)https://www.bing.com/videos/riverview/relatedvideo?&qPyTorchautograd&qpvtPyTorchautograd&mid1B8AD76943EFADD541E01B8AD76943EFADD541E0&&FORMVRDGAR 前面只要有一个node的re…

北京交通大学《深度学习》专业课,实验3卷积、空洞卷积、残差神经网络实验

一、实验要求 1. 二维卷积实验&#xff08;平台课与专业课要求相同&#xff09; ⚫ 手写二维卷积的实现&#xff0c;并在至少一个数据集上进行实验&#xff0c;从训练时间、预测精 度、Loss变化等角度分析实验结果&#xff08;最好使用图表展示&#xff09; ⚫ 使用torch.nn…

Matlab基础语法篇(下)

Matlab基础语法&#xff08;下&#xff09; 一、逻辑基础&#xff08;一&#xff09;逻辑运算符&#xff08;二&#xff09;all、any、find函数&#xff08;三&#xff09;练习 二、结构基础&#xff08;一&#xff09;条件结构&#xff08;1&#xff09;if-elseif-else-end&am…

十、操作符详解

目录 1、操作符分类 2、二进制转换 2.1二进制转十进制 2.1.1、十进制转二进制 2.2、二进制转八进制和十六进制 2.2.1、二进制转八进制 2.2.2、二进制转十六进制 3、原码、反码、补码 4、移位操作符&#xff08;移动的是二进制位&#xff09; 4.1、左移操作符 4.2、右…

VMware虚拟机下安装Ubuntu(详细教程,最小系统的安装,含VMware Tools)

1.VM的下载安装 VMware的下载安装教程_vm16 pro下载-CSDN博客 2. Ubuntu 下载 在官网或者镜像站下载所需版本的.ios镜像&#xff0c;这个镜像在接下来的步骤中会用到&#xff1a; Ubuntu 22.04.4 LTS 下载 和 清华大学开源软件镜像站 - Ubuntu 22.04.4 下载 3. 创建虚拟机 […

【C语言】深入解析希尔排序

文章目录 什么是希尔排序&#xff1f;希尔排序的基本实现代码解释希尔排序的优化希尔排序的性能分析希尔排序的实际应用结论 在C语言编程中&#xff0c;希尔排序是一种高效的排序算法&#xff0c;是插入排序的一种更高效的改进版本。它通过比较相距一定间隔的元素来进行排序&am…

【STM32嵌入式系统设计与开发---拓展】——1_10矩阵按键

这里写目录标题 1、矩阵按键2、代码片段分析 1、矩阵按键 通过将4x4矩阵按键的每一行依次设为低电平&#xff0c;同时保持其它行为高电平&#xff0c;然后读取所有列的电平状态&#xff0c;可以检测到哪个按键被按下。如果某列变为低电平&#xff0c;说明对应行和列的按键被按下…

【Java】详解抽象类和接口的区别

一、抽象类和接口的主要区别表格 特性抽象类接口声明关键字abstractinterface声明访问修饰符public、protected、default&#xff08;不能用private&#xff09;public、default继承关键字extendsimplements变量跟普通类一样&#xff0c;可以包含实例变量、静态变量等 只能包含…

excel表怎么增乱序单词表 和正序单词表四六级要来了?!Excel帮你构建自己的单词库

excel表怎么增乱序单词表 和正序单词表四六级要来了&#xff1f;&#xff01;Excel帮你构建自己的单词库 1.背单词的第一步&#xff0c;当然是先上网找电子版的单词集。 盘搜搜 2. 建立 xls 格式的表格 3. 把下载的单词数据 复制到 表格 粘贴 4.新建一列 辅助列 生成随机数来…

网络编程-TCP/IP

网络概述 网络采用分而治之的方法设计&#xff0c;将网络的功能划分为不同的模块&#xff0c;以分层的形式有机组合在一起。 每层实现不同的功能&#xff0c;其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务&#xff0c;同时使用下层提供的服务 网络体系结构…

SpringMVC注解全解析:构建高效Web应用的终极指南 (上)

SpringMVC 是一个强大的 Web 框架&#xff0c;广泛应用于 Java Web 开发中。它通过注解简化了配置&#xff0c;增强了代码的可读性。本文将全面解析 SpringMVC 中常用的注解及其用法&#xff0c;帮助你构建高效的 Web 应用。 一. MVC介绍 MVC 是 Model View Controller 的缩写…

数字通云平台 智慧政务OA PayslipUser SQL注入漏洞复现

0x01 产品简介 数字通云平台智慧政务OA产品是基于云计算、大数据、人工智能等先进技术,为政府部门量身定制的智能化办公系统。该系统旨在提高政府部门的办公效率、协同能力和信息资源共享水平,推动电子政务向更高层次发展。 0x02 漏洞概述 数字通云平台 智慧政务OA Paysli…

使用百度语音技术实现文字转语音

使用百度语音技术实现文字转语音 SpringBootVue前后端分离项目 调用api接口需要使用AK和SK生成AccessToken,生成getAccessToken的接口有跨域限制,所以统一的由后端处理了 部分参数在控制台->语音技术->在线调试里面能找到 Controller RestController RequestMapping(&q…

PostgreSQL的引号、数据类型转换和数据类型

一、单引号和双引号&#xff08;重要&#xff09;&#xff1a; 1、在mysql没啥区别 2、在pgsql中&#xff0c;实际字符串用单引号&#xff0c;双引号相当于mysql的,用来包含关键字&#xff1b; -- 单引号&#xff0c;表示user_name的字符串实际值 insert into t_user(user_nam…

浏览器跨tab页面通信方式总结

需求&#xff1a; 浏览器不同 tab 标签页之间是独立的&#xff0c; 如果要通信必须通过特殊手段来实现跨标签页通信。 1.StorageEvent 事件 当一个标签页 localStorage 变化时&#xff08;sessionStorage 无效&#xff09;&#xff0c;同源下另一个或其他所有标签页使用 DO…