Lucas带你手撕机器学习——决策树

news2024/10/25 10:23:35

一、决策树简介

决策树是一种基本的分类与回归方法,它通过树状结构对数据进行分类或预测。每个内部节点代表一个特征(属性),每个分支代表特征的一个可能值,而每个叶子节点代表一个分类或预测值。由于其直观和易于理解的特点,决策树广泛应用于机器学习、数据挖掘和决策分析等领域。

1.1 决策树的结构

决策树由以下几个部分组成:

  • 根节点:树的起始节点,表示整个数据集。
  • 内部节点:每个内部节点表示对某个特征的测试。
  • 分支:分支代表特征的取值,连接节点。
  • 叶子节点:终止节点,代表最终的分类结果或预测值。
1.2 决策树的类型

根据任务的不同,决策树可以分为两种类型:

  • 分类树:用于分类任务,叶子节点表示类别标签。
  • 回归树:用于回归任务,叶子节点表示数值预测。

二、构建决策树

构建决策树的基本步骤如下:

  1. 选择最优特征:根据某种准则(如信息增益、基尼指数等)选择最能区分数据的特征。
  2. 划分数据集:根据选择的特征将数据集划分为多个子集。
  3. 递归构建子树:对每个子集重复步骤1和2,直到满足停止条件(如达到最大深度、样本数小于阈值等)。
  4. 生成决策树:最终生成的树就是完整的决策树。
2.1 特征选择准则

特征选择是构建决策树的关键步骤,常用的准则有:

  • 信息增益:通过计算选择特征前后信息熵的变化量来决定特征的重要性。信息增益越大,特征越重要。

[
IG(D, A) = H(D) - \sum_{v \in Values(A)} \frac{|D_v|}{|D|} H(D_v)
]

其中,(H(D)) 是数据集 (D) 的熵,(Values(A)) 是特征 (A) 的所有取值,(D_v) 是特征 (A) 取值为 (v) 的子集。

  • 基尼指数:用于衡量一个数据集的不纯度,基尼指数越小,表示数据集的纯度越高。

[
Gini(D) = 1 - \sum_{i=1}^{C} p_i^2
]

其中,(C) 是类别数,(p_i) 是数据集中类别 (i) 的比例。

2.2 决策树的停止条件

在构建决策树时,需要设置停止条件,以避免过拟合。常用的停止条件有:

  • 树的深度限制:限制树的最大深度,防止树过于复杂。
  • 样本数限制:当节点的样本数小于某个阈值时停止分裂。
  • 信息增益阈值:如果当前特征的信息增益小于某个阈值,则停止分裂。

三、决策树的优缺点

3.1 优点
  1. 易于理解和解释:决策树的结构清晰,容易可视化和理解。
  2. 无需特征缩放:决策树不受特征尺度影响,不需要进行特征缩放。
  3. 处理缺失值:决策树能够处理缺失值,通过对样本进行划分,可以有效减少缺失值的影响。
  4. 适应非线性关系:决策树能够适应特征之间的非线性关系。
3.2 缺点
  1. 易过拟合:决策树容易在训练集上过拟合,导致在新数据上的性能下降。
  2. 不稳定性:对数据的微小变化敏感,可能导致结构上的较大变化。
  3. 偏向于多值特征:决策树在选择特征时,可能偏向于取值较多的特征。
  4. 局部最优:特征选择过程可能陷入局部最优,导致模型性能不佳。

四、决策树的剪枝技术

为了减少决策树的过拟合问题,可以采用剪枝技术。剪枝分为两种类型:

4.1 预剪枝(Pre-pruning)

在决策树构建的过程中,通过设置一些条件提前停止树的生长。例如,可以根据当前节点的样本数、树的深度或信息增益等,决定是否继续分裂节点。

4.2 后剪枝(Post-pruning)

在决策树构建完成后,通过评估模型在验证集上的表现,剪去一些不必要的节点。常用的方法有:

  • 最小化错误率:通过计算剪枝前后的错误率,选择最小的错误率。
  • 复杂度惩罚:引入一个惩罚项,对树的复杂度进行约束,选择复杂度与性能之间的最佳平衡点。

五、决策树的实践应用

决策树在实际应用中非常广泛,主要应用于以下领域:

  1. 医疗诊断:通过分析患者的症状和体征,辅助医生进行疾病的判断。
  2. 金融风控:在信用评分和贷款审批中,评估客户的风险等级。
  3. 市场营销:通过客户特征分析,制定个性化的营销策略。
  4. 客户分类:根据客户行为特征,进行客户细分和个性化服务。

