首页 > 编程语言 >决策树算法介绍:原理与案例实现

决策树算法介绍:原理与案例实现

时间:2024-06-18 19:28:11浏览次数:27  
标签:node Map String label 案例 算法 data 决策树

   感谢您阅读本文,欢迎“一键三连”。作者定会不负众望,按时按量创作出更优质的内容。
❤️ 1. 毕业设计专栏,毕业季咱们不慌,上千款毕业设计等你来选。

决策树算法是一种常用于分类和回归任务的监督学习算法。它通过树状模型对数据进行决策,是数据挖掘和机器学习中常见的技术之一。本文将详细介绍决策树算法的原理、构建过程,并通过伪代码和Java代码实现一个具体案例。

一、决策树算法原理

1.1 什么是决策树

决策树是一种树状结构,其中每个内部节点表示对某个属性的测试,每个分支表示测试结果的某个值,每个叶节点表示一个类别或回归值。决策树的目标是通过分裂数据集来形成一棵能够最大限度地减少数据集中的不纯度的树。

1.2 决策树的构建

决策树的构建过程可以通过以下几个步骤完成:

  1. 选择最佳属性:选择一个属性作为当前节点的分裂标准。常用的方法有信息增益、基尼指数等。
  2. 分裂数据集:根据选定的属性将数据集分裂成子集。
  3. 递归构建子树:对每个子集递归应用上述步骤,直到满足停止条件(如所有实例属于同一类别,或没有更多属性可分)。

1.3 决策树的优缺点

优点

  • 简单直观,易于理解和解释。
  • 既适用于分类,也适用于回归任务。
  • 不需要特征归一化。

缺点

  • 容易过拟合,尤其是在数据量较小或噪音较多的情况下。
  • 对于连续变量,需要对其进行分割处理。

二、决策树算法伪代码

Algorithm: Decision Tree Learning
Input: DataSet D, AttributeList A
Output: Decision Tree T

Function DecisionTree(D, A):
    1. Create a node N
    2. If all instances in D belong to the same class:
           return N as a leaf node with that class label
    3. If A is empty:
           return N as a leaf node with the most common class label in D
    4. Select the attribute a* from A that best splits D (based on criteria like information gain)
    5. Label node N with attribute a*
    6. For each possible value v of a*:
           6.1 Create a child node
           6.2 Split the data set D into subsets Dv where a* = v
           6.3 If Dv is empty:
                  Add a leaf node to N with the most common class label in D
           6.4 Else:
                  Recursively apply DecisionTree(Dv, A - {a*}) and attach the subtree to N
    7. Return N

三、Java 实现

下面是使用 Java 实现决策树算法的代码示例。

3.1 决策树节点类

import java.util.List;
import java.util.Map;

// 决策树节点类
class TreeNode {
    String attribute; // 属性名称
    Map<String, TreeNode> children; // 子节点
    String label; // 类别标签

    // 构造函数,叶节点
    public TreeNode(String label) {
        this.label = label;
    }

    // 构造函数,决策节点
    public TreeNode(String attribute, Map<String, TreeNode> children) {
        this.attribute = attribute;
        this.children = children;
    }
}

3.2 决策树算法类

import java.util.*;
import java.util.stream.Collectors;

public class DecisionTree {

    // 构建决策树
    public static TreeNode buildTree(List<Map<String, String>> data, List<String> attributes) {
        if (data.isEmpty()) {
            return null; // 数据为空,返回null
        }

        // 检查所有实例是否具有相同的标签
        Set<String> labels = data.stream().map(d -> d.get("label")).collect(Collectors.toSet());
        if (labels.size() == 1) {
            return new TreeNode(labels.iterator().next()); // 所有实例具有相同的标签,创建叶节点
        }

        if (attributes.isEmpty()) {
            // 返回一个具有最常见标签的叶节点
            String commonLabel = getMostCommonLabel(data);
            return new TreeNode(commonLabel);
        }

        String bestAttribute = selectBestAttribute(data, attributes); // 选择最佳属性
        Map<String, List<Map<String, String>>> partitions = partitionData(data, bestAttribute); // 分割数据

        Map<String, TreeNode> children = new HashMap<>();
        for (String value : partitions.keySet()) {
            List<String> newAttributes = new ArrayList<>(attributes);
            newAttributes.remove(bestAttribute); // 删除已使用的属性
            children.put(value, buildTree(partitions.get(value), newAttributes)); // 递归构建子树
        }

        return new TreeNode(bestAttribute, children); // 返回根节点
    }

