【机器学习】决策树算法

news/2024/9/29 1:23:05/

目录

算法引入 

基尼系数:

决策树算法概述

决策树的关键概念

决策树的构建

代码实现

1. 定义决策树节点

2. 计算信息增益

3. 选择最佳分割特征

4. 构建决策树

5. 决策树预测

 决策树的评估指标:

决策树的优缺点

优点:

缺点:

决策树的优化


人工智能领域在当今可谓炙手可热,在人工智能机器学习领域,决策树是一种简单直观却又功能强大的分类与回归方法。它的思想是通过构建一棵树状模型来进行决策或数据分类,其结构主要是以二叉树的形式为主。决策树是一种常用的机器学习算法,用于分类和回归任务。它通过学习简单的决策规则推断出目标值。

算法引入 

小明大学毕业了,去了一家银行当行长,上班第一天就有了10人申请了贷款,刚刚入行的小明仔细地整理了客户信息。包括是否有工作,是否有房子,是否信誉良好,经过了深思熟虑,小明对这10份申请给出了批复。小明想能不能让AI根据自己所做出的规律进行自动批复,这样小明就大大减少了工作量,又可以上班摸鱼了。申请人的信息如下:

申请人是否工作有无房子信誉结果
1一般拒绝
2良好拒绝
3一般同意
4很好同意
5很好同意
6一般拒绝
7一般同意
8很好同意
9很好拒绝
10良好同意

根据上面信息我们能不能推出某一个规律,使规律都满足上面的结果,如果我们按照是否有工作分类,有工作的批准,没工作的不批准,显然不行,在第5个申请人没有工作也批准了。那么我们按照有无房子分类?在第7、10个申请人没有房子也通过了申请,那按照信誉?第9个申请人信誉很好也被拒绝了。那么我们如何进行批准,这就是要我们的决策树出马了。

基尼系数:

那么在建树的时候,谁当那个头结点呢,这就要引出了我们的基尼系数的概念。

根据上面的公式我们可以计算出Gini=1-(5/10)^2-(5/10)^2=0.5。

Gini(工作,是)=1-(4/4)^2-0=0,Gini(工作,否)=1-(2/6)^2-(4/6)^2=0.44。

根据加权方式求和:Gini(工作)=4/10*(Gini(工作,是))+6/10*(Gini(工作,否))=0.27

Gini(房子,是)=1-(4/5)^2-(1/5)^2=0.32,Gini(房子,否)=1-(2/5)^2-(3/5)^2=0.48。

根据加权方式求和:Gini(房子)=5/10*(Gini(房子,是))+5/10*(Gini(房子,否))=0.4

Gini(信誉,一般)=1-(2/4)^2-(2/4)^2=0.5,Gini(信誉,良好)=1-(1/2)^2-(1/2)^2=0.5,Gini(信誉,很好)=1-(3/4)^2-(1/4)^2=0.375。

根据加权方式求和:Gini(信誉)=4/10*(Gini(信誉,一般))+2/10*(Gini(信誉,良好))+4/10*(Gini(信誉,很好))=0.45

我们比较这三个数Gini(工作)=0.27、Gini(房子)=0.4、Gini(信誉)=0.45。我们发现这个三个数字中Gini(工作)=0.27最小,所以我们按照它来建立决策树

此时头结点建立完成,然后我们在没有工作的里面,有2个客户是被批准的,4个客户被拒绝了,那么我们在此基础上继续进行分类,继续求解Gini(房子),Gini(信誉)。Gini(房子,是)=1-(2/2)^2- 0=0,Gini(房子,否)=1- 0 -(4/4)^2=0。根据加权方式求和:Gini(房子)=2/6*(Gini(房子,是))+4/6*(Gini(房子,否))=0。此时Gini(信誉)就不用算了,Gini(房子)已经达到最小0了,下一个结点就放是否有房子,那么此时最终的决策树就出来了。

