机器学习:决策树算法

article/2025/11/11 0:36:16

文章目录

  • 一、什么是决策树?
  • 二、决策树算法基本步骤
  • 三、算法实例
    • 1.数据集描述
    • 2.计算数据集香农熵
    • 3.数据集划分
    • 4.选择最好的数据集划分方式
    • 5.递归构建决策树
    • 6.创建树
    • 7.构造注解树
    • 8.使用决策树执行分类
    • 9.决策树的保存
  • 三、运行结果

一、什么是决策树?

决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。

在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。这一度量是基于信息学理论中熵的概念。

二、决策树算法基本步骤

1) 构建根节点,将所有训练数据都放在根节点,根据某种算法选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。

2) 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。

3)如果还有子集不能够被正确的分类,选取子集选择新的最优特征,继续对其进行分割,构建相应的节点,如此递归,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。

4)每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。

在这里插入图片描述

三、算法实例

1.数据集描述

在这里插入图片描述

 #训练集dataSet = [[0, 1, 0, 0, 'no'],[0, 1, 1, 1, 'yes'],[1, 1, 1, 0, 'no'],[2, 0, 1, 1, 'no'],[2, 0, 1, 0, 'no'],[2, 1, 1, 1, 'yes'],[0, 1, 0, 0, 'no'],[1, 0, 1, 1, 'no'],[2, 0, 1, 0, 'no'],[0, 0, 1, 0, 'no'],[0, 0, 1, 1, 'no'],[2, 1, 1, 0, 'no'],[1, 1, 1, 1, 'yes'],[1, 0, 1, 0, 'no'],[2, 1, 0, 0, 'no']]# 分类属性labels = ['年龄', '地址', '是否学习C语言', '是否学习机器学习']#测试数据testVec = [0, 1, 1, 1]

2.计算数据集香农熵

在这里插入图片描述

#计算数据集香农熵
def calcShannonEnt(dataSet):# 统计数据数量numEntries = len(dataSet)# 存储每个label出现次数label_counts = {}# 统计label出现次数for featVec in dataSet:current_label = featVec[-1]if current_label not in label_counts:  # 提取label信息label_counts[current_label] = 0  # 如果label未在dict中则加入label_counts[current_label] += 1  # label计数shannon_ent = 0  for key in label_counts:prob = float(label_counts[key]) / numEntriesshannon_ent -= prob * log(prob, 2)return shannon_ent

3.数据集划分

#数据集划分
def splitDataSet(data_set, axis, value):ret_dataset = []for feat_vec in data_set:if feat_vec[axis] == value:reduced_feat_vec = feat_vec[:axis]reduced_feat_vec.extend(feat_vec[axis + 1:])ret_dataset.append(reduced_feat_vec)return ret_dataset

4.选择最好的数据集划分方式

度量数据集的信息熵并有效划分数据集

#选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):    num_features = len(dataSet[0]) - 1base_entropy = calcShannonEnt(dataSet)best_info_gain = 0.0best_feature = -1#创建唯一的分类标签列表for i in range(num_features):feat_list = [exampel[i] for exampel in dataSet]unique_val = set(feat_list)new_entropy = 0.0# 计算每种划分方式的信息熵for value in unique_val:sub_dataset = splitDataSet(dataSet, i, value)prob = len(sub_dataset) / float(len(dataSet))new_entropy += prob * calcShannonEnt(sub_dataset)# 信息增益info_gain = base_entropy - new_entropyprint("第%d个特征的信息增益为%.3f" % (i, info_gain))# 计算最好的信息增益if info_gain > best_info_gain:        best_info_gain = info_gain  best_feature = iprint("最优索引值:" + str(best_feature))print()return best_feature

5.递归构建决策树

#递归构建决策树
def majority_cnt(class_list):class_count = {}# 统计class_list中每个元素出现的次数for vote in class_list:if vote not in class_count:class_count[vote] = 0class_count[vote] += 1# 根据字典的值降序排列sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)return sorted_class_count[0][0]

6.创建树

createTree是核心任务函数,它对所有的属性依次调用ID3信息熵增益算法进行计算处理,最终生成决策树