六、用 Python 实现决策树

下面是使用 Python 中的 scikit-learn 库实现决策树的一个完整示例:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 加载鸢尾花数据集
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.2, random_state=42)

# 创建决策树分类器
clf = DecisionTreeClassifier(max_depth=3, random_state=42)

# 训练模型
clf.fit(X_train, y_train)

# 进行预测
y_pred = clf.predict(X_test)

# 评估模型
print("准确率:", accuracy_score(y_test, y_pred))
print("\n分类报告:\n", classification_report(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))

# 可视化决策树
plt.figure(figsize=(12, 8))
plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.title("决策树可视化")
plt.show()
6.1 代码解析
  • 数据加载:使用 load_iris 函数加载鸢尾花数据集,该数据集包含三个类别的鸢尾花的特征。
  • 数据划分:使用 train_test_split 将数据集划分为训练集和测试集,测试集占比为 20%。
  • 创建分类器:使用 DecisionTreeClassifier 创建决策树分类器,设置最大深度为 3,确保树不会过于复杂。
  • 模型训练:使用训练集训练模型。
  • 模型预测:在测试集上进行预测,评估模型的准确率和其他性能指标。
  • 可视化决策树:使用 plot_tree 函数可视化决策树结构。

七、总结

决策树是一种强大且易于理解的机器学习模型,适用于分类和回归任务。通过选择最优特征进行划分,决策树能够有效地对数据进行建模。尽管决策树有许多优点,但在实际应用中也需要注意过拟合和不稳定性的问题,因此常常结合剪枝技术进行改进。由于其直观的可视化和解释性,决策树在多个领域都得到了广泛应用。

希望这份详细的讲解对您了解决策树有帮助!如果您有任何疑问或需要更深入的讨论,请随时告诉我!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python实战】利用代理ip爬取Alibaba海外版数据

引言 在跨境电商的业务场景中,数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而,随着越来越多企业依赖数据驱动决策,许多跨境电商平台为了保护自身数据,采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部…

Idea、VS Code 如何安装Fitten Code插件使用

简介 Fitten Code是由非十大模型驱动的AI编程助手,它可以自动生成代码,提升开发效率,帮您调试Bug,节省您的时间。还可以对话聊天,解决您编程碰到的问题。免费且支持80多种语言:Python、C、Javascript、Typ…

python实战(一)——iris鸢尾花数据集分类

一、任务背景 本文是python实战系列专栏的第一篇文章,我们将从分类开始由浅入深逐步学习如何使用python完成常规的机器学习/深度学习任务。iris数据集是经典的机器学习入门数据集,许多分类任务教程都会以这个数据集作为示例,它的数据量是150条…

No.21 笔记 | WEB安全 - 任意文件绕过详解 part 3

(一)空格绕过 原理 Windows系统将文件名中的空格视为空,但程序检测代码无法自动删除空格,使攻击者可借此绕过黑名单限制。基于黑名单验证的代码分析 代码未对上传文件的文件名进行去空格处理,存在安全隐患。相关代码逻…

【软考高级架构】关于分布式数据库缓存redis的知识要点汇总

一.分布式数据库的含义 分布式数据库缓存指的是在高并发的环境下,为了减轻数据库的压力和提高系统响应时间,在数据库系统和应用系统之间增加一个独立缓存系统。 二.常见的缓存技术 (1)MemCache: Memcache是一个高性能的分布式的内…

openlayers 封装加载本地geojson数据 - vue3

Geojson数据是矢量数据,主要是点、线、面数据集合 Geojson数据获取:DataV.GeoAtlas地理小工具系列 实现代码如下: import {ref,toRaw} from vue; import { Vector as VectorLayer } from ol/layer.js; import { Vector as VectorSource } fr…

html全局属性、框架标签

常用的全局属性&#xff1a; 属性名含义id 给标签指定唯一标识&#xff0c;注意&#xff1a;id是不能重复的。 作用&#xff1a;可以让label标签与表单控件相关联&#xff1b;也可以与css、JavaScript配合使用。 注意&#xff1a;不能再以下HTML元素中使用&#xff1a;<hea…

Unity3D学习FPS游戏(4)重力模拟和角色跳跃

