【机器学习】从理论到实践:决策树算法在机器学习中的应用与实现

  📝个人主页:哈__

期待您的关注 

目录

📕引言

⛓决策树的基本原理

1. 决策树的结构

2. 信息增益

熵的计算公式

信息增益的计算公式

3. 基尼指数

4. 决策树的构建

🤖决策树的代码实现

1. 数据准备

2. 决策树模型训练

3. 决策树的可视化

4. 决策树的解释

🍎决策树在机器学习中的应用

1. 分类任务

2.决策树在回归任务中的应用

3. 特征选择

4. 异常检测

🎇决策树的优缺点

优点

缺点

💡决策树的改进方法

剪枝

集成方法

随机森林

梯度提升树

总结


📕引言

决策树是一种广泛应用于分类和回归任务的监督学习算法。它通过将数据集划分成不同的子集来做出决策,直观且易于理解。在本篇文章中,我们将深入剖析决策树的原理,并通过具体的代码实例展示其在机器学习中的应用。

⛓决策树的基本原理

1. 决策树的结构

决策树由节点和边组成,其中每个节点表示数据集的某个特征,每条边表示特征的某个值所对应的分支。决策树的最顶端称为根节点,叶节点代表决策结果。以下是一个简单的决策树示例图:


2. 信息增益

决策树的构建过程依赖于一个重要概念:信息增益。信息增益用于衡量某个特征在划分数据集时所带来的纯度提升。常用的纯度度量包括熵、基尼指数等。

熵的计算公式

熵(Entropy)用于衡量数据集的不确定性,其计算公式为:

H(S) = -\sum_{i=1}^{c} p_i \log_2 p_i

 其中,S是数据集,c是类别数,p_i 是第 i 类的概率。

信息增益的计算公式

信息增益(Information Gain)用于衡量选择某个特征进行数据划分时,数据集纯度的提升,其计算公式为:

IG(S, A) = H(S) - \sum_{v \in \text{values}(A)} \frac{|S_v|}{|S|}I

其中,A是特征,S_v 是根据特征 A的值 v划分的数据子集。


3. 基尼指数

基尼指数(Gini Index)是另一种常用的纯度度量方法,用于衡量数据集的不纯度,其计算公式为:

Gini(S) = 1 - \sum_{i=1}^{c} p_i^2

其中,p_i是第 i 类的概率。


4. 决策树的构建

决策树的构建过程可以归纳为以下步骤:

  1. 选择最佳特征进行数据集划分:选择使得信息增益最大化或基尼指数最小化的特征。
  2. 根据特征值划分数据集:将数据集根据选定特征的不同取值划分为若干子集。
  3. 递归构建子树:在每个子集上递归构建子树,直到满足停止条件(如所有样本属于同一类别或特征用尽)。

以下是决策树构建过程的伪代码:

函数 BuildTree(data, features):如果 data 中所有实例属于同一类别:返回该类别如果 features 为空或 data 为空:返回 data 中出现次数最多的类别选择使信息增益最大的特征 A创建节点 node,并将其标记为特征 A对于特征 A 的每个可能取值 v:子数据集 sub_data = 由 data 中特征 A 的值为 v 的实例构成如果 sub_data 为空:在 node 上创建叶节点,标记为 data 中出现次数最多的类别否则:在 node 上创建子节点,并将子节点连接到 BuildTree(sub_data, features \ {A})返回 node

🤖决策树的代码实现

接下来,我们通过具体代码展示如何在Python中实现决策树,并应用于分类任务。

1. 数据准备

我们使用一个简单的数据集来演示决策树的构建过程。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris# 加载Iris数据集
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop(columns=['target']), df['target'], test_size=0.3, random_state=42)

2. 决策树模型训练

