当前位置: 首页 > 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…...

CrossPrefetch: Accelerating I/O Prefetching for Modern Storage——论文泛读

ASPLOS 2024 Paper 论文阅读笔记整理 问题 目前计算设备和存储设备之间的性能差距仍然很大。因此&#xff0c;主内存缓存和缓冲区被广泛用于操作系统、用户级文件系统[32]和I/O运行时&#xff0c;在隐藏性能差距和减少I/O瓶颈方面发挥关键作用[23&#xff0c;26&#xff0c;3…...

详解 Spark Streaming 的 DStream 对象

一、DStream 的创建 1. 通过 RDD 队列 DStream 在内部实现上是一系列连续的 RDD 来表示。每个 RDD 包含有采集周期内的数据 /** 基本语法&#xff1a;StreamingContext.queueStream(queueOfRDDs: Queue, oneAtATime false) */ object DStreamFromRddQueue {def main(args: Ar…...

QT常用控件

目录 1.控件概述 2. QWidget 核⼼属性 设置组件是否可用 获取组件当前位置和尺⼨ QWidget的图标 组件的透明度设置 QWidget光标的设置 字体的设置 组件提示 设置组件获取到焦点的策略 stylesheet样式表 3.常用组件 QPushButton RadioButton Check Box QLabel …...

如何解决chatgpt出现503 bad gateway的问题

昨日&#xff0c;ChatGPT官网挂了&#xff0c;也就是使用web网页端访问的用户&#xff0c;会出现 bad gateway 情况。我们去ChatGPT官方的监控查看&#xff0c;已经展示相关错误。 影响的范围有&#xff1a; 影响了 ChatGPT 所有计划的所有用户。影响包括所有与 ChatGPT 相关…...

Halcon 双相机标定与拼图(二)

一、概述 这种标定有两种模式&#xff0c;有一个标定板和多个标定板两种 一个标定板 两个相机的重叠区域比较大&#xff0c;那么我们可以把标定板放到那个重叠区域来统一坐标系&#xff0c;如下 这种是只需要一个标定板&#xff0c;这种是推荐的方式 。这种是比较简单的&…...

【加密与解密】【04】Java安全架构

JAVA安全模块划分 JCA&#xff0c;Java Cryptography Architecture&#xff0c;Java加密体系结构JCE&#xff0c;Java Cryptography Extension&#xff0c;Java加密扩展包JSSE&#xff0c;Java Secure Sockets Extension&#xff0c;Java安全套接字扩展包JAAS&#xff0c;Java…...

论文阅读:Neural Scene Flow Prior

目录 概要 Motivation 整体架构流程 技术细节 小结 论文地址:...

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一&#xff0c;最近推出了其自主研发的操作系统——HarmonyOS 2.0&#xff0c;旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0&#xff0c;用户可能需要将手机中的文件备…...

QtCharts使用

1.基础配置 1.QGraphicsView提升为QChartView#include <QtCharts> QT_CHARTS_USE_NAMESPACE #include "ui_widget.h"2. QT charts 2.柱状图 2.1QBarSeries //1.创建Qchart对象QChart *chart new QChart();chart->setTitle("直方图演示");//设…...

深入分析 Flink SQL 工作机制

摘要&#xff1a;本文整理自 Flink Forward 2020 全球在线会议中文精华版&#xff0c;由 Apache Flink PMC 伍翀&#xff08;云邪&#xff09;分享&#xff0c;社区志愿者陈婧敏&#xff08;清樾&#xff09;整理。旨在帮助大家更好地理解 Flink SQL 引擎的工作原理。文章主要分…...

网站收录情况查询/电商推广和网络推广的策略

8月9日消息&#xff0c;华为消费者业务首届开发者大会今日举行。华为首次公布了自研操作系统“鸿蒙”。余承东表示&#xff0c;未来5-10年&#xff0c;华为消费者业务的长期战略是全场景智慧生活战略。并再次提到了华为消费者业务的”18N“战略&#xff1a;1就是手机是主入口&a…...

网站信息安全保障制度建设情况/如何自己建设网站

从23年初&#xff0c;ChatGPT火遍全球&#xff0c;通过其高拟人化的回答模式&#xff0c;大幅提升了人机对话的体验和效率&#xff0c;让用户拥有了一个拥有海量知识的虚拟助手&#xff0c;根据UBS发布的研究报告显示&#xff0c;ChatGPT在1月份的月活跃用户数已达1亿&#xff…...

长沙做网站建设公司哪家好/美国搜索引擎

依赖关系&#xff0c;可以理解成“USE-A”关系即使用关系。 依赖关系是一种使用关系&#xff0c;如果A类中的某个方法使用了B类对象&#xff0c;那么就可以说A类依赖B类。 class A{ public void f(B b){} } class B{} A类方法的形式参数是B类类型。也就是说A类对象如果要使用方…...

中国做w7的网站/新闻摘抄大全

模具排气槽不做好&#xff0c;产品憋坏后果很严重&#xff01; 排气槽的作用主要有两点&#xff1a;一是在注射熔融物料时&#xff0c;排除模腔内的空气&#xff1b;二是排除物料在加热过程中产生的各种气体。越是薄壁制品&#xff0c;越是远离浇口的部位&#xff0c;排气槽的…...

汕头做网站公司/广州aso优化公司 有限公司

writing-mode 样式可以控制文本在水平或垂直方向上如何排布&#xff0c;试了下&#xff0c;这里所说的文本应该不局限于文字&#xff0c;div 也可以&#xff1a;从上往下&#xff0c;从左往右html,body{ margin:0; border:0; padding:0; width:100%; height:100%; }.parent{ di…...

wordpress 小程序 标签/青岛网站排名提升

原标题&#xff1a;终端中的乐趣&#xff1a;6个有趣的Linux命令行工具(动态图)终端中的乐趣&#xff1a;6个有趣的Linux命令行工具(动态图)之前, 我们展示了一些有关有趣的 Linux 命令行命令的文章, 这些文章告诉我们, Linux 并不像看起来那样复杂, 如果我们知道如何使用的话,…...