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

深度学习总结(25)

抽样偏倚问题

非代表性数据有一个特别隐蔽又特别常见的例子,那就是抽样偏倚(sampling bias)​。如果你的数据收集过程与你尝试预测的目标之间存在相互影响,就会出现抽样偏倚,从而导致有偏差的结果。

理解数据

将数据集看作黑盒子,这是一种非常不好的做法。在开始训练模型之前,你应该探索数据并将其可视化,深入了解数据为何具有预测性,这将为特征工程提供信息并发现潜在问题。如果数据包含图像或自然语言文本,那么可以直接查看一些样本(及其标签)​。如果数据包含数值特征,那么最好绘制特征的直方图,大致了解特征的取值范围和不同取值的出现频率。如果数据包括位置信息,那么可以将其绘制在地图上,观察是否出现了任何明显的模式。一些样本是否有特征值缺失?如果是,那么你需要在准备数据时处理这个问题​。对于分类问题,可以算一下数据中每个类别的样本数。各个类别的比例是否大致相同?如果不是,那么需要考虑这种不平衡。检查是否存在目标泄露(target leaking)​:你的数据包含能够提供目标信息的特征,而这些特征在生产环境中可能并不存在。如果你在医疗记录上训练模型,以预测某人未来是否会接受癌症治疗,而医疗记录包含“此人已被诊断出患有癌症”这一特征,那么你的目标就被人为地泄露到数据中。经常问问自己:数据中的每个特征是否都会以相同形式出现在生产环境中?

选择衡量成功的指标

要控制某个事物,你需要能够观察它。要在一个项目上获得成功,你必须首先给出成功的定义:精度、准确率和召回率、还是客户留存率?衡量成功的指标将指引你在整个项目中的所有技术选择。它应该与你的最终目标(如客户的商业成功)保持一致。对于平衡分类问题(每个类别的比例相同)​,精度和受试者操作特征曲线下面积(area under a receiver operating characteristic curve,缩写为ROC AUC)是两个常用指标。对于类别不平衡的问题、排序问题和多标签分类问题,你既可以使用准确率和召回率,也可以使用精度或ROC AUC的加权形式。自定义的成功衡量指标也很常见。要想了解机器学习的各种成功衡量指标以及这些指标与不同问题领域的关系,你可以浏览Kaggle网站上的数据科学竞赛,上面展示了各种各样的问题和评估指标。

开发模型

知道了如何衡量进展,下面就可以开始开发模型了。大多数教程和研究项目假设这是唯一的步骤—跳过了问题定义和数据收集,假设这两步均已完成;跳过了模型部署和维护,假设这两步都是由别人来处理。事实上,模型开发只是机器学习工作流程中的一个步骤,,它并不是最难的一步。机器学习中最难的步骤是问题定义、数据收集、数据标注和数据清理。

准备数据

深度学习模型通常不会直接读取原始数据。数据预处理的目的是让原始数据更适于用神经网络处理,它包括向量化规范化处理缺失值。许多预处理方法是和特定领域相关的(比如针对于文本数据或图像数据)。

向量化

神经网络的所有输入和目标通常都必须是浮点数张量(在特定情况下可以是整数张量或字符串张量)​。无论你要处理什么数据(无论是声音、图像还是文本)​,首先都必须将其转换为张量,这一步叫作数据向量化(data vectorization)​。比如在文本分类示例中,开始时文本被表示为整数列表(代表单词序列)​,我们用one-hot编码将其转换为float32格式的张量。在手写数字分类和预测房价的示例中,数据已经是向量形式,所以可以跳过这一步。

规范化

在MNIST数字分类示例中,开始时图像数据被编码为取值在0~255范围内的整数,代表灰度值。将这一数据输入神经网络之前,我们需要将其转换为float32格式并除以255,这样就得到取值在0~1范围内的浮点数。同样,在预测房价的示例中,开始时数据特征有着不同的取值范围,有些特征是较小的浮点数,有些则是相对较大的整数。将这一数据输入神经网络之前,我们需要对每个特征分别做规范化,使其均值为0、标准差为1。一般来说,将取值相对较大的数据(比如多位整数,比神经网络权重的初始值大很多)或异质数据(heterogeneous data,比如数据的一个特征在0~1范围内,另一个特征在100~200范围内)输入神经网络是不安全的。这么做可能导致较大的梯度更新,进而导致神经网络无法收敛。为了让神经网络的学习变得更容易,输入数据应具有以下特征。

取值较小:通常情况下,大部分取值应该在0~1范围内。同质性:所有特征的取值应该大致在同一范围内。此外,下面这种更严格的规范化方法也很常见,而且很有用,不过并非必需(比如在数字分类问题中我们就没有这么做)​。对每个特征分别规范化,使其均值为0。对每个特征分别规范化,使其标准差为1。这对于NumPy数组很容易实现。

x -= x.mean(axis=0)  #假设x是一个形状为(samples, features)的二维矩阵
x /= x.std(axis=0)

处理缺失值