我们使用Scikit-Learn中的DecisionTreeClassifier来训练决策树模型。

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score# 初始化决策树分类器
clf = DecisionTreeClassifier(criterion='entropy', max_depth=3, random_state=42)# 训练模型
clf.fit(X_train, y_train)# 预测
y_pred = clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'决策树模型的准确率: {accuracy:.2f}')

3. 决策树的可视化

我们可以使用Scikit-Learn的export_graphviz函数和graphviz库来可视化决策树。

from sklearn.tree import export_graphviz
import graphviz# 导出决策树
dot_data = export_graphviz(clf, out_file=None, feature_names=data.feature_names,  class_names=data.target_names,  filled=True, rounded=True,  special_characters=True)  # 使用graphviz渲染决策树
graph = graphviz.Source(dot_data)  
graph.render("decision_tree")  # 生成决策树的PDF文件

4. 决策树的解释

在实际应用中,决策树的解释能力非常重要。我们可以通过以下方式解读决策树的结果:

  • 特征重要性:决策树可以计算每个特征的重要性,反映其在树中进行决策时的重要程度。

    import matplotlib.pyplot as plt
    import numpy as npfeature_importances = clf.feature_importances_
    features = data.feature_namesindices = np.argsort(feature_importances)plt.figure(figsize=(10, 6))
    plt.title("Feature Importances")
    plt.barh(range(len(indices)), feature_importances[indices], align="center")
    plt.yticks(range(len(indices)), [features[i] for i in indices])
    plt.xlabel("Relative Importance")
    plt.show()
    
  • 决策路径:我们可以追踪决策树在做出某个预测时的决策路径。

    sample_id = 0  # 样本索引
    node_indicator = clf.decision_path(X_test)
    leaf_id = clf.apply(X_test)sample_path = node_indicator.indices[node_indicator.indptr[sample_id]:node_indicator.indptr[sample_id + 1]]
    print(f'样本 {sample_id} 的决策路径:')
    for node_id in sample_path:if leaf_id[sample_id] == node_id:print(f'--> 叶节点 {node_id}')else:print(f'--> 节点 {node_id}, 判断特征:{features[clf.tree_.feature[node_id]]}, 阈值:{clf.tree_.threshold[node_id]:.2f}')
    

🍎决策树在机器学习中的应用

决策树在机器学习中有广泛的应用,主要体现在以下几个方面:

1. 分类任务

决策树在分类任务中应用广泛,如垃圾邮件分类、疾病诊断等。以下是使用决策树进行分类任务的示例代码:

from sklearn.datasets import load_wine
from sklearn.metrics import classification_report# 加载葡萄酒数据集
wine_data = load_wine()
X_wine = wine_data.data
y_wine = wine_data.target# 划分训练集和测试集
X_train_wine, X_test_wine, y_train_wine, y_test_wine = train_test_split(X_wine, y_wine, test_size=0.3, random_state=42)# 训练决策树分类器
wine_clf = DecisionTreeClassifier(criterion='gini', max_depth=5, random_state=42)
wine_clf.fit(X_train_wine, y_train_wine)# 预测
y_pred_wine = wine_clf.predict(X_test_wine)# 评估模型
print(classification_report(y_test_wine, y_pred_wine, target_names=wine_data.target_names))

2.决策树在回归任务中的应用

决策树同样适用于回归任务,例如房价预测、股票价格预测等。决策树回归模型通过将数据集划分为若干区域,并对每个区域内的样本进行平均来进行预测。以下是一个使用决策树进行回归任务的示例代码:

from sklearn.datasets import load_boston
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error# 加载波士顿房价数据集
boston = load_boston()
X_boston = boston.data
y_boston = boston.target# 划分训练集和测试集
X_train_boston, X_test_boston, y_train_boston, y_test_boston = train_test_split(X_boston, y_boston, test_size=0.3, random_state=42)# 初始化决策树回归器
regressor = DecisionTreeRegressor(criterion='mse', max_depth=5, random_state=42)# 训练模型
regressor.fit(X_train_boston, y_train_boston)# 预测
y_pred_boston = regressor.predict(X_test_boston)# 计算均方误差
mse = mean_squared_error(y_test_boston, y_pred_boston)
print(f'决策树回归模型的均方误差: {mse:.2f}')

