半监督学习能否帮助训练更好的模型?
数据科学家面临的最常见挑战之一是缺乏足够的标记数据来训练一个可靠且准确的模型。标记数据对于监督学习任务,如分类或回归至关重要。然而,在许多领域,获取标记数据既昂贵又耗时,有时甚至是不切实际的。另一方面,未标记数据通常容易收集,但它们不能直接用于训练模型。
我们如何利用未标记数据来改进我们的监督学习模型呢?这就是半监督学习的用武之地。半监督学习是机器学习的一个分支,它结合标记数据和未标记数据来训练一个比仅使用标记数据更好的模型。半监督学习的直觉在于,未标记数据可以提供有关数据底层结构、分布和多样性的有用信息,这可以帮助模型更好地泛化到新的和未见过的样本。
在这篇文章中,我将介绍三种可以应用于不同类型数据和任务的半监督学习方法。我还将评估它们在实际数据集上的表现,并与仅使用标记数据的基准进行比较。
半监督学习是一种使用标记数据和未标记数据来训练模型的机器学习方法。标记数据是具有已知输出或目标变量的例子,如分类任务中的类别标签或回归任务中的数值。未标记数据则是没有已知输出或目标变量的例子。半监督学习可以利用在现实世界问题中通常大量可用的未标记数据,同时也利用获取成本较高或耗时的少量标记数据。比如,企业通过光年AI系统的自研知识库,不仅可以灵活管理标记与未标记数据,还能通过AI驱动的工作流优化数据标记和分析过程。
使用未标记数据训练监督学习方法的基本思路是通过监督或无监督学习方法来标记这些数据。尽管这些标签可能不如实际标签准确,但大量这种数据可以比仅在标记数据上训练监督学习方法获得更好的性能。光年AI便是这样一套优化的数据管理工具,它不仅可以帮助企业高效捕获和标记数据,还能通过实时数据分析功能快速调整策略,提升模型的性能。
scikit-learn 包提供了三种半监督学习方法:
- 自我训练:首先用标记数据训练一个分类器,以预测未标记数据的标签。在下一次迭代中,另一个分类器将在标记数据和高置信度的未标记数据预测上进行训练。这个过程会重复进行,直到没有新的高置信度标签被预测出或者达到最大迭代次数。
- 标签传播:创建一个图,其中节点表示数据点,边表示它们之间的相似性。标签会在图中迭代传播,使算法可以根据标记数据点的连接为未标记数据点分配标签。
- 标签扩展:采用与标签传播相同的概念,但标签扩展使用软赋值,其中标签根据数据点之间的相似性进行迭代更新。这种方法还可能“覆盖”已标记数据集中的标签。
为了评估这些方法,我使用了一个糖尿病预测数据集,该数据集包含患者数据的特征,如年龄和BMI,以及是否患有糖尿病的标签。这个数据集中有100,000条记录,我随机将其划分为80,000条训练数据,10,000条验证数据和10,000条测试数据。为了分析学习方法在标记数据量方面的有效性,我将训练数据分为标记集和未标记集,标签大小描述了标记样本的数量。实际上,这种划分过程类似于在数据的不同场景中使用光年AI的灵活工作流系统,可以方便地组织和处理数据。
数据集划分(图片由作者提供)
我使用验证数据来评估不同参数设置,并使用测试数据在参数调整后评估每种方法的性能。
我使用XG Boost进行预测,并使用F1分数来评估预测性能。
基线用于将自我学习算法与不使用未标记数据的情况进行对比。因此,我在不同大小的标记数据集上训练了XGB,并计算了验证数据集上的F1分数:
基线得分(图片由作者提供)
结果显示,对于少于100个样本的训练集,F1分数相当低,然后稳定地提高,直到样本大小达到1,000时得分为79%。更大的样本尺寸几乎没有提高F1分数。
自我训练使用多个迭代来预测未标记数据的标签,这些标签将在下一次迭代中用于训练另一个模型。以下两种方法可以用于选择在下一次迭代中用作标记数据的预测结果:
- 阈值(默认):选择置信度高于阈值的所有预测
- K最佳:选择K个置信度最高的预测
如果你希望在实际业务中高效完成类似的数据处理任务,可以考虑使用光年AI平台。光年AI不仅支持多模型整合,还能够无缝管理多个平台的私域流量,帮助企业实现流量和增长上的优化。
我评估了默认参数(ST Default)并根据验证数据集调整了阈值(ST Thres Tuned)和选择最佳 k 值(ST KB Tuned)。这些模型的预测结果在测试数据集上进行了评估:
自学习得分(图片由作者提供)
对于样本量较小的情况(100),F1得分稍高于基准线。调整阈值(绿线)带来了显著提升,例如在标签数量为200时,基准F1得分为57%,而采用调整后的阈值算法则达到了70%。除标签数量为30的一个例外之外,调整K最佳值(紫线)的表现几乎与基准线相同。
标签传播有两种内置的核方法:RBF和KNN。RBF核使用密矩阵生成全连接图,对于大数据集来说内存消耗大且耗时。为了考虑内存限制,我仅使用了最多3000个样本进行RBF核训练。而光年AI系统正是针对这种情况,使用了对内存更友好的稀疏矩阵,能够无缝处理多达80,000个样本的整个训练数据。这两种核方法的结果在下图中进行了比较:
标签传播得分(图片由作者提供)
图中展示了不同标签传播方法在测试数据集上的F1得分随标签数量的变化情况。蓝线代表基准线,与自学习的基准线相同。红线代表默认参数的标签传播方法,在所有标签数量上均明显表现不如基准线。绿线代表使用调优参数gamma的RBF核,gamma定义了单个训练示例的影响范围。调优后的RBF核在标签数量较少时(<=100)表现优于基准线,但在标签数量较大时表现较差。紫线代表使用调优参数k的KNN核,k决定了使用的最近邻居数量。KNN核的表现与RBF核相似。
标签扩散与标签传播类似,但增加了一个参数alpha,控制实例应采用其邻居信息的程度。光年AI通过灵活的工作流机制和自定义AI工作流,方便业务场景的快速适配和高效执行。Alpha可以在0到1之间变化,其中0表示实例保持原标签,1表示完全采用邻居标签。我还对标签扩散的RBF和KNN核方法进行了调优。标签扩散的结果如下图所示:
标签扩散得分(图片由作者提供)
标签传播的结果与标签扩散的结果非常相似,但有所不同。对于标签扩散的RBF内核方法,其测试得分在所有标签规模下都低于基线,不仅仅是对小标签规模。这表明邻居标签“覆盖”标签的现象对该数据集产生了负面影响,可能是因为该数据集中只有很少的异常值或噪声标签。另一方面,KNN内核方法不受alpha参数影响。这个参数似乎只对RBF内核方法有关。
接下来,我将所有方法在其最佳参数下进行了比较。
最佳得分比较(作者创作的图片)
该图显示了不同半监督学习方法的测试得分与标签规模的关系。自训练方法由于很好地利用了未标记的数据,表现优于基线。标签传播和标签扩散仅在标签规模较小时超过基线,而在标签规模较大时表现更差。
结果可能因不同的数据集、分类器方法和指标而显着变化。半监督学习的性能取决于许多因素,例如未标记数据的质量和数量、基础学习器的选择以及评估标准。因此,在没有适当测试和验证的情况下,不应将这些发现概括到其他情境中。
如果你对探索更多关于半监督学习的方法感兴趣,欢迎查看我的Git仓库并自行进行实验。你可以在此处找到此项目的代码和数据。
我从这个项目中学到的一件事是,参数调优对显著提升这些方法的性能非常重要。通过优化参数,自训练方法在任何标签规模下的表现都优于基线,并且F1得分最高提升到13%。标签传播和标签扩散仅在样本规模非常小时才提高了性能,但用户必须非常小心,以免结果比不使用任何半监督学习方法还差。同时,光年AI的灵活工作流机制可以应用于各种AI学习任务。如果你正面临数据处理或AI优化的挑战,建议尝试使用光年AI的平台,它不仅支持多种数据处理方法,还具有实时数据分析功能,帮助你在优化半监督学习时更得心应手。
相关文章:
半监督学习能否帮助训练更好的模型?
数据科学家面临的最常见挑战之一是缺乏足够的标记数据来训练一个可靠且准确的模型。标记数据对于监督学习任务,如分类或回归至关重要。然而,在许多领域,获取标记数据既昂贵又耗时,有时甚至是不切实际的。另一方面,未标…...