#创建树
def creat_tree(dataSet, labels, featLabels): class_list = [exampel[-1] for exampel in dataSet]# 如果类别完全相同则停止分类if class_list.count(class_list[0]) == len(class_list):return class_list[0]# 遍历完所有特征时返回出现次数最多的类标签if len(dataSet[0]) == 1:return majority_cnt(class_list)best_feature = chooseBestFeatureToSplit(dataSet)best_feature_label = labels[best_feature]featLabels.append(best_feature_label)my_tree = {best_feature_label: {}}del(labels[best_feature])# 得到训练集中所有最优特征的属性值feat_value = [exampel[best_feature] for exampel in dataSet]unique_vls = set(feat_value)for value in unique_vls:my_tree[best_feature_label][value] = creat_tree(splitDataSet(dataSet, best_feature, value), labels, featLabels)return my_tree

7.构造注解树

获取叶节点的数目和树的层数

def get_num_leaves(my_tree):num_leaves = 0first_str = next(iter(my_tree))second_dict = my_tree[first_str]for key in second_dict.keys():#测试节点的数据类型是否为字典if type(second_dict[key]).__name__ == 'dict':num_leaves += get_num_leaves(second_dict[key])else:num_leaves += 1return num_leavesdef get_tree_depth(my_tree):max_depth = 0      firsr_str = next(iter(my_tree))   second_dict = my_tree[firsr_str]for key in second_dict.keys():if type(second_dict[key]).__name__ == 'dict': this_depth = 1 + get_tree_depth(second_dict[key])else:this_depth = 1if this_depth > max_depth:max_depth = this_depth     return max_depth

8.使用决策树执行分类

def classify(input_tree, feat_labels, test_vec):# 获取决策树节点first_str = next(iter(input_tree))# 下一个字典second_dict = input_tree[first_str]feat_index = feat_labels.index(first_str)for key in second_dict.keys():if test_vec[feat_index] == key:if type(second_dict[key]).__name__ == 'dict':class_label = classify(second_dict[key], feat_labels, test_vec)else:class_label = second_dict[key]return class_label

9.决策树的保存

def storeTree(input_tree, filename):# 存储树with open(filename, 'wb') as fw:pickle.dump(input_tree, fw)def grabTree(filename):# 读取树fr = open(filename, 'rb')return pickle.load(fr)

三、运行结果

在这里插入图片描述


http://chatgpt.dhexx.cn/article/sFQ6UIxw.shtml

相关文章

决策树算法:ID3

决策树是最经常使用的数据挖掘算法,其核心是一个贪心算法,它采用自顶向下的递归方法构建决策树,下面是一个典型的决策树:   目前常用的决策树算法有ID3算法、改进的C4.5,C5.0算法和CART算法 ID3算法的核心是在决策树…

什么是决策树算法

1.1、什么是决策树 咱们直接切入正题。所谓决策树,顾名思义,是一种树,一种依托于策略抉择而建立起来的树。 机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象…

【机器学习】决策树算法解读

【机器学习】决策树算法解读 文章目录 【机器学习】决策树算法解读1. 介绍1.1 优缺点1.2 结构1.3 学习过程1.4 决策树与条件概率分布 2. 决策树学习过程2.1 训练策略2.2 特征选择2.2.1 信息增益和条件熵 2.3 决策树的生成2.3.1 ID32.3.2 C4.52.3.3 CART2.3.4 小结 2.4 决策树的…

详解决策树算法

决策树 1.1 决策树定义 何为决策树,顾名思义,就像树枝状的决策算法,通过各个节点的“决策”,实现对任务的精准分类或回归,决策树常用来处理分类问题,即使你以前没接触过决策树,你也可以通过下…

决策树算法及其实现

决策树算法及其实现 1 什么是决策树 决策树(Decision Tree)是一种基本的分类与回归方法,本文主要讨论分类决策树。决策树模型呈树形结构,在分类问题中,表示基于特征对数据进行分类的过程。它可以认为是if-then规则的…

决策树算法 (CART分类树)

决策树算法 (ID3,C4.5) CART回归树 决策树的后剪枝 在决策树算法原理(ID3,C4.5)中,提到C4.5的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处理分类不能处理回归。对这些问题&a…