3. 特征选择

决策树可以用于特征选择,通过计算特征的重要性来筛选出对预测结果影响最大的特征。这在高维数据集的处理上尤其有用。

# 计算特征重要性
feature_importances = regressor.feature_importances_
features = boston.feature_names# 打印特征重要性
for name, importance in zip(features, feature_importances):print(f'Feature: {name}, Importance: {importance:.2f}')

4. 异常检测

决策树还可以用于异常检测,通过构建深度较大的树来识别数据集中异常点。较深的叶节点通常对应于异常样本。

from sklearn.ensemble import IsolationForest# 初始化隔离森林模型
iso_forest = IsolationForest(n_estimators=100, contamination=0.1, random_state=42)# 训练模型
iso_forest.fit(X_train_boston)# 预测异常
anomalies = iso_forest.predict(X_test_boston)
print(f'异常样本数量: {sum(anomalies == -1)}')

🎇决策树的优缺点

优点

  1. 直观易懂:决策树的结构类似于人类的决策过程,易于理解和解释。
  2. 无需特征缩放:决策树对数据的缩放不敏感,不需要进行特征归一化或标准化。
  3. 处理缺失值:决策树能够处理数据集中的缺失值。
  4. 非线性关系:决策树能够捕捉数据中的非线性关系。

缺点

  1. 容易过拟合:决策树在训练数据上表现良好,但在测试数据上可能表现不佳,需要通过剪枝等方法进行优化。
  2. 对噪声敏感:决策树对数据中的噪声较为敏感,容易导致模型不稳定。
  3. 偏向于多值特征:决策树在选择特征时偏向于取值较多的特征,可能导致偏差。

💡决策树的改进方法

剪枝

剪枝是通过删除决策树中的一些节点来减少模型的复杂度,防止过拟合。剪枝方法主要包括预剪枝和后剪枝。

  • 预剪枝:在构建决策树的过程中,通过限制树的最大深度、最小样本数等参数来防止树的过度生长。
  • 后剪枝:在决策树构建完成后,通过评估子树的重要性来剪除不重要的子树。

集成方法

集成方法通过结合多个决策树的预测结果来提高模型的稳定性和准确性,常见的集成方法包括随机森林和梯度提升树。

随机森林

随机森林通过构建多棵决策树,并对每棵树的预测结果进行投票来获得最终结果,有效减少了单棵决策树的过拟合问题。

from sklearn.ensemble import RandomForestRegressor# 初始化随机森林回归器
rf_regressor = RandomForestRegressor(n_estimators=100, max_depth=5, random_state=42)# 训练模型
rf_regressor.fit(X_train_boston, y_train_boston)# 预测
rf_y_pred = rf_regressor.predict(X_test_boston)# 计算均方误差
rf_mse = mean_squared_error(y_test_boston, rf_y_pred)
print(f'随机森林回归模型的均方误差: {rf_mse:.2f}')

梯度提升树

梯度提升树通过逐步构建多个决策树,每棵树都在之前所有树的基础上进行改进,从而提高模型的准确性。

from sklearn.ensemble import GradientBoostingRegressor# 初始化梯度提升回归器
gb_regressor = GradientBoostingRegressor(n_estimators=100, max_depth=3, random_state=42)# 训练模型
gb_regressor.fit(X_train_boston, y_train_boston)# 预测
gb_y_pred = gb_regressor.predict(X_test_boston)# 计算均方误差
gb_mse = mean_squared_error(y_test_boston, gb_y_pred)
print(f'梯度提升回归模型的均方误差: {gb_mse:.2f}')

总结

