Lucas带你手撕机器学习——决策树
一、决策树简介
决策树是一种基本的分类与回归方法,它通过树状结构对数据进行分类或预测。每个内部节点代表一个特征(属性),每个分支代表特征的一个可能值,而每个叶子节点代表一个分类或预测值。由于其直观和易于理解的特点,决策树广泛应用于机器学习、数据挖掘和决策分析等领域。
1.1 决策树的结构
决策树由以下几个部分组成:
- 根节点:树的起始节点,表示整个数据集。
- 内部节点:每个内部节点表示对某个特征的测试。
- 分支:分支代表特征的取值,连接节点。
- 叶子节点:终止节点,代表最终的分类结果或预测值。
1.2 决策树的类型
根据任务的不同,决策树可以分为两种类型:
- 分类树:用于分类任务,叶子节点表示类别标签。
- 回归树:用于回归任务,叶子节点表示数值预测。
二、构建决策树
构建决策树的基本步骤如下:
- 选择最优特征:根据某种准则(如信息增益、基尼指数等)选择最能区分数据的特征。
- 划分数据集:根据选择的特征将数据集划分为多个子集。
- 递归构建子树:对每个子集重复步骤1和2,直到满足停止条件(如达到最大深度、样本数小于阈值等)。
- 生成决策树:最终生成的树就是完整的决策树。
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 优点
- 易于理解和解释:决策树的结构清晰,容易可视化和理解。
- 无需特征缩放:决策树不受特征尺度影响,不需要进行特征缩放。
- 处理缺失值:决策树能够处理缺失值,通过对样本进行划分,可以有效减少缺失值的影响。
- 适应非线性关系:决策树能够适应特征之间的非线性关系。
3.2 缺点
- 易过拟合:决策树容易在训练集上过拟合,导致在新数据上的性能下降。
- 不稳定性:对数据的微小变化敏感,可能导致结构上的较大变化。
- 偏向于多值特征:决策树在选择特征时,可能偏向于取值较多的特征。
- 局部最优:特征选择过程可能陷入局部最优,导致模型性能不佳。
四、决策树的剪枝技术
为了减少决策树的过拟合问题,可以采用剪枝技术。剪枝分为两种类型:
4.1 预剪枝(Pre-pruning)
在决策树构建的过程中,通过设置一些条件提前停止树的生长。例如,可以根据当前节点的样本数、树的深度或信息增益等,决定是否继续分裂节点。
4.2 后剪枝(Post-pruning)
在决策树构建完成后,通过评估模型在验证集上的表现,剪去一些不必要的节点。常用的方法有:
- 最小化错误率:通过计算剪枝前后的错误率,选择最小的错误率。
- 复杂度惩罚:引入一个惩罚项,对树的复杂度进行约束,选择复杂度与性能之间的最佳平衡点。
五、决策树的实践应用
决策树在实际应用中非常广泛,主要应用于以下领域:
- 医疗诊断:通过分析患者的症状和体征,辅助医生进行疾病的判断。
- 金融风控:在信用评分和贷款审批中,评估客户的风险等级。
- 市场营销:通过客户特征分析,制定个性化的营销策略。
- 客户分类:根据客户行为特征,进行客户细分和个性化服务。
六、用 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
函数可视化决策树结构。
七、总结
决策树是一种强大且易于理解的机器学习模型,适用于分类和回归任务。通过选择最优特征进行划分,决策树能够有效地对数据进行建模。尽管决策树有许多优点,但在实际应用中也需要注意过拟合和不稳定性的问题,因此常常结合剪枝技术进行改进。由于其直观的可视化和解释性,决策树在多个领域都得到了广泛应用。
希望这份详细的讲解对您了解决策树有帮助!如果您有任何疑问或需要更深入的讨论,请随时告诉我!
相关文章:
Lucas带你手撕机器学习——决策树
一、决策树简介 决策树是一种基本的分类与回归方法,它通过树状结构对数据进行分类或预测。每个内部节点代表一个特征(属性),每个分支代表特征的一个可能值,而每个叶子节点代表一个分类或预测值。由于其直观和易于理解…...
OpenIPC开源FPV之Ardupilot配置
OpenIPC开源FPV之Ardupilot配置 1. 源由2. 问题3. 分析3.1 MAVLINK_MSG_ID_RAW_IMU3.2 MAVLINK_MSG_ID_SYS_STATUS3.3 MAVLINK_MSG_ID_BATTERY_STATUS3.4 MAVLINK_MSG_ID_RC_CHANNELS_RAW3.5 MAVLINK_MSG_ID_GPS_RAW_INT3.6 MAVLINK_MSG_ID_VFR_HUD3.7 MAVLINK_MSG_ID_GLOBAL_P…...
合并数组的两种常用方法比较
在 JavaScript 中,合并数组的两种常用方法是使用扩展运算符 (...) 和使用 push 方法。 使用扩展运算符 this.items [...this.items, ...data.items]; 优点: 易于理解:使用扩展运算符的语法非常直观,表达了“将两个数组合并成一个…...
qt 下载安装
1. 官网地址 https://www.qt.io/ 2. 下载 使用邮箱注册账号,登录,后边安装时也用的到 登录后: 这里需要电话号验证,电话号需要正确的,其他随便填,电话号中国区前需要86, 验证后自动下载 …...
Oracle SQL Developer 同时打开多个table的设置
Oracle SQL Developer 同时打开多个table的设置 工具 》 首选项 》数据库 》对象查看器,勾选 “自动冻结对象查看器窗口”...
NVIDIA发布Nemotron-70B-Instruct,超越GPT-4o和Claude 3.5的AI模型
一、Nemotron-70B-Instruct 是什么 Nemotron-70B-Instruct 是由 NVIDIA 基于 Meta 的 Llama 3.1-70B 模型开发的先进大语言模型(LLM)。该模型采用了新颖的神经架构搜索(Neural Architecture Search,NAS)方法和知识蒸馏…...
死锁(Deadlock)C#
在多线程编程中,死锁(Deadlock)是一种非常常见的问题,通常发生在两个或多个线程相互等待对方持有的锁,导致它们都无法继续执行。要避免死锁,需要了解死锁的四个必要条件以及相应的解决策略。 死锁的形成 …...
前端-基础CSS 知识总结
1.书写位置:title 标签下方添加 style 双标签,style 标签里面书写 CSS 代码。 <title>CSS 初体验</title> <style>/* 选择器 { } */p {/* CSS 属性 */color: red;} </style><p>体验 CSS</p> <link rel="stylesheet" href=…...
最新版本jdbcutils集成log4j做详细sql日志、自动释放连接...等
maven坐标 <!-- MySQL 8 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version></dependency><!-- Druid连接池 --><dependency><groupId&…...
jQuery快速填充非form数据
jQuery快速填充非form数据 先看看jQuery根据name填充form表单数据 <!DOCTYPE html> <html><head><script src"https://code.jquery.com/jquery-3.6.0.min.js"></script> </head><body><form id"myForm">…...
语音语言模型最新综述! 关于GPT-4o背后技术的尝试
近期,大型语言模型(LLMs)在生成文本和执行各种自然语言处理任务方面展现出了卓越的能力,成为了强大的AI驱动语言理解和生成的基础模型。然而,仅依赖于基于文本模态的模型存在显著局限性。这促使了基于语音的生成模型的发展,使其能够更自然、直观地与人类互动。 为了…...
根据用户选择的行和列数据构造数据结构(跨行跨列)
方案一 这段代码的功能是根据用户选择的行和列数据,生成一个适合复制粘贴的字符串表格。代码会先按列的 id 从小到大排序,再根据行列的选择关系将数据按顺序填入表格,每行之间使用换行符分隔,每列之间使用制表符分隔。如果某一行…...
Spark教程5-基本结构化操作
加载csv文件 df spark.read.format("json").load("/data/flight-data/json/2015-summary.json")Schema 输出Schema df.printSchema()使用Schema读取csv文件,以指定数据类型 from pyspark.sql.types import StructField, StructType, Strin…...
内置数据类型、变量名、字符串、数字及其运算、数字的处理、类型转换
内置数据类型 python中的内置数据类型包括:整数、浮点数、布尔类型(以大写字母开头)、字符串 变量名 命名变量要见名知意,确保变量名称具有描述性和意义,这样可以使得代码更容易维护,使用_可以使得变量名…...
Win/Mac/Android/iOS怎麼刪除代理設置?
設置代理設置的主要構成 IP 地址和端口 這些是代理伺服器配置的最基本組件。代理伺服器的IP地址引導互聯網流量,而端口號指定伺服器上的通信通道。 為什麼要刪除代理設置? 刪除代理設置通常是為了解決網路問題、提高速度、恢復安全性或過渡到新的網路…...
数据结构------手撕顺序表
文章目录 线性表顺序表的使用及其内部方法ArrayList 的扩容机制顺序表的几种遍历方式顺序表的优缺点顺序表的模拟实现洗牌算法 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,…...
UDP(用户数据报协议)端口监控
随着网络的扩展,确保高效的设备通信对于优化网络功能变得越来越重要。在这个过程中,端口发挥着重要作用,它是实现外部设备集成的物理连接器。通过实现数据的无缝传输和交互,端口为网络基础设施的顺畅运行提供了保障。端口使数据通…...
【Java小白图文教程】-05-数组和排序算法详解
精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…...
OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集,以提…...
Lucas带你手撕机器学习——套索回归
好的,下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用,同时还会讨论其优缺点和一些常见问题。 套索回归(Lasso Regression) 1. 背景与动机 在机器学习和统计学中,模型的复杂性通常会影响其在…...
面试中的一个基本问题:如何在数据库中存储密码?
面试中的一个基本问题:如何在数据库中存储密码? 在安全面试中,“如何在数据库中存储密码?”是一个基础问题,但反映了应聘者对安全最佳实践的理解。以下是安全存储密码的最佳实践概述。 了解风险 存储密码必须安全&am…...
XML HTTP Request
XML HTTP Request 简介 XMLHttpRequest(XHR)是一个JavaScript对象,它最初由微软设计,并在IE5中引入,用于在后台与服务器交换数据。它允许网页在不重新加载整个页面的情况下更新部分内容,这使得网页能够实现动态更新,大大提高了用户体验。虽然名字中包含“XML”,但XML…...
TLS协议基本原理与Wireshark分析
01背 景 随着车联网的迅猛发展,汽车已经不再是传统的机械交通工具,而是智能化、互联化的移动终端。然而,随之而来的是对车辆通信安全的日益严峻的威胁。在车联网生态系统中,车辆通过无线网络与其他车辆、基础设施以及云端服务进行…...
当遇到 502 错误(Bad Gateway)怎么办
很多安装雷池社区版的时候,配置完成,访问的时候可能会遇到当前问题,如何解决呢? 客户端,浏览器排查 1.刷新页面和清除缓存 首先尝试刷新页面,因为有时候 502 错误可能是由于网络临时波动导致服务器无法连…...
学习记录:js算法(七十五): 加油站
文章目录 加油站思路一思路二思路三思路四思路五 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发…...
强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断
强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断 目录 强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-LSTM(集合经验模态分解-多尺…...
yarn的安装与使用以及与npm的区别(安装过程中可能会遇到的问题)
一、yarn的安装 使用npm就可以进行安装 但是需要注意的一点是yarn的使用和node版本是有关系的必须是16.0以上的版本。 输入以下代码就可以实现yarn的安装 npm install -g yarn 再通过版本号的检查来确定,yarn是否安装成功 yarn -v二、遇到的问题 1、问题描述…...
大数据行业预测
大数据行业预测 编译 李升伟 和所有预测一样,我们必须谨慎对待这些预测,因为其中一些预测可能成不了事实。当然,真正改变游戏规则的创新往往出乎意料,甚至让最警惕的预言家也措手不及。所以,如果在来年发生了一些惊天…...
可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式
可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式 前言 在我使用nextron(nextelectron)写了一个项目后打包发现nextron等一系列桌面端框架在生产环境是不支持next的ssr也就是api route功能的这就导致我非常难受&…...
二百七十、Kettle——ClickHouse中增量导入清洗数据错误表
一、目的 比如原始数据100条,清洗后,90条正确数据在DWD层清洗表,10条错误数据在DWD层清洗数据错误表,所以清洗数据错误表任务一定要放在清洗表任务之后。 更关键的是,Hive中原本的SQL语句,放在ClickHouse…...
apple开发者账号/优化设计高中
trident 7.0Kirill Grouchnikov发布了一个博客,详细介绍了即将发布的Trident可扩展动画库Java应用程序1.2版所能提供的期望。 Grouchnikov透露,版本1.2引入了一些新的API来满足某些应用程序需求。 将会有一个新的API来停止正在运行的时间轴,…...
克拉玛依市建设局官方网站/百度平台推广
GROUP BY GROUP BY语句用来与聚合函数(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)联合使用来得到一个或多个列的结果集。 语法如下: SELECT column1, column2, ... column_n, aggregate_function (expression) FROM tables …...
网站制作加盟/怎样进入12345的公众号
logcat是Android中一个命令行工具,可以用于得到程序的log信息。 每一个输出的Android日志信息都有一个标签和它的优先级. 日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就 是查看系统的标签). 优先级有下列几种&…...
网站上可以做文字链接么/企业网站建设的一般要素
介绍:在Linux 应用编程中使用setitimer() 函数创建定时器任务是最简单的,setitimer()在定时时间到的时候会触发SIGALRM信号。因此我们只需在信号中处理定时器相关操作即可。以下是通过man 命令查看的setitimer()函数:函数原型:int…...
网站建设联盟/线下广告投放渠道都有哪些
这里为了弄清楚JobIntentService,这边我将androidx的JobIntentService源码,doc都进行了翻译并拆分了2个类,分别为BelowOJobIntentService(android8.0以下版本),和JobIntentXService(8.0和以上版本)。以便充…...
免费做网站tk/彩虹云商城网站搭建
第三章 常用命令1、mkdir : 创建目录,make directorys,-p 递归创建目录mkdir-p /a/b/c2、ls : -l(long)d(directory)显示目录或文件,全称list-l#列出文件的详细信息,如创建者,创建时间,文件的读写权限列表…...