先根据是否有工作进行判断,如果有,那么直接进行批准,没有的话,再进行判断是否有房子,有房子的话直接批准,没有房子的话直接拒绝,当然,我们这个例子没有涉及到信誉一项,如果在没有房子的人里面还有被批准的,那么需要再加一个内部节点信誉,再根据信誉的三个分类:一般、良好、很好,进行批复。这些判断是建立在前一项的基础之上的,只有进行了前一项的判断才能进行下一项的判断,进而给出批复。


决策树算法概述

决策树通过树状图的形式模拟决策过程,在每一个结点都会有分支(除了叶子结点),每个内部节点都代表一个属性上的判断,如果为是则走一个分支,如果为否则走另外一个分支。每个分支代表判断的结果,每个叶节点代表一种决策结果。

决策树的关键概念

- 节点(Node)决策树中的一个决策点。
- 根节点(Root)决策树的起始点。
- 分支(Branch):从一个节点到另一个节点的连接。
- 叶节点(Leaf):没有子节点的节点,是一棵树最下面的结点。代表最终决策。
- 路径(Path):从根节点到叶节点的一系列决策。

决策树的构建

构建决策树通常涉及以下步骤:

1. 选择最佳属性:使用某种度量(如信息增益、基尼不纯度)选择最佳属性进行分割。
2. 创建节点:为所选属性的每个可能值创建一个分支。
3. 分割数据:根据属性值将数据分割成不同的子集。
4. 递归构建:对每个子集递归地重复上述步骤,直到满足停止条件(如所有数据属于同一类别,或已达到树的最大深度)。

代码实现

1. 定义决策树节点

class TreeNode:def __init__(self, feature_index=None, threshold=None, left=None, right=None, *, value=None):self.feature_index = feature_index  # 特征索引self.threshold = threshold          # 阈值self.left = left                     # 左子树self.right = right                   # 右子树self.value = value                   # 节点值(叶节点时的分类结果)

2. 计算信息增益

def information_gain(X, y, split_feature_index, threshold):# 计算信息熵def calculate_entropy(y):# 实现信息熵的计算pass# 划分数据集left_indices = [i for i in range(len(X)) if X[i][split_feature_index] < threshold]right_indices = [i for i in range(len(X)) if X[i][split_feature_index] >= threshold]# 计算信息增益total_entropy = calculate_entropy(y)left_entropy = calculate_entropy([y[i] for i in left_indices])right_entropy = calculate_entropy([y[i] for i in right_indices])weight_left = len(left_indices) / len(X)weight_right = len(right_indices) / len(X)information_gain = total_entropy - (weight_left * left_entropy + weight_right * right_entropy)return information_gain

3. 选择最佳分割特征

def best_split(X, y):best_feature = Nonebest_threshold = Nonemax_information_gain = -1for feature_index in range(X.shape[1]):for i in range(X.shape[0]):threshold = X[i][feature_index]gain = information_gain(X, y, feature_index, threshold)if gain > max_information_gain:best_feature = feature_indexbest_threshold = thresholdmax_information_gain = gainreturn best_feature, best_threshold

4. 构建决策树

def build_tree(X, y, max_depth=None, current_depth=0):if len(np.unique(y)) == 1 or current_depth == max_depth:return TreeNode(value=np.argmax(np.unique(y)))best_feature, best_threshold = best_split(X, y)if best_feature is None:return TreeNode(value=np.argmax(np.unique(y)))left_indices = [i for i in range(len(X)) if X[i][best_feature] < best_threshold]right_indices = [i for i in range(len(X)) if X[i][best_feature] >= best_threshold]left_X = [X[i] for i in left_indices]left_y = [y[i] for i in left_indices]right_X = [X[i] for i in right_indices]right_y = [y[i] for i in right_indices]left_child = build_tree(left_X, left_y, max_depth, current_depth + 1)right_child = build_tree(right_X, right_y, max_depth, current_depth + 1)return TreeNode(feature_index=best_feature, threshold=best_threshold, left=left_child, right=right_child)