本文详细介绍了决策树的基本原理、构建过程及其在机器学习中的应用。通过详细的代码示例,我们展示了如何使用决策树进行分类和回归任务,并探讨了决策树的优缺点及其改进方法。希望通过本文的介绍,读者能够更深入地理解决策树算法,并能在实际应用中灵活运用这一强大的工具。

无论是在特征选择、分类任务、回归任务还是异常检测中,决策树都展现出了其独特的优势和广泛的应用前景。通过不断优化和改进,决策树将在更多的机器学习任务中发挥重要作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/354869.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XMind 2024软件最新版下载及详细安装教程

​人所共知的是XMind 在公司和教育领域都有很广泛的应用,在公司中它能够用来进行会议管理、项目管理、信息管理、计划和XMind 被认为是一种新一代演示软件的模式。也就是说XMind不仅能够绘制思维导图,还能够绘制鱼骨图、二维图、树形图、逻辑图、组织结构…

记一次某单位的内网渗透测试

0x01 web打点 访问漏洞url:http://www.xx.xx.com进入某医疗系统 使用越权加文件上传拿到shell 0x02 内网渗透 192.168.xx.x 管理员 通过哥斯拉上线msf 上线后进行信息收集: 网卡信息、补丁信息、杀毒进程、用户在线情况、是否存在域、翻文件查找数据库密码、浏览器保存密码…

【ai】tx2-nx:搭配torch的torchvision

微雪的教程pytorch_version 1.10.0 官方教程安装torch官方教程 依赖项 nvidia@tx2-nx:~/twork/03_yolov5$ $ sudo apt-get install libjpeg-dev zlib1g-dev lib

EtherCAT笔记(三) —— 主站与从站的硬件组成

1. EtherCAT 主站的硬件组成 EtherCAT主站使用标准以太网控制器,也即EtherCAT主站可以使用以太网控制器的任何设备。当我们有一台带网口的笔记本、工控机,甚至是树莓派也可以作为EtherCAT主站。 EtherCAT协议是对Ethernet协议在实时控制等方面的优化&am…

el-table表格变更前后根据数据值改变背景颜色

需求: 1.左侧变更前表格数据不可以编辑,并且背景色加灰 2.右侧变更后表格数据可被编辑,编辑后变更前与变更后行数据不一致,添加背景色区分 3.点击删除的时候,给变更后表格当前行,添加背景色和删除的中横…

功能测试 之 单模块测试----轮播图、登录、注册

单功能怎么测? 需求分析 拆解测试点 编写用例 1.轮播图 (1)需求分析 位置:后台--页面--广告管理---广告列表(搜索index页面增加广告位2) 操作完成后需要点击admin---更新缓存,前台页面刷新生效 (2)拆解…

CI /CD学习

CI/CD概述 CI/CD 是持续集成和持续交付/部署的缩写,旨在简化并加快软件开发生命周期。 持续集成(CI)是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付和/或持续部署(CD)是一个由两部分组成的过程…

【ARMv8/v9 GIC 系列 2.1 -- GIC SPI 中断的 pending 和 clear pending 配置】

文章目录 GIC Pending 和 Clear PendingGICD_ISPENDR<n>GICD_ICPENDR<n>参数<n>编号解释使用举例设置中断ID 100为挂起状态清除中断ID 100的挂起状态 代码实现小结 GIC Pending 和 Clear Pending 在ARMv8体系结构中&#xff0c;GICD_ISPENDR<n> 和 GI…

GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了

这份笔记的目标是为了给出一份比较精炼&#xff0c;但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单&#xff0c;但是措辞比较罗嗦&#xff0c;而且一个语法点往往散落在多个章节&#xff0c;不方便读者总结。 我在做笔记时&#xff0c;将一个知识点…

家有老人小孩,室内灰尘危害大!资深家政教你选对除尘空气净化器