    // 选择最佳属性(此处使用简单的方法,实际中应使用信息增益等更复杂的方法)
    private static String selectBestAttribute(List<Map<String, String>> data, List<String> attributes) {
        return attributes.get(0);
    }

    // 分割数据集
    private static Map<String, List<Map<String, String>>> partitionData(List<Map<String, String>> data, String attribute) {
        return data.stream().collect(Collectors.groupingBy(d -> d.get(attribute)));
    }

    // 获取最常见的标签
    private static String getMostCommonLabel(List<Map<String, String>> data) {
        return data.stream().collect(Collectors.groupingBy(d -> d.get("label"), Collectors.counting()))
                   .entrySet().stream().max(Map.Entry.comparingByValue()).get().getKey();
    }

    // 打印决策树
    public static void printTree(TreeNode node, String indent) {
        if (node.label != null) {
            System.out.println(indent + "Label: " + node.label); // 叶节点
        } else {
            System.out.println(indent + "Attribute: " + node.attribute); // 决策节点
            for (String value : node.children.keySet()) {
                System.out.println(indent + " Value: " + value);
                printTree(node.children.get(value), indent + "  ");
            }
        }
    }

    // 主方法,测试决策树
    public static void main(String[] args) {
        // 示例数据集
        List<Map<String, String>> data = new ArrayList<>();
        data.add(Map.of("color", "red", "shape", "round", "label", "apple"));
        data.add(Map.of("color", "yellow", "shape", "round", "label", "apple"));
        data.add(Map.of("color", "red", "shape", "oblong", "label", "banana"));
        data.add(Map.of("color", "yellow", "shape", "oblong", "label", "banana"));

        List<String> attributes = List.of("color", "shape"); // 属性列表

        TreeNode tree = buildTree(data, attributes); // 构建决策树
        printTree(tree, ""); // 打印决策树
    }
}

四、使用场景

决策树广泛应用于许多实际场景中,以下是一些典型的应用场景:

  1. 医疗诊断:决策树可用于医疗诊断,通过输入病人的症状和体征,决策树可以帮助医生做出诊断决定。
  2. 信用评估:银行和金融机构使用决策树模型来评估贷款申请人的信用评分,决定是否批准贷款。
  3. 市场营销:企业可以利用决策树来分析消费者行为,根据消费者的特征进行精准营销,提升转化率。
  4. 制造业故障诊断:通过分析机器的运行数据,决策树可以帮助识别潜在的故障,进行预防性维护。
  5. 文本分类:决策树可用于文本分类任务,例如垃圾邮件过滤,通过分析邮件的内容来确定其类别。

五、总结

决策树是一种直观且功能强大的机器学习算法,广泛应用于分类和回归任务中。本文详细介绍了决策树的原理、构建步骤,并通过伪代码和Java代码展示了决策树的实现方法。此外,还介绍了决策树在实际中的应用场景。通过本教程,你将深入理解决策树的基本原理和实际应用,掌握构建决策树模型的方法和技巧。希望本文能对你学习和应用决策树算法有所帮助。

   感谢您阅读本文,欢迎“一键三连”。作者定会不负众望,按时按量创作出更优质的内容。
❤️ 1. 毕业设计专栏,毕业季咱们不慌,上千款毕业设计等你来选。

