当前位置: 首页 > news >正文

机器学习_决策树与随机森林

决策树是一种常用的监督学习算法,既可以用于分类任务也可以用于回归任务。决策树通过递归地将数据集划分成更小的子集,逐步建立树结构。每个节点对应一个特征,树的叶子节点表示最终的预测结果。构建决策树的关键是选择最佳的特征来分割数据,而信息增益(Information Gain)和熵(Entropy)是常用的度量标准。

熵(Entropy)

原理

熵是衡量随机变量不确定性的指标。在决策树中,熵用于衡量数据集的纯度或混乱程度。熵越高,数据集越混乱;熵越低,数据集越纯净。

公式

对于一个包含 ( n ) 个类别的分类问题,数据集 ( S ) 的熵定义为:
Entropy ( S ) = − ∑ i = 1 n p i log ⁡ 2 ( p i ) \text{Entropy}(S) = -\sum_{i=1}^{n} p_i \log_2(p_i) Entropy(S)=i=1npilog2(pi)
其中,( p_i ) 是数据集中第 ( i ) 类的比例。

示例

假设数据集 ( S ) 有两类(正例和反例),其中正例占比 ( p ),反例占比 ( 1-p ),则熵为:
Entropy ( S ) = − p log ⁡ 2 ( p ) − ( 1 − p ) log ⁡ 2 ( 1 − p ) \text{Entropy}(S) = -p \log_2(p) - (1-p) \log_2(1-p) Entropy(S)=plog2(p)(1p)log2(1p)

信息增益(Information Gain)

原理

信息增益用于衡量选择某个特征进行划分后,数据集的纯度增加了多少。信息增益越大,说明通过该特征进行划分,能够更好地区分数据。因此,决策树在选择特征进行划分时,会选择信息增益最大的特征。

公式

特征 ( A ) 对数据集 ( S ) 的信息增益定义为:
Gain ( S , A ) = Entropy ( S ) − ∑ v ∈ Values ( A ) ∣ S v ∣ ∣ S ∣ Entropy ( S v ) \text{Gain}(S, A) = \text{Entropy}(S) - \sum_{v \in \text{Values}(A)} \frac{|S_v|}{|S|} \text{Entropy}(S_v) Gain(S,A)=Entropy(S)vValues(A)SSvEntropy(Sv)
其中,Values(A) 表示特征 ( A ) 的所有可能取值,( S_v ) 表示在特征 ( A ) 上取值为 ( v ) 的子集。

示例

假设我们有一个数据集 ( S ),特征 ( A ) 有两个可能取值 ( {a_1, a_2} ),则信息增益计算过程如下:

  1. 计算整个数据集的熵: Entropy ( S ) \text{Entropy}(S) Entropy(S)
  2. 计算特征 ( A ) 各个取值子集的熵: Entropy ( S a 1 ) \text{Entropy}(S_{a_1}) Entropy(Sa1) Entropy ( S a 2 ) \text{Entropy}(S_{a_2}) Entropy(Sa2)
  3. 计算信息增益:
    Gain ( S , A ) = Entropy ( S ) − ( ∣ S a 1 ∣ ∣ S ∣ Entropy ( S a 1 ) + ∣ S a 2 ∣ ∣ S ∣ Entropy ( S a 2 ) ) \text{Gain}(S, A) = \text{Entropy}(S) - \left( \frac{|S_{a_1}|}{|S|} \text{Entropy}(S_{a_1}) + \frac{|S_{a_2}|}{|S|} \text{Entropy}(S_{a_2}) \right) Gain(S,A)=Entropy(S)(SSa1Entropy(Sa1)+SSa2Entropy(Sa2))

基尼指数(Gini Index)

除了熵和信息增益,基尼指数也是常用的决策树分裂准则。基尼指数衡量数据集的不纯度,值越小越纯。

公式