数据有时可能会有缺失值。比如在房价预测示例中,第一个特征(数据中索引编号为0的列)是人均犯罪率。如果不是所有样本都具有这个特征,那怎么办?这样训练数据或测试数据中将有缺失值。可以完全舍弃这个特征,但不一定非得这么做。如果是分类特征,则可以创建一个新的类别,表示“此值缺失”​。模型会自动学习这个新类别对于目标的含义。如果是数值特征,应避免输入像"0"这样随意的值,因为它可能会在特征形成的潜在空间中造成不连续性,从而让模型更加难以泛化。相反,你可以考虑用数据集中该特征的均值或中位值来代替缺失值。你也可以训练一个模型,给定其他特征的值,预测该特征的值。请注意,如果测试数据的分类特征有缺失值,而训练数据中没有缺失值,那么神经网络无法学会忽略缺失值。在这种情况下,你应该手动生成一些有缺失值的训练样本:将一些训练样本复制多次,然后舍弃测试数据中可能缺失的某些分类特征。

选择评估方法

模型的目的是实现泛化。在整个模型开发过程中,你所做的每一个建模决定都将以验证指标为指导,这些指标的作用是衡量泛化性能。评估方法的目的是准确估计在实际生产数据上的成功衡量指标(如精度)​。这一过程的可靠性对于构建一个有用的模型来说至关重要。三种常用的评估方法。简单的留出验证:数据量很大时可以采用这种方法。K折交叉验证:如果留出验证的样本太少,无法保证可靠性,则应该使用这种方法。重复K折交叉验证:如果可用的数据很少,同时模型评估又需要非常准确,则应该使用这种方法。从三种方法中选择一种即可。大多数情况下,第一种方法就足以得到很好的效果。不过要始终注意验证集的代表性,并注意在训练集和验证集之间不要存在冗余样本。

超越基准

在开始研究模型本身时,你的初始目标是获得**统计功效(statistical power)**​:开发一个能够超越简单基准的小模型。在这一阶段,你应该关注以下三件非常重要的事情。特征工程。过滤没有信息量的特征(特征选择)​,并利用你对问题的了解,开发可能有用的新特征。选择正确的架构预设。你要使用什么类型的模型架构?密集连接网络、卷积神经网络、循环神经网络还是Transformer?深度学习是不是完成这个任务的好方法,还是说应该使用其他方法?选择足够好的训练配置。你应该使用什么损失函数?批量大小和学习率分别是多少?选择正确的损失函数通常无法直接对成功衡量指标进行优化。有时难以将指标转化为损失函数,因为损失函数需要在只有小批量数据时就是可计算的(理想情况下,只有一个数据点时,损失函数应该也是可计算的)​,而且还必须是可微的(否则无法用反向传播来训练神经网络)​。例如,常用的分类指标ROC AUC就不能被直接优化。因此在分类任务中,常见的做法是优化ROC AUC的替代指标,比如交叉熵。一般可以认为,交叉熵越小,ROC AUC就越大。

对于一些常见的问题类型,可以帮你选择最后一层激活函数和损失函数。

在这里插入图片描述
对于大多数问题,你可以利用已有的模板。你不是第一个尝试构建垃圾信息检测器、音乐推荐引擎或图像分类器的人。一定要调研先前的技术,以确定最有可能在你的任务上表现良好的特征工程方法和模型架构。请注意,模型不一定总是能够获得统计功效。如果你尝试了多种合理架构之后,仍然无法超越简单基准,那么问题的答案可能并不包含在输入数据中。请记住你所做的两个假设。假设可以根据输入对输出进行预测。假设现有数据包含足够多的信息,足以学习输入和输出之间的关系。这些假设可能是错的,这时你必须重新从头思考解决问题的思路。

http://www.xdnf.cn/news/614.html

相关文章:

  • 认知升级:把握人工智能教育化转型的历史机遇
  • xss学习3之服务端session
  • 2025.4.20总结
  • 【Bluedroid】蓝牙 HID 设备信息加载与注册机制及配置缓存系统源码解析
  • ReentrantReadWriteLock读写锁
  • Nacos配置中心客户端处理服务端配置信息源码解析
  • 透视部分国产碳化硅(SiC)MOSFET栅氧可靠性报告造假乱象
  • ClickHouse核心架构设计
  • 【中间件】redis使用
  • Gen - CDPT举例说明:动态上下文前缀(输入先和标签结合,输出结果会更贴近标签内容)
  • 大数据可能出现的bug之flume
  • Matlab 汽车行驶速度PID控制系统仿真
  • GIS开发笔记(9)结合osg及osgEarth实现三维球经纬网格绘制及显隐
  • 利用 HEMT 和 PHEMT 改善无线通信电路中的增益、速度和噪声
  • 常见的页面报错
  • 热门算法面试题第19天|Leetcode39. 组合总和40.组合总和II131.分割回文串
  • windows docker desktop 无法访问容器端口映射
  • 大模型面经 | 介绍一下CLIP和BLIP
  • mac监控linux上mysql性能(Grafana+Prometheus+mysqld_exporter)
  • 每日一题——最小测试用例集覆盖问题
  • 通过爬虫方式实现头条号发布视频(2025年4月)
  • 2025 UCSCCTF Pwn-wp(含附件)
  • Java链表反转方法详解
  • 2. 什么是最普通的自动化“裸奔状态”?
  • 扣子智能体1:创建Agent与写好提示词
  • 深入理解Linux中的线程控制:多线程编程的实战技巧
  • 【失败总结】Win10系统安装docker
  • C++ MySQL数据库访问工具类设计与操作流程详解
  • 实现AWS Data Pipeline安全地请求企业内部API返回数据
  • 学习笔记二十——Rust trait