5. 决策树预测

def predict(tree, x):if tree.value is not None:return tree.valueif x[tree.feature_index] < tree.threshold:return predict(tree.left, x)else:return predict(tree.right, x)

 决策树的评估指标:

  • 准确率:正确分类的样本数占总样本数的比例。
  • 精确度:预测为正的样本中实际为正的比例。
  • 召回率:实际为正的样本中预测为正的比例。
  • F1分数:精确度和召回率的调和平均。

决策树的优缺点

优点:

- 易于理解和解释。
- 可以处理数值和类别数据。
- 不需要数据标准化。
- 可以可视化。

缺点:

- 容易过拟合。
- 对于某些数据集,构建的树可能非常大。
- 对于缺失数据敏感。

决策树的优化

- 剪枝:通过减少树的大小来减少过拟合。
- 集成方法:如随机森林和梯度提升树,可以提高模型的泛化能力。


下一篇文章更新决策树算法ID3、C4.5、CART的介绍以及实现。执笔至此,感触彼多,全文将至,落笔为终,感谢各位的支持。


http://www.ppmy.cn/news/1531266.html

相关文章

JavaScript开发网页中不常用但很重要的用法

一、Proxy对象 基本概念 Proxy是JavaScript中的一个元编程特性&#xff0c;它允许创建一个代理对象&#xff0c;该代理对象可以拦截并自定义对目标对象的基本操作&#xff08;如属性查找、赋值、函数调用等&#xff09;。例如&#xff0c;创建一个简单的Proxy对象来拦截对目标对…

Python中的数据处理与分析:从基础到高级

在数据科学和数据分析领域&#xff0c;Python凭借其丰富的库和强大的生态系统&#xff0c;成为了最受欢迎的语言之一。本文将从基础到高级&#xff0c;详细介绍如何使用Python进行数据处理和分析&#xff0c;涵盖数据清洗、数据转换、数据可视化等多个方面。 1. 数据导入与导出…

跨游戏引擎的H5渲染解决方案(腾讯)

本文是腾讯的一篇H5 跨引擎解决方案的精炼。 介绍 本文通过实现基于精简版的HTML5&#xff08;HyperText Mark Language 5&#xff09;来屏蔽不同引擎&#xff0c;平台底层的差异。 好处&#xff1a; 采用H5的开发方式&#xff0c;可以将开发和运营分离&#xff0c;运营部门自…

心理教育辅导系统的设计与Spring Boot实现

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

声波定位技术在地下管道中如何应用

随着城市化进程的加速&#xff0c;地下管道作为城市基础设施的重要组成部分&#xff0c;其安全、高效的维护与管理显得尤为重要。声波定位技术作为一种非破坏性探测手段&#xff0c;在地下管道中的应用日益广泛&#xff0c;成为提升管道维护和管理水平的重要工具。接下来给大家…

python dict函数介绍

在 Python 中,dict() 是用来创建字典对象的内置函数。字典(dictionary)是一个无序的可变容器,存储键-值对。dict() 函数有多种使用方式,能够接受不同的参数形式来创建字典。 dict() 函数的语法: dict(**kwargs) dict(mapping, **kwargs) dict(iterable, **kwargs)参数说…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 7 推送卡片刷新消息

场景介绍 如今衣食住行娱乐影音应用占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的应用来说&#xff0c;总需要用户点开应用体验较繁琐。针对此种场景&#xff0c;HarmonyOS提供了Form Kit&#xff08;卡片开发服…

关于宝塔PHP getenv无法获取环境变量问题解决办法

今天有用ThinkPHP8接入阿里云OSS时&#xff0c;需要用的用到getenv()来读取环境变量&#xff0c;因为新版OSS SDK是用环境变更来设置AK的。 现象 正常执行PHP文件&#xff0c;可以取到环境变量&#xff1b;但是通过nginxphp-fpm调用脚本取到不到环境变量 原因 php-fpm为了防止…