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

news2024/12/23 14:08:22

目录

决策树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 np

class Node:
    def __init__(self, gini, num_samples, num_samples_per_class, predicted_class):
        self.gini = gini
        self.num_samples = num_samples
        self.num_samples_per_class = num_samples_per_class
        self.predicted_class = predicted_class
        self.feature_index = 0
        self.threshold = 0
        self.left = None
        self.right = None

def split(nodeX, nodeY, nodeX_col, split_index, split_value):
    left_indices = nodeX[:, nodeX_col] < split_value
    right_indices = nodeX[:, nodeX_col] >= split_value

    nodeY_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_right

def calculate_gini(groups, classes):
    gini = 0.0
    n_instances = float(sum([len(group) for group in groups]))
    for group in groups:
        size = float(len(group))
        if size == 0:
            continue
        score = 0.0
        group_classes = [row[-1] for row in group]
        for class_val in classes:
            p = group_classes.count(class_val) / size
            score += p * p
        gini += (1.0 - score) * (size / n_instances)
    return gini

def get_split(dataset, labels):
    class_values = list(set(labels))
    b_index, b_value, b_score, b_groups = 999, 999, 999, None

    for 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, groups

    return {'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, right

def 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 node

def 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_class
    else:
        if node.right:
            return predict(node.right, row)
        return node.predicted_class

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

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

相关文章

产品经理-工作中5大类技术名词解析(19)

在产品经理与开发的团队协作中,如果自己知道一些专业术语,对业务的开展是有帮助的&#xff0c;很多时候,在沟通过程当中,就是因为自己不懂,所以才不知道怎么去做,想要什么样的结果 在力所能及的情况下,平时,多了解一些专业术语,是有好处的 数据结构 数据结构是技术人员将数据进…

LeetCode——被管绕的区域

题目描述 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O 组成&#xff0c;捕获 所有 被围绕的区域&#xff1a; 连接&#xff1a;一个单元格与水平或垂直方向上相邻的单元格连接。区域&#xff1a;连接所有 O 的单元格来形成一个区域。围绕&#xff1a;如果您可…

数据库系统概论:事务与并发一致性问题

随着网络应用的普及&#xff0c;数据库并发问题变得越来越重要。数据库并发指的是多个用户或进程同时访问和操作数据库的能力。它是数据库系统性能优化的重要方面&#xff0c;旨在提高系统的吞吐量和响应时间&#xff0c;以满足多用户同时访问数据库的需求。然而&#xff0c;这…

GPT-4o模型开通使用教学,解除使用限制【Outlook版】

OpenAI的GPT-4o模型免费用户都可以使用&#xff0c;但是遗憾的是每三小时可以使用十次问答。 但是还是有好多同学连使用都不会&#xff0c;今天这篇文章教会你如何使用并解除使用限制。 大家可以使用Outlook邮箱。 打开outlook官网选择中间获得免费账户。 ​ 在接下来的邮…

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习…

【Qt】常用控件

文章目录 QWidgetenabledgeometrywindow framewindowTitlewindowIconqrc资源管理windowOpacitycursorfonttoolTipfocusPolicystyleSheet 按钮类PushButtonRadioButtonCheckBoxSignals 显示类LabelLCDNumberProgressBarCalendar 输入类LineEditTextEditComboBoxSpinBoxDateTimeE…

55 、mysql的存储引擎、备份恢复以及日志备份、恢复

一、数据库的存储引擎&#xff1a; 1.1、存储引擎的概念 概念&#xff1a;存储引擎&#xff0c;就是一种数据库存储数据的机制&#xff0c;索引的机制&#xff0c;索引的技巧&#xff0c;锁定水平。 存储的方式和存储的格式。 存储引擎也属于mysql当中的组件&#xff0c;实…

Python游戏开发之制作捕鱼达人游戏-附源码

制作一个简单的“捕鱼达人”游戏可以使用Python结合图形界面库&#xff0c;比如Pygame。Pygame是一个流行的Python库&#xff0c;用于创建视频游戏&#xff0c;它提供了图形、声音等多媒体的支持。以下是一个基础的“捕鱼达人”游戏框架&#xff0c;包括玩家控制一个炮台来射击…

小程序博客搭建分享,纯微信小程序原生实现

本项目代码已开源&#xff0c;具体见&#xff1a; 前端工程&#xff1a;vue3-ts-blog-frontend 后端工程&#xff1a;express-blog-backend 小程序源码&#xff1a;blog-weapp 数据库初始化脚本&#xff1a;关注公众号程序员白彬&#xff0c;回复关键字“博客数据库脚本”&…

【ML练习】决策树

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、决策树算法概述 二、代码实现 代码目标&#xff1a;我们希望通过鸢尾花数据&#xff0c;训练一个决策树模型&#xff0c;之后应用该模型&#xff0c;可以…

新的铸造厂通过 PROFIBUS 技术实现完全自动化

钢铁生产商某钢以其在厚钢板类别中极高的产品质量而闻名。其原材料&#xff08;板坯连铸机&#xff09;在钢铁厂本地生产&#xff0c;该厂最近新建了一座垂直连铸厂。该项目的一个主要目标是从一开始就完全自动化这座新工厂和整个铸造过程&#xff0c;以高成本效率实现最佳产品…

ue5 使用动画蒙太奇,混合上半身持枪姿势

ue5 使用动画蒙太奇 1.创建动画蒙太奇 添加上半身插槽&#xff0c;在添加持枪动画 搜索equip stand,t&#xff0c;添加进上半身插槽 2.设置动画蓝图 3.播放动画蒙太奇

AFAC2024-基于保险条款的问答 比赛日记 llamafactory qwen npu 910B1

AFAC2024: 基于保险条款的问答挑战——我的实战日记 概述 在最近的AFAC2024竞赛中&#xff0c;我参与了基于保险条款的问答赛道。这是一次深度学习与自然语言处理的实战演练&#xff0c;旨在提升模型在复杂保险文本理解与问答生成方面的能力。本文将分享我的参赛过程&#xf…

C语言 #字符指针

文章目录 前言 一、指针概念简述 二、字符指针 二、字符在内存中的存储 总结 前言 以例子为导向来分析字符指针的中存的是什么&#xff0c;以及常量字符串在内存中是如何存储的。 一、指针概念简述 想要详细地了解指针的概念可以戳此链接&#xff08;详细的万字讲解&#xff…

机器学习基础入门(1)

最近也在努力的想要学习些机器学习的知识&#xff0c;目前正在了解各个概念及术语&#xff0c;下面就把学习到的概念都列出来。 人工智能 (AI) Artificial intelligence 人工智能生成内容&#xff08;AIGC&#xff09; 机器学习&#xff08;ML&#xff09; Machine Learning …

《汇编语言 基于x86处理器》- 读书笔记 - Visual Studio 2019 配置 MASM环境

安装 Visual Studio 2019 配置 MASM环境 下载 Visual Studio Installer安装 Visual Studio 20191. 双击运行2. 自定义安装内容3. 修改 MSVC 工具集版本4. 设置主题&#xff08;可选&#xff09;5. 安装代码高亮插件 AsmDude&#xff08;可选&#xff09;6. 通义灵码&#xff08…

【AI学习】关于Scaling Law的相关学习

一、苦涩的教训 首先&#xff0c;学习一段重要话语&#xff1a; The biggest lesson that can be read from 70 years of AI research is that general methods that leverage computation are ultimately the most effective, and by a large margin. 从70年的人工智能研究中…

服务器借助笔记本热点WIFI上网

一、同一局域网环境 1、当前环境&#xff0c;已有交换机组网环境&#xff0c;服务器已配置IP信息。 设备ip服务器125.10.100.12交换机125.10.100.0/24笔记本125.10.100.39 2、拓扑图 #mermaid-svg-D4moqMym9i0eeRBm {font-family:"trebuchet ms",verdana,arial,sa…

FastAPI(六十五)实战开发《在线课程学习系统》基础架构的搭建

在之前三篇&#xff0c;我们分享的就是需求的分析&#xff0c;基本接口的整理&#xff0c;数据库链接的配置。这次我们分享项目的基本框架&#xff0c;目录结构大致如下&#xff1a; common目录&#xff1a; 通用目录&#xff0c;放一些通用的处理 models目录&#xf…

达梦数据库(一)mysql2dm

达梦数据库(一)mysql2dm 文章目录 达梦数据库(一)mysql2dm一、安装篇ForWindows二、数据库初始化篇三、数据迁移篇出现的问题找不到对应表或者视图 注意字符集模式迁移出错大小写敏感解决方案 四、 代码修改篇group_concatGROUP BY方法一方法二(最笨)方法补充 多表联查更新参考…