标签:node,Map,String,label,案例,算法,data,决策树
From: https://blog.csdn.net/h__913246828/article/details/139779924

相关文章

  • 程序分享--常见算法/编程面试题:判断子序列
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • 数据结构与算法-红黑树的java实现-构建红黑树
    红黑树红黑树是一种二分查找树,与普通的二分查找树不同的一点是,红黑树的每个节点都有一个颜色(color)属性。该属性的值要么是红色,要么是黑色。通过限制从根到叶子的任何简单路径上的节点颜色,红黑树确保没有比任何其他路径长两倍的路径,从而使树近似平衡。节点红黑树的节......
  • 机器学习--有监督学习--分类算法(KNN算法)
     使用场景:做分类的,比如银行想做客户分类,看看新的这个客户,他是高风险用户还是低风险用户。原理使用:可以用贝叶斯分类,决策树算法,还有KNN,本篇主要整理KNN。KNN原理:有N个样本点,对新纪录r,使用KNN进行分类,看它属于哪个分类。具体如下:1、先确定k值,不建议太大,一般采用交叉验证法决定,k......
  • AI从云端到边缘:人员入侵检测算法的技术原理和视频监控方案应用
    在当今数字化、智能化的时代,安全已成为社会发展的重要基石。特别是在一些关键领域,如公共安全、智能化监管以及智慧园区/社区管理等,确保安全无虞至关重要。而人员入侵检测AI算法作为一种先进的安全技术,正逐渐在这些领域发挥着不可替代的作用。传统的人工监控方式往往难以做到全天......
  • RERCS系统开发实战案例-Part08 FPM 应用程序的表单组件(From UIBB)与列表组件(List UI
    1、新建FromUIBB的FPMApplication的快速启动面板备注:该步骤可第一步操作,也可最后一步操作,本人习惯第一步操作。1)使用事务码LPD_CUST,选择对应的角色与实例进入快速启动板定制页面;2)新建FPMApplication应用程序;注意:此处的应用程序别名用于ListUIBB的实施方法IF_FPM_G......
  • 【暑假Python上岸计划】最新20+Python实战案例,全程干货,30天看完即可接单就业!(基础+进阶
    前言今天给大家分享20+个基于python的实战案例,主要包含:数据分析、可视化、机器学习/深度学习、时序预测等,案例的主要特点:*提供源码:代码都是基于jupyternotebook,附带一定的注释,运行即可*数据齐全:大部分案例都有提供数据,部分案例使用内置数据集学习资料已打包,需要......
  • 代码随想录算法训练营第四十一天 | 0-1背包问题
    46.携带研究材料二维数组题目链接文章讲解视频讲解动态规划五部曲:dp[i][j]:下标i表示背包装0-i的物品(任取),j表示当前背包的最大容量,dp[i][j]表示容量为j时,装0-i的物品的最大价值递推公式:dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])dp[i-1][j]表示j......
  • 人工智能大模型发展八大趋势与行业应用案例
    随着科技的不断发展,人工智能已经成为了当今世界的热门话题之一。在这个领域,研究和发展的趋势也在不断变化。以下是人工智能研究与发展的八大趋势:1.强化学习的突破强化学习是人工智能领域的一个重要分支,它通过智能体与环境的交互学习来实现目标。近年来,随着深度学习技术的......
  • 蓝桥杯课程-贪心算法讲解
    1.区间调度问题问题描述在有限的区间范围内,选择完成最多的任务组合解决策略我们可以思考的策略有:1.最早开始时间(begin)2.最早结束时间(end)3.用时最少(end-begin)1.我们这里首先定方向:从区间最左端向右开始选择。2.我们很容易想到的策略是选择用时最少的情况,但是试想如果......
  • JQuery基础28_案例4
    一、隔行换色需求:将数据行的奇数行背景色设置为pink,偶数行背景色设置为yellow<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title><scriptsrc="../../js/jquery-3.3.1.min.js"><......