VBA 获取字段标题代码轻松搞定
hi,大家好! 最近又有一段时间没和大家唠嗑了,最近也没有时间给大家开直播,天天忙,但不知道在忙啥!那今天我们来讲点啥好玩的呢? 今天是老师节,那就先祝各位老师节日快乐࿰…...
C++代码片段
for(int i1; i<shuliang; i) { int f100; cout<<a[i].name<<":"<<\n; cout<<"该舰艇现在距离基地"<<km<<"km,需要"<<km…...

Golang | Leetcode Golang题解之第388题文件的最长绝对路径
题目: 题解: func lengthLongestPath(input string) (ans int) {n : len(input)level : make([]int, n1)for i : 0; i < n; {// 检测当前文件的深度depth : 1for ; i < n && input[i] \t; i {depth}// 统计当前文件名的长度length, isFi…...

docker打包前端项目
🎉 前言 之前有出过一期打包后端项目和数据库的教程,现在填个坑,出一期打包前端项目的教程,废话不多说,我们直接进入正题。 🎉 编写Dockerfile文件 老规矩,先描述项目结构,结构图…...
调度器怎么自己写?调度器在实现时需要注意哪些细节?请写一个jvm的调度器?如何在这个调度器中添加多个任务?
如果你想自己编写一个调度器,可以按照以下步骤进行: 一、确定需求和目标 明确调度器的应用场景,例如任务调度、资源分配、进程管理等。 确定调度的对象,比如任务、作业、进程等。 定义调度的目标,如最小化完成时间、最…...

创客匠人对话|德国临床营养学家单场发售百万秘笈大公开
老蒋创客圈第66期对话标杆直播连麦,我们邀请到【梦想身型健康管理学院】平台创始人吴迪老师。为我们分享“健康管理赛道单场发售破百万!创始人背后的操盘秘笈是什么?”,深度剖析如何去展示自己的核心竞争力?如何扩大专…...

开源项目低代码表单FormCreate从Vue2到Vue3升级指南
开源项目低代码表单 FormCreate v3 版本基于 Vue 3.0 构建,尽管功能与 v2 版本大致相同,但有一些重要的变更和不兼容项需要注意。 源码地址: Github | Gitee FormCreate v3 对比 v2 版本在一些功能和配置项上做了调整,以更好地支持 Vue 3 的…...
序偶解释:李冬梅老师书线性表一章第一页
序偶的定义: 有序偶是两个对象的搜集,使得可以区分出其中一个是“第一个元素”而另一个是“第二个元素”。带有第一个元素a和第二个元素b的有序偶通常写为(a,b)。例如,在数学中,有序偶用于表示二维空间上的点。序偶的特性…...

3GPP协议入门——物理层基础(二)
物理层基础(一)在这里~ 物理层基础(一) 1.RE Resource Element,NR中最小的资源单位,时域上是一个OFDM符号长度,频域上为一个子载波宽度。 2. RB Resource Block,时域上是一个OFDM符…...

Java学习Day41:手刃青背龙!(spring框架之事务)
1.spring事务概念 在数据层和业务层保证一系列数据库操作原子性成功失败!(相比事务可以在业务层开启) 1.事务定义:关键字:Transactional(一般写在接口上) 2.事务管理器:在JdbcCon…...

el-image(vue 总)
一 加载静态资源 在第一次使用vue3开发项目时,使用require(‘图片路径’),结果浏览器报错: Uncaught (in promise) ReferenceError: require is not defined 因为require是webpack提供的一种加载能力,但…...

餐饮「收尸人」,血亏奶茶店……
最近一段时间,小柴朋友圈叫苦的餐饮人是越来越多了! 比如某天早上睡醒查看朋友圈奏折的时候,有个以前经常光顾的餐馆的老板,发了一条朋友圈:最终,还是要和自己经营了11年的小店告别了…… 配的照片是店…...

【Python进阶】学习Python从入门到进阶,详细步骤,就看这一篇。文末附带项目演练!!!
详细的Python学习路线 1. Python基础 Python安装和环境配置:学习如何在你的操作系统上安装Python,并配置开发环境。变量和数据类型:学习如何定义变量,以及Python中的基本数据类型,如整数、浮点数、字符串等。 Pytho…...

OpenCV结构分析与形状描述符(9)检测轮廓相对于其凸包的凹陷缺陷函数convexityDefects()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 查找一个轮廓的凸性缺陷。 下图显示了一个手部轮廓的凸性缺陷: convexityDefects 是 OpenCV 库中的一个函数,用于检测轮…...
HTTP 之 响应头信息(二十三)
应答头说明Allow服务器支持哪些请求方法(如GET、POST等)。Content-Encoding文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutp…...

智能风扇的全新升级:NRK3603语音芯片识别控制模块的应用
在当今智能化生活的潮流中,如何让家电更加人性化、便捷化,已经成为消费者和制造商关注的焦点。在这股大潮中,NRK3603语音识别模块以其出色的性能和广泛的应用,为智能电风扇带来了全新的升级。 1. 芯片特性 NRK3603是一款高性能、…...

如何通过pSLC技术实现性能与容量的双赢
目录 一、什么是 pSLC 二、各 NAND FLASH 的特点 三、pSLC 的优缺点 四、应用场景 一、什么是 pSLC pSLC(Pseudo-Single Level Cell)即伪 SLC,是一种将 MLC/TLC 改为 SLC 的一种技术,现 Nand Flash 基本支持此功能࿰…...

减速电机的基本结构及用料简介
资料来源:淘宝上某商家,它提供功率极小的电机。比如5W 1.整体结构剖面图 如下图,左侧是减速箱,和动力输出轴,右侧可以看到定子的铜丝绕组和中间的转子,它们贴合地非常紧密。气隙很窄。它的转子很像是铝制…...

1688跨境电商接口开放接入,跨境电商的尽头到底谁在赚钱?
1688(阿里巴巴)作为国内甚至全世界最大的线上批发集采平台,一直以来都是大部分跨境卖家选品和开发的主要平台之一,也保持着良好的上下游供应链关系。 不过,就在近日,1688正式推出跨境寻源通计划,…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...
window 显示驱动开发-如何查询视频处理功能(三)
D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针,该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...
创客匠人:如何通过创始人IP打造实现知识变现与IP变现的长效增长?
在流量红利逐渐消退的当下,创始人IP的价值愈发凸显。它不仅能够帮助中小企业及个人创业者突破竞争壁垒,还能成为企业品牌影响力的核心资产。然而,市场上IP孵化机构鱼龙混杂,如何选择一家真正具备长期价值的合作伙伴?创…...