对于一个包含 ( n ) 个类别的数据集 ( S ),基尼指数定义为:
Gini ( S ) = 1 − ∑ i = 1 n p i 2 \text{Gini}(S) = 1 - \sum_{i=1}^{n} p_i^2 Gini(S)=1i=1npi2
其中,( p_i ) 是数据集中第 ( i ) 类的比例。

示例

假设数据集 ( S ) 有两类(正例和反例),其中正例占比 ( p ),反例占比 ( 1-p ),则基尼指数为:
Gini ( S ) = 1 − ( p 2 + ( 1 − p ) 2 ) = 2 p ( 1 − p ) \text{Gini}(S) = 1 - (p^2 + (1-p)^2) = 2p(1-p) Gini(S)=1(p2+(1p)2)=2p(1p)

信息增益率(Information Gain Ratio)

信息增益率是信息增益的一种改进形式,旨在处理信息增益对取值较多的特征的偏好问题。

公式

特征 ( A ) 对数据集 ( S ) 的信息增益率定义为:
GainRatio ( S , A ) = Gain ( S , A ) SplitInformation ( A ) \text{GainRatio}(S, A) = \frac{\text{Gain}(S, A)}{\text{SplitInformation}(A)} GainRatio(S,A)=SplitInformation(A)Gain(S,A)
其中,分裂信息(Split Information)定义为:
SplitInformation ( A ) = − ∑ v ∈ Values ( A ) ∣ S v ∣ ∣ S ∣ log ⁡ 2 ( ∣ S v ∣ ∣ S ∣ ) \text{SplitInformation}(A) = -\sum_{v \in \text{Values}(A)} \frac{|S_v|}{|S|} \log_2 \left( \frac{|S_v|}{|S|} \right) SplitInformation(A)=vValues(A)SSvlog2(SSv)

用法
  1. 分类:用于分类任务,目标变量是类别。
  2. 回归:用于回归任务,目标变量是连续值。
优点
  • 易于理解和解释。
  • 处理类别特征和数值特征。
  • 不需要大量数据预处理。
缺点
  • 容易过拟合,尤其在树深度较大时。
  • 对噪声数据敏感。
代码实例

以下是使用 scikit-learn 实现决策树分类和回归的代码示例。

from sklearn.datasets import load_iris, load_boston
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.metrics import accuracy_score, mean_squared_error# 分类任务
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)print(f"Classification Accuracy: {accuracy_score(y_test, y_pred)}")# 回归任务
boston = load_boston()
X, y = boston.data, boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)reg = DecisionTreeRegressor()
reg.fit(X_train, y_train)
y_pred = reg.predict(X_test)print(f"Regression MSE: {mean_squared_error(y_test, y_pred)}")

随机森林

随机森林是集成学习方法的一种,通过生成多个决策树,并结合它们的预测结果来提高模型的性能和稳定性。

用法
  1. 分类:用于分类任务,通过多个决策树的投票来确定类别。
  2. 回归:用于回归任务,通过多个决策树的平均值来预测连续值。
优点
  • 减少过拟合的风险。
  • 更高的预测准确性。
  • 能处理高维数据和缺失值。
缺点
  • 计算开销较大,尤其是树的数量较多时。
  • 模型复杂性较高,不易解释。
代码实例

以下是使用 scikit-learn 实现随机森林分类和回归的代码示例。

from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor# 分类任务
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)print(f"Random Forest Classification Accuracy: {accuracy_score(y_test, y_pred)}")# 回归任务
reg = RandomForestRegressor(n_estimators=100, random_state=42)
reg.fit(X_train, y_train)
y_pred = reg.predict(X_test)print(f"Random Forest Regression MSE: {mean_squared_error(y_test, y_pred)}")

进阶用法和参数调整

决策树参数
  • criterion: 分裂的评价标准(ginientropy 用于分类;msemae 用于回归)。
  • max_depth: 树的最大深度,防止过拟合。
  • min_samples_split: 分裂内部节点所需的最小样本数。
  • min_samples_leaf: 叶节点的最小样本数。
