机器学习(4):决策树

server/2025/1/24 4:28:53/

1 介绍

        决策树(Decision Tree),它是一种以树形数据结构来展示决策规则和分类结果的模型,作为一种归纳学习算法,其重点是将看似无序、杂乱的已知数据,通过某种技术手段将它们转化成可以预测未知数据的树状模型,每一条从根结点(对最终分类结果贡献最大的属性)到叶子结点(最终分类结果)的路径都代表一条决策的规则。决策树就是形如下图的结构:

1.1 决策树的基本流程

        下图就是在生成决策树的过程中经历的步骤。

  1. 首先从开始位置,将所有数据划分到一个节点,即根节点。
  2. 然后经历橙色的两个步骤,橙色的表示判断条件:若数据为空集,跳出循环。如果该节点是根节点,返回null;如果该节点是中间节点,将该节点标记为训练数据中类别最多的类若样本都属于同一类,跳出循环,节点标记为该类别;
  3. 如果经过橙色标记的判断条件都没有跳出循环,则考虑对该节点进行划分。既然是算法,则不能随意的进行划分,要讲究效率和精度,选择当前条件下的最优属性划分(什么是最优属性,这是决策树的重点,后面会详细解释)
  4. 经历上步骤划分后,生成新的节点,然后循环判断条件,不断生成新的分支节点,直到所有节点都跳出循环。
  5. 结束。这样便会生成一棵决策树

1.2 信息增益

        在介绍信息增益之前,先介绍一下信息熵的含义。热力学里有一个熵的概念,熵就是来形容系统混乱程度的,系统越混乱,熵就越大。信息熵也具有同样的意义,不过它描述的是随机变量的不确定性(也就是混乱程度)。

        为了方便解释,我们用一个简单的便于观察的例子。下图是一个只有2个取值的随机变量,假如取值只有0和1,则P(X=0)=p,P(X=1)=1-p,其中p是x=0的概率。信息熵为H§=-plogp-(1-p)log(1-p),我们画一个p在0-1的变过过程,H§随着变化的曲线:

        由上图可以看出,当p=0.5的时候,H§达到最大值。因为p=0或p=1的时候,X只有一种可能性,也就是X是确定的,因此熵最小,而随着p接近0.5的过程中,变量X的不确定性就越来越大,我们计算出来的熵也是越来越大,与实际相符。

        信息增益用于分类问题,衡量选择某一特征后数据集的纯度提升。计算公式为:

        信息增益就是划分前的信息熵减去划分后的信息熵。其中A代表的此次划分中所使用的属性。
如果决策树使用信息增益准则来选择最优划分属性的话,在划分前会针对每个属性都计算信息增益,选择能使得信息增益最大的属性作为最优划分属性。ID3算法就是使用的信息增益划分方法,决策树是一个基础理论,实际落地的算法有多种,ID3是其中一种。

1.3 基尼指数

        基尼指数也是一个寻找最优划分属性的准则。公式如下:

        基尼指数就是在样本集中随机抽出两个样本不同类别的概率。当样本集越不纯的时候,这个概率也就越大,即基尼指数也越大。这个规律与信息熵的相同,还是以刚才的只有两个取值的随机变量为例,我们这次纵坐标除了有信息熵外,再加上基尼指数。

        可以看出,基尼指数与信息熵虽然值不同,但是趋势一致。同样的,使用基尼指数来选择最优划分属性也是对比不同属性划分后基尼指数的差值,选择使样本集基尼指数减小最多的属性。

1.4 决策树的优缺点

        优点

  • 易于理解和解释决策树的结构直观,易于理解和解释。
  • 处理多种数据类型:可以处理数值型和类别型数据。
  • 不需要数据标准化决策树不需要对数据进行标准化或归一化处理。

        缺点

  • 容易过拟合决策树容易过拟合,特别是在数据集较小或树深度较大时。
  • 对噪声敏感决策树对噪声数据较为敏感,可能导致模型性能下降。
  • 不稳定:数据的小变化可能导致生成完全不同的树。

2 使用Python实现决策树

2.1 安装必要的库

        首先,确保你已经安装了scikit-learn库。如果没有安装,可以使用以下命令进行安装:

pip install scikit-learn

2.2 导入库并加载数据集

        我们将使用scikit-learn自带的鸢尾花(Iris)数据集来演示决策树的使用。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.tree import export_graphviz
import graphviz# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

2.3 训练决策树模型

        接下来,我们使用DecisionTreeClassifier来训练决策树模型。

# 创建决策树分类器
clf = DecisionTreeClassifier()# 训练模型
clf.fit(X_train, y_train)

2.4 预测与评估

        使用训练好的模型对测试集进行预测,并评估模型的准确率。

# 对测试集进行预测
y_pred = clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率: {accuracy:.2f}")

2.5 可视化决策树

        为了更直观地理解决策树的结构,我们可以使用graphviz库来可视化决策树。graphviz 下载地址:Download | Graphviz。下载windows程序。

        安装时记得选择第二项,为所有用户添加系统环境。 

        在命令窗口输入dot -V查看是否安装成功,如果没有出现版本信息则重启一下电脑再试试。

        安装 graphviz 库:

pip install graphviz

         编写可视化代码:

# 导出决策树为dot文件
dot_data = export_graphviz(clf, out_file=None,feature_names=iris.feature_names,  class_names=iris.target_names,  filled=True, rounded=True,  special_characters=True)# 使用graphviz渲染决策树
graph = graphviz.Source(dot_data)
graph.render("iris_decision_tree")  # 保存为PDF文件
graph.view()  # 在浏览器中查看


http://www.ppmy.cn/server/160937.html

相关文章

前端面试题-问答篇-5万字!

1. 请描述CSS中的层叠(Cascade)和继承(Inheritance)规则,以及它们在实际开发中的应用。 在CSS中,层叠(Cascade)和继承(Inheritance)是两个关键的规则&#x…

从C语言看数据结构和算法:复杂度决定性能

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 时间复杂度1. 常数时间复杂度…

快手极速版如何查找ip归属地?怎么关掉

在数字化时代,个人隐私的保护成为了广大用户关注的焦点。快手极速版作为一款备受欢迎的短视频应用,其IP归属地的显示与关闭功能自然也成了用户热议的话题。本文将详细介绍如何在快手极速版中查找IP归属地以及如何关闭IP属地显示,帮助用户更好…

Swift 中 Codable 和 Hashable 的理解

最近初学Swift,碰到下面的代码脑袋里冒出疑问:Codable 和 Hashable是啥?怎么理解? struct Landmark: Hashable, Codable {var id: Intvar name: Stringvar park: Stringvar state: Stringvar description: String }针对上面的疑问…

ChatGPT接入苹果全家桶:开启智能新时代

最近,科技界最重磅的消息莫过于ChatGPT正式接入苹果iOS生态系统!这意味着苹果用户将能够直接在iPhone、iPad和Mac上体验到这款强大的AI代码生成器带来的便利,开启一个全新的智能时代。这篇文章将深入探讨ChatGPT与苹果生态的整合,…

【玩转全栈】----Django模板语法、请求与响应

目录 一、引言 二、模板语法 三、传参 1、视图函数到模板文件 2、模板文件到视图函数 四、引入静态文件 五、请求与响应 1、请求 2、响应 六、综合小案例 1、源码展示 2、注意事项以及部分解释 3、展示 一、引言 像之前那个页面,太过简陋,而且一个完整的…

Vue - ref( ) 和 reactive( ) 响应式数据的使用

一、ref( ) 在 Vue 3 中,ref() 是一个用于创建响应式引用的函数。它是 Vue 3 Composition API(组合式API) 的一部分,允许在组件中创建响应式数据。 使用对象:基本数据类型(String 、Number 、Boolean 、Null 等)、对…

ASP.NET Core 6.0 如何处理丢失的 Startup.cs 文件

介绍 .NET 6.0 已经发布,ASP.NET Core 6.0 也已发布。其中有不少变化让很多人感到困惑。例如,“谁动了我的奶酪”,它在哪里Startup.cs?在这篇文章中,我将深入研究这个问题,看看它移动到了哪里以及其他变化。…