哈喽&#xff0c;各位亲爱的朋友们&#xff01;今天我们来聊聊每次大扫除时最让人头疼的问题——灰尘。你有没有发现&#xff0c;两天不打扫&#xff0c;桌子上就能积上一层灰&#xff1b;阳光一照&#xff0c;地板上的灰尘都在跳舞&#xff1b;整理被子的时候&#xff0c;空气…

INFINI Labs 助力开源与教育:免费许可证计划全面升级

在数字化浪潮席卷全球的今天&#xff0c;INFINI Labs 深刻认识到开源项目和教育机构在技术创新与人才培养中的核心作用。因此&#xff0c;我们郑重推出全新升级的免费许可证计划&#xff0c;旨在全球范围内为开源社区和教育界提供有力支持&#xff0c;共同推动软件生态的繁荣与…

如何建立私域流量?私域流量怎么运营,一文读懂

当全网都在讨论私域流量&#xff0c;你是不是也有很多问号呢&#xff1f; 互联网高速发达&#xff0c;消费形式日新月异&#xff0c;跟不上时代就会被时代淘汰&#xff0c;接下来&#xff0c;我们就从3个层面深度讨论下私域流量究竟是什么&#xff1f;为什么要玩转私域流量&am…

智慧学习实践系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;企业管理&#xff0c;任务管理&#xff0c;公告管理&#xff0c;菜单管理&#xff0c;用户管理&#xff0c;基础数据管理 企业账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;任务…

AMD vs NVIDIA:渲染领域的显卡之争

在数字创意与设计的世界里&#xff0c;显卡作为图形处理的核心&#xff0c;其性能与兼容性直接关系到创作者的工作效率与作品质量。AMD与NVIDIA&#xff0c;作为两大显卡巨头&#xff0c;各自在渲染领域拥有独特的技术与优势。那么&#xff0c;针对渲染而言&#xff0c;哪种显卡…

Mware Fusion Pro 13 mac版:一键掌控虚拟世界

VMware Fusion Pro 13是一款功能卓越的虚拟化软件&#xff0c;专为Mac操作系统量身打造。这款软件为用户提供了一个一站式的虚拟化解决方案&#xff0c;能够满足各种多样化的需求。 VMware Fusion Pro 13 Mac获取 VMware Fusion Pro 13的强大之处在于其采用了最 先进的虚拟化…

家用洗地机哪个品牌耐用?推荐这四款清洁力强的机型

近两年智能家庭清洁产品的快速崛起&#xff0c;典型代表就是家用洗地机。它集合吸尘、扫地、洗地、消杀等功能为一体&#xff0c;给人们生活带来了很多的便利&#xff0c;但随着洗地机的普及&#xff0c;市场上的机型也越来越多&#xff0c;让很多新手购机的朋友们无法快速下决…

安装TensorFlow2.12.0

文章目录 一、修改国内镜像源1、添加通道2、修改配置 二、安装TensorFlow2.12.0​1、安装TensorFlow2.12.02、验证是否安装成功 三、简单示例程序1、编写程序&#xff0c;实现功能2、运行程序&#xff0c;查看结果 四、实战小结 Python版本TensorFlow版本3.11.72.12.0 一、修改…

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网&#xff1a;www.icairc.net 录用通知时间&…

本地大模型服务 Ollama:从安装到使用

文章目录 前言一、下载安装1.1 官网安装1.2 压缩包安装1.3 docker 安装二、命令行使用2.1 常用命令2.2 模型列表2.3 使用三、Open-WebUI3.1 安装3.2 修改语言3.3 使用参考前言 Ollama 是专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计的开源框架,它有如下几个特点…

反射复习(java)

文章目录 反射机制的作用反射机制的原理加载机制详细解释 获取 Class 对象反射获取构造方法&#xff1a;获取 Class 对象里面 Constructor 对象反射获取成员变量&#xff1a;获取Class 对象里面的 Field 对象反射获取成员方法&#xff1a;获取 Class 对象里的 Method 对象其他常…