随机森林参数
  • n_estimators: 决策树的数量。
  • max_features: 每次分裂时考虑的特征数量。
  • bootstrap: 是否在构建树时使用自助法采样。
  • oob_score: 是否使用袋外样本评估模型性能。
# 调整决策树参数
clf = DecisionTreeClassifier(max_depth=5, min_samples_split=10, criterion='entropy')
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(f"Tuned Decision Tree Classification Accuracy: {accuracy_score(y_test, y_pred)}")# 调整随机森林参数
reg = RandomForestRegressor(n_estimators=200, max_features='sqrt', oob_score=True, random_state=42)
reg.fit(X_train, y_train)
y_pred = reg.predict(X_test)
print(f"Tuned Random Forest Regression MSE: {mean_squared_error(y_test, y_pred)}")
print(f"Out-of-Bag Score: {reg.oob_score_}")

可视化决策树

可以使用 graphviz 库可视化决策树,以便更好地理解其结构。

from sklearn.tree import export_graphviz
import graphviz# 导出决策树图像
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)
graph = graphviz.Source(dot_data)
graph.render("decision_tree")

通过这些实例,展示了决策树和随机森林在分类和回归任务中的应用。可以根据具体问题调整参数,提升模型的性能和稳定性。

相关文章:

机器学习_决策树与随机森林

决策树是一种常用的监督学习算法,既可以用于分类任务也可以用于回归任务。决策树通过递归地将数据集划分成更小的子集,逐步建立树结构。每个节点对应一个特征,树的叶子节点表示最终的预测结果。构建决策树的关键是选择最佳的特征来分割数据&a…...

嵌入式系统日志轮转:实现与性能考量

日志轮转是嵌入式系统中管理日志文件的一种常用技术,它通过创建新的日志文件来替代旧的日志文件,从而避免日志文件无限增长,占用过多存储空间。本文将探讨日志轮转的实现方法以及在嵌入式系统中实现日志轮转时需要考虑的性能因素。 一、日志…...

麦肯锡:ChatGPT等生成式AI应用激增,大中华区增长最快

全球顶级咨询公司麦肯锡(McKinsey & Company)在官网发布了《he state of AI in early 2024:Gen AI adoption spikes and starts to generate value》,一份关于生成式AI应用的调查报告。 麦肯锡对多个国家/地区的1,363位管理者进行了调查…...

Vue Router 使用教程

Vue Router 是 Vue.js 的官方路由管理器,它提供了一种方便的方式来管理应用的路由。在本教程中,我们将介绍 Vue Router 的一些常见用法和示例。 一、安装 Vue Router 使用 Vue Router 之前,需要先安装它。可以使用以下命令通过 npm 安装&am…...

银河麒麟解压命令

银河麒麟(Kylin)操作系统是基于Linux的操作系统分支之一,其使用的解压命令与Linux系统中的命令基本相同。 在银河麒麟系统中,常用的解压命令有以下几种: 对于.tar文件: tar -xvf file.tar对于.tar.gz或.…...

VSCode打开文件总是在当前标签页打开,不是新增标签页

修改 VS Code 设置 打开设置: 按 Ctrl , 或者点击右下角的齿轮图标,然后选择 “Settings”。 搜索设置: 在设置搜索栏中输入 workbench.editor.enablePreview。 禁用预览模式: 找到 Workbench > Editor: Enable Preview 选…...

Django redirect()函数实现页面重定向

1,通过路由反向解析进行重定向 1.1 添加视图函数 myshop/app2/views.py from django.http import HttpResponse from django.shortcuts import render from django.urls import reverse def index(request):return HttpResponse("app2 的index")# 反向…...

【运维项目经历|029】NTP精准时间同步系统优化项目

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目...

机房网络运维服务项目难点与关键点分析