前言&#xff1a;前面两篇文章&#xff0c;已经实现了角色的移动和视角转动&#xff0c;但是角色并没有办法跳跃&#xff0c;有时候还会随着视角移动跑到天上。这是因为缺少重力系统&#xff0c;本篇将实现重力和角色跳跃功能。觉得有帮助的话可以点赞收藏支持一下&#xff01;…

社区养老实训室解决方案

一、实训室建设理念与目标 1.1 培养高质量养老专业人才 随着人口老龄化的不断加剧&#xff0c;对养老专业人才的需求呈现出日益增长的趋势。社区养老实训室的建设理念&#xff0c;正是基于这一背景&#xff0c;致力于培养一支既具备专业技能又拥有综合服务能力的高质量养老人…

gitlab不同账号间·仓库转移

背景&#xff1a;公司业务调整&#xff0c;原先在海外仓库的代码转移回国内 诉求&#xff1a;完整的保留项目记录 操作&#xff1a; 步骤一: 定位到需要迁移的原项目地址 步骤二&#xff1a;创建新项目 步骤三&#xff1a;打开命令行&#xff0c;创建好文件路径为需要clo…

Anchor DETR论文笔记

原文链接 [2109.07107] Anchor DETR: Query Design for Transformer-Based Object Detection (arxiv.org)https://arxiv.org/abs/2109.07107 原文笔记 What 提出了一种新的基于锚点的查询设计&#xff0c;即将锚点编码为对象查询。 Why 对象检测任务是预测图像中每个对象…

监督学习之逻辑回归

逻辑回归&#xff08;Logistic Regression&#xff09; 逻辑回归是一种用于二分类&#xff08;binary classification&#xff09;问题的统计模型。尽管其名称中有“回归”二字&#xff0c;但逻辑回归实际上用于分类任务。它的核心思想是通过将线性回归的输出映射到一个概率值…

C++与现代开发实践第三节:多线程与并发编程

第四章&#xff1a;C与现代开发实践 第三节&#xff1a;多线程与并发编程 在这一课中&#xff0c;我们将详细探讨多线程与并发编程的各个方面&#xff0c;特别是从线程的创建、管理到高级的优化技术&#xff0c;并且通过复杂的实战案例来展示如何应对并发问题。最后&#xff…

探索现代软件开发中的持续集成与持续交付(CI/CD)实践

探索现代软件开发中的持续集成与持续交付&#xff08;CI/CD&#xff09;实践 随着软件开发的飞速进步&#xff0c;现代开发团队已经从传统的开发模式向更加自动化和灵活的开发流程转变。持续集成&#xff08;CI&#xff09; 与 持续交付&#xff08;CD&#xff09; 成为当下主…

git入门操作

文章目录 git入门操作git创建仓库&#xff1a;git initgit clone工作区域&#xff1a;文件状态git添加和提交git add git statusgit add .git commit -m 版本描述git ls-filesgit log git的reset回退版本git log 查看版本号git reset --softgit reset --hardgit reset --mixed总…

Github 2024-10-21 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-10-21统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目7Python项目5Go项目2Svelte项目1非开发语言项目1C++项目1Shell项目1技术面试必备知识开源项目 创建周期:2442 天Star数量:1762…

chrome清除https状态

莫名其妙的http跳转到https的url了。 解决办法 浏览器地址栏输入&#xff1a;chrome://net-internals/#hsts 输入你需要删除的域名即可&#xff01;&#xff01;&#xff01;

uniapp picker实现省市二级级联和省市区三级级联

接口返回值格式&#xff1a; 二级级联-vue2 <picker mode"multiSelector" change"bindPickerChange" columnchange"columnchange" :value"index":range"array" range-key"label"><view class"uni…

Qt (QGroupBox、QTableView、QTableWidget)QSS样式

文章目录 设置效果样式内容说明qss文件内容补充 设置效果 先上图&#xff0c;为了方便大家区分&#xff0c;使用了多种颜色进行设置。 样式内容说明 * {background-color: #88e7ea; }设置全局背景色 可能是因为 QGroupBox 的背景色优先级较高&#xff0c;覆盖了全局样式。 …

GD32学习知识点累计

时钟系统 GD32f427主频最高位240MHZ&#xff08;但是只能到200M&#xff09;&#xff0c;GD32给的函数外接25MHZ晶振配置主频为200MHZ,APB1最高频率为60HZ配置为主频的4分频为50MHZ&#xff0c;APB2最大为120MHZ配置为主频的2分频为100MHZ 定时器 无论什么定时器最大频率为200M…