决策树算法总结

决策树算法常用于解决分类问题,该方法的优势在于其数据形式非常容易理解。 概述 决策树(decision tree)是一类常见的机器学习方法.以二分类任务为例,我们希望从给定训练数据集学得一个模型用以对新示例进行分类&…

决策树算法原理简介

1,决策树概念简介 不同的算法模型适合于不同类型的数据。 首先,在了解树模型之前,自然想到树模型和线性模型有什么区别呢?其中最重要的是,树形模型是一个一个特征进行处理,之前线性模型是所有特征给予权重相加得到一个…

机器学习——决策树算法

文章目录 一、决策树介绍二、利用信息增益选择最优划分属性三、ID3代码实现1.jupyter下python实现2. 使用sklearn实现ID3 四、C4.5算法实现五、CART算法实现六、总结参考文献 一、决策树介绍 决策树是一种基于树结构来进行决策的分类算法,我们希望从给定的训练数据集…

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

1.基本定义 决策树(Decision Tree)是一种基本的分类和回归算法。该算法模型呈树形结构,主要由结点和有向边组成。结点又分为两种类型:内部结点和叶子结点。内部结点表示在一个属性或特征上的测试,每一个结点分枝代表一个测试输出,…

决策树算法应用及结果解读

作者:林骥 来源:林骥 引言 本文是我写的人工智能系列的第 8 篇文章,文末有前面 7 篇文章的链接,推荐你阅读、分享和交流。 1. 决策树算法简介 决策树是一种应用非常广泛的算法,比如语音识别、人脸识别、医疗诊断、模式…

机器学习算法(3)之决策树算法

前言:首先,在了解树模型之前,自然想到树模型和线性模型有什么区别呢?其中最重要的是,树形模型是一个一个特征进行处理,之前线性模型是所有特征给予权重相加得到一个新的值。决策树与逻辑回归的分类区别也在…

机器学习基础 决策树算法

文章目录 一、决策树算法简介二、决策树分类原理1. 熵1.1 概念1.2 案例 2. 决策树的划分依据一----信息增益2.1 概念2.2 案例 3. 决策树的划分依据二----信息增益率3.1 概念3.2 案例3.2.1 案例一3.2.2 案例二 3.3 为什么使用C4.5要好 4. 决策树的划分依据三 ----基尼值和基尼指…

【机器学习常见算法】决策树算法(含示例代码)

决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规 则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据,在解决各 种问题时…

【决策树】深入浅出讲解决策树算法(原理、构建)

本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅!​个人主页:有梦想的程序星空​个人介绍:小编是人工智能领域硕士,全栈工程…

协方差矩阵推导

协方差定义:,其中分别为向量的均值。 设已知矩阵 则 样本自由度m-1,设,,则

协方差矩阵到底有什么用?

我们知道,线性代数,可以完成空间上的线性变换——旋转,缩放。对于协方差,我们隐约可以想到,它能解释一个随机变量,它在各个维度的变化程度。但是,这种认识其实还是处于比较浅层次的。数学嘛&…

22协方差矩阵 matlab,协方差协方差矩阵【matlab实例】

[今天看论文的时候又看到了协方差矩阵这个破东西,以前看模式分类的时候就特困扰,没想到现在还是搞不清楚,索性开始查协方差矩阵的资料,恶补之后决定马上记录下来,嘿嘿~ 协方差矩阵 协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计…

透彻理解协方差矩阵

2018-12-30 11:27:05 协方差及协方差矩阵有着特别广泛的应用,在多元高斯分布、高斯过程、卡尔曼滤波等算法中多有用到,本文从协方差、协方差矩阵讲起,并重点讲解协方差矩阵在高斯分布中的用法及意义,也是讲解高斯过程、贝叶斯优化…

使用matlab编写协方差矩阵计算矩阵

Dr.Can在他的教学视频(【卡尔曼滤波器】2_数学基础_数据融合_协方差矩阵_状态空间方程_观测器问题)中使用了足球运动员的数据介绍了协方差矩阵的概念和计算方法,原始数据如下图,那么协方差矩阵到底是什么?他有什么用&a…