随着信息技术的飞速发展,机房作为支撑企业信息化建设的核心枢纽,其网络运维服务的重要性日益凸显。然而,在实际运维过程中,运维团队常常面临诸多难点和挑战。本文将围绕机房网络运维服务项目的难点和关键点进行深入分析&#xff0…...

MKS AX7680 SERIES 电源使用说明手侧

MKS AX7680 SERIES 电源使用说明手侧...

DVWA-XSS(Reflected)

反射型XSS可以用来窃取cookie Low 输入1111进行测试&#xff0c;发现1111被打印 输入<script>alert(document.cookie)</script>&#xff0c;出现弹窗&#xff0c;获得cookie Medium 查看后端代码&#xff0c;发现对<script>进行了转义&#xff0c;但是…...

Python自动化办公2.0 即将发布

第一节课&#xff1a;数据整理与清洗 第二节课&#xff1a;数据筛选、过滤与排序 第三节课&#xff1a;高级数据处理技巧 第四节课&#xff1a;数据可视化与实践案例 第五节课&#xff1a;统计分析与报表 第六节&#xff1a;常见的Excel报表 与下方的课程形成知识体系&…...

【面试宝藏】Redis 常见面试题解析其二

Redis 高级面试题解析 20. 说说 Redis 哈希槽的机制&#xff1f; Redis 集群采用哈希槽&#xff08;Hash Slot&#xff09;机制来分布和管理数据。整个哈希空间被划分为 16384 个槽&#xff0c;每个键通过 CRC16 校验后取模映射到一个哈希槽。每个节点负责一部分哈希槽&#…...

智慧公厕厂家+智能厕所小程序,构建数字化公厕新体系

在现代社会的诸多场景中&#xff0c;公厕扮演着重要却常常被忽视的角色。尤其是在传统的楼宇中&#xff0c;公厕存在着一系列痛点问题。 一、传统公厕问题 传统楼宇公厕常常面临着布局不合理的困境&#xff0c;导致使用者寻找困难&#xff0c;浪费时间和精力。卫生状况也是一大…...

使用迁移助手 (SSMA for Oracle) 将Oracle19c数据库迁移到SQL Server2022

如何使用适用于 Oracle 的 SQL Server 迁移助手Microsoft SQL Server Migration Assistant for Oracle (SSMA for Oracle) 将 Oracle 数据库迁移到 SQL Server Microsoft SQL Server Migration Assistant (SSMA) for Oracle is a tool to automate migration from Oracle data…...

LabVIEW开发EOL功能测试系统

LabVIEW开发EOL功能测试系统 介绍了一种基于LabVIEW开发的EOL功能测试系统方案&#xff0c;涵盖软件架构、工作流程、模块化设计、低耦合性、易于修改与维护、稳定性及硬件选型。系统通过高效的CAN通信实现对电机控制器的全面测试&#xff0c;确保运行可靠并支持未来的升级需求…...

Java finally catch try关键字

Java finally catch try关键字 finally&#xff1a; finally 关键字用来创建在 try 代码块后面执行的代码块&#xff1b;无论是否发生异常&#xff0c;finally 代码块中的代码总会被执行。 在 finally 代码块中&#xff0c;可以进行文件流关闭等收尾善后性质的语句 catch&am…...

docker安装mysql8和mysql5.7

1.docker安装mysql5.7,请点击此链接 2.docker安装mysql8并挂载数据卷 docker pull mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORDmy-secret-pw -d mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORD123456 -v /mqq/mysql8/datadir:/var/lib/mysql -d…...

通过一个例子,说明Python的责任链设计模式有什么优缺点

责任链设计模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许将一个请求沿着处理者链进行传递&#xff0c;直到有一个处理者处理它为止。在Python中&#xff0c;这种模式可以通过多种方式实现&#xff0c;通常涉及到一系列对象…...

场地预定小程序基于FastAdmin+UniApp

本文来自&#xff1a;XYvenue场地预定小程序基于FastAdminUniApp - 源码1688 应用介绍 XYvenue是基于FastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 前端演示&#xf…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...