【学习笔记】《Python深度学习》第四章:机器学习基础

news2025/3/1 18:37:30

文章目录

  • 1 机器学习的四个分支
    • 1.1 监督学习
    • 1.2 无监督学习
    • 1.3 自监督学习
    • 1.4 强化学习
  • 2 评估机器学习模型
    • 2.1 训练集、验证集和测试集
    • 2.2 注意事项
  • 3 数据预处理、特征工程和特征学习
    • 3.1 神经网络的数据预处理
    • 3.2 特征工程
    • 4 过拟合与欠拟合
    • 4.1 减小网络大小
    • 4.2 添加权重正则化
    • 4.3 添加dropout正则化
  • 5 机器学习的通用工作流程
    • 5.1 定义问题,收集数据集
    • 5.2 选择衡量成功的指标
    • 5.3 确定评估方法
    • 5.4 准备数据
    • 5.5 开发比基准更好的模型
    • 5.6 扩大模型规模:开发过拟合的模型
    • 5.7 模型正则化与调节超参数

1 机器学习的四个分支

1.1 监督学习

1.定义

给定一组样本(通常由人工标注),它可以学会将输入数据映射到已知目标(标注)。

2.除了分类和回归外,监督学习的其他变体

  • 序列生成,给定一张图像,预测描述图像的文字;
  • 语法树预测,给定一个句子,预测其分解生成的语法树;
  • 目标检测,给定一张图像,在图中特定目标的周围画一个边界框;
  • 图像分割,给定一张图像,在特定物体上画一个像素级的mask;

1.2 无监督学习

1.定义

指在没有目标的情况下,寻找输入数据的变换形式。

2.实例

  • 降维
  • 聚类

1.3 自监督学习

1.定义

没有人工标注的标签的监督学习,但标签仍然存在,它们是从输入数据中生成的,通常使用启发式算法生成。

2.实例

  • 自编码器,其生成的目标就是未经修改的输入;
  • 给定视频中过去的帧来预测下一帧,这也属于时序监督学习,用未来的输入数据作为监督。

1.4 强化学习

1.定义

智能体接收有关环境的信息,并学会选择使得某种奖励最大化的行动。

2 评估机器学习模型

2.1 训练集、验证集和测试集

1.三种经典的评估方法

(1)简单的留出验证

  • 方法:留出一定比例的数据作为测试集,在剩余的数据上训练和验证模型,然后在测试集上评估模型。
  • 缺点:如果可用的数据太少,那么验证集和测试集包含的样本就很少,无法在统计学上代表数据。
    在这里插入图片描述
num_validation_samples = 10000

np.random.shuffle(data) # 打乱数据

validation_data = data[:num_validation_samples] # 定义验证集
data = data[num_validation_samples:]

training_data = data[:] # 定义训练集

# 在训练数据上训练模型,并在验证数据上评估模型
model = get_model()
model.train(training_data)
validation_score = model.evaluate(validation_data)

# 调节模型、重新训练、评估,然后再次调节
# 一旦调节好超参数,通常就在所有非测试数据上从头训练最终模型
model = get_model()
model.train(np.concatenate([training_data, validation_data]))
test_score = model.evaluate(test_data)

(2)K折验证

  • 方法:将数据划分为大小相同的K个分区,对于每个分区i,在剩余的K-1个分区上训练模型,然后在分区i上评估模型,最终分数等于K个分数的平均值。
  • 优点:适用于模型性能变化很大的情况。

在这里插入图片描述

k = 4
num_validation_samples = len(data) // 4

np.random.shuffle(data)

validation_scores = []
for fold in range(k):
    # 选择验证数据分区
    validation_data = data[num_validation_samples * fold :
                           num_validation_samples * (fold + 1)]
    # 使用剩余数据作为训练数据
    training_data = data[: num_validation_samples * fold] +
                    data[num_validation_samples * (fold + 1) :]
        
    # 创建一个全新模型
    model = get_model()
    model.train(training_data)
    validation_score = model.evaluate(validation_data)
    validation_scores.append(validation_score)

# 最终验证分数:K折验证分数的平均值
validation_score = np.average(validation_scores)

# 在所有非测试数据上训练最终模型
model = get_model()
model.train(data)
test_score = model.evaluate(test_data)

(3)带有打乱数据的重复K折验证

  • 方法:多次使用K折验证,在每次将数据划分为K个分区之前都先将数据打乱,最终分数是每次K折验证分数的平均值。这种方法需要训练和评估P * K个模型(P是重复次数)。
  • 优点:适用于可用数据较少,但又需要尽可能精确地评估模型。
  • 缺点:计算代价很大。

2.2 注意事项

  • 数据代表性。例如,需要对数字图像进行分类,而图像样本是按类别分类的,此时在将数据划分为训练集和测试集之前,通常应该打乱数据
  • 时间箭头。如果想要根据过去预测未来,那么在划分数据前不应该打乱数据,要始终确保测试集中所有数据的时间晚于训练集数据
  • 数据冗余。确保训练集和验证集之间没有交集

3 数据预处理、特征工程和特征学习

3.1 神经网络的数据预处理

1.向量化

神经网络的所有输入和目标都必须是浮点数张量(特定情况下可以是整数张量)。无论处理什么数据,都必须先将其转换为张量,这一步骤叫做数据向量化

2.值标准化

(1)输入数据应该具有以下特征

  • 取值较小,大部分值应该在0~1范围内;
  • 同质性,所有特征的取值都应该在大致相同的范围内。

(2)标准化方法
将每个特征分别标准化,使其平均值为0、标准差为1。

x -= x.mean(axis=0)
x /= x.std(axis=0)

3.处理缺失值

一般而言,对于神经网络,将缺失值设为0是安全的。

如果测试数据中存在缺失值,而网络是在没有缺失值的数据上训练的,那么网络不可能学会忽略缺失值。在这种情况下,应该人为生成一些有缺失项的训练样本:多次复制一些训练样本,然后删除测试数据中可能缺失的某些特征。

3.2 特征工程

定义:指在将数据输入模型之前,利用你自己关于数据和机器学习算法的知识对数据进行硬编码的转换,以改善模型效果。其实就是用更简单的方式表述问题,从而进行简化。

4 过拟合与欠拟合

为了避免过拟合,最好的解决方法是获取更多的训练数据

但是如果没办法获取更多数据,次优的解决方法是调节模型允许存储的信息量,或对模型允许存储的信息加以约束。这种方法叫做正则化,接下来介绍几种常见的正则化方法。

4.1 减小网络大小

1.定义

减少模型大小,即减少模型中可学习参数的个数(由层数和每层的单元个数决定),这也叫做模型容量

2.合理性

如果网络的记忆资源有限,就很难学会输入数据和目标之间的映射,因此,为了让损失最小化,网络必须学会对目标具有很强预测能力的压缩表示

3.一般的工作流程

验证集上评估一系列不同的网络架构,开始选择相对较少的层和参数,然后逐渐增加层的大小或增加新层,直到这种增加对验证损失的影响变得很小。

4.2 添加权重正则化

1.定义

强制让模型权重只能取较小的值,从而限制模型的复杂度,使得权重值的分布更加规则。

2.实现方法

向网络损失函数中添加与较大权重值相关的成本,成本有两种形式:

  • L1正则化,添加的成本与权重系数的绝对值(权重的L1范数(norm))成正比
  • L2正则化,添加的成本与权重系数的平方(权重的L2范数)成正比,L2正则化也叫作权重衰减

3.在Keras中,添加权重正则化的方法是向层传递权重正则化实例作为关键字参数。

l2(0.001) 的意思是该层权重矩阵的每个系数都会使网络总损失增加0.001 * weight_coefficient_value。

from keras import models
from keras import layers
from keras import regularizers

model = models.Sequential()
model.add(layers.Dense(16, kenel_regularizer=regularizers.l2(0.001), 
                       activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, kenel_regularizer=regularizers.l2(0.001), 
                       activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

另外,还可以使用以下这些权重正则化来代替L2正则化。

# L1正则化
regularizers.l1(0.001)

# 同时做L1和L2正则化
regularizers.l1_l2(l1=0.001, l2=0.001)

4.3 添加dropout正则化

1.定义

对某一层使用dropout,就是在训练过程中随机将该层的一些输出特征舍弃(设置为0)。

drop比率是被设为0的特征所占的比例,通常在0.2~0.5之间。

测试时没有单元被舍弃,而该层的输出值需要按dropout比率缩小,因为这时比训练时有更多的单元被激活,需要加以平衡。

2.实例

假设一个包含某层输出的Numpy矩阵layer_output,其形状为(batch_size, features)。
(1)训练时,随机将矩阵中的一部分值设为0:

# 训练时,舍弃50%的输出单元
layer_output *= np.random.randint(0, high=2, size=layer_output.shape)

(2)测试时,将输出按照dropout比率缩小,在这里乘以0.5,因为前面舍弃了50%的单元:

layer_output *= 0.5

为了实现上述过程,还可以让两个运算在训练时进行,而测试时保持输出不变:

layer_output *= np.random.randint(0, high=2, size=layer_output.shape)
layer_output /= 0.5 # 在训练时应该是成比例放大

3.在Keras中,可以通过Dropout层向网络中引入dropout,它将被应用于前面一层的输出。

model.add(layers.Dropout(0.5))

5 机器学习的通用工作流程

5.1 定义问题,收集数据集

  • 假设输出是可以根据输入进行预测的;
  • 假设可用数据包含足够多的信息,足以学习输入和输出之间的关系。

5.2 选择衡量成功的指标

衡量成功的指标应该直接与目标保持一致。

  • 对于平衡分类问题,使用精度和接收者操作特征曲线下面积(ROC AUC)
  • 对于不平衡分类问题,使用准确率和召回率
  • 对于排序问题或多标签分类,使用平均准确率均值

5.3 确定评估方法

  • 留出验证集,适用于数据量很大的情况;
  • K折交叉验证,适用于留出验证的样本量太少的情况;
  • 重复的K折交叉验证,适用于可用数据量很少,同时模型评估又需要非常准确的情况。

5.4 准备数据

5.5 开发比基准更好的模型

1.目标

获得统计功效,即开发一个小型模型,能够打败纯随机的基准。

2.构建第一个工作模型的三个关键参数

  • 最后一层的激活,对网络输出进行有效的限制;
  • 损失函数,有时候难以将指标转化为损失函数,此时可以选择替代指标。
  • 优化配置

5.6 扩大模型规模:开发过拟合的模型

在得到具有统计功效的模型后,需要开发一个过拟合的模型,始终监控训练损失和验证损失,以及所关心的指标的训练值和验证值。一旦模型在验证数据上的性能开始下降,那么就出现了过拟合。

下一阶段将开始正则化调节模型,以便尽可能地接近理想模型。

5.7 模型正则化与调节超参数

在这一步骤中,将要不断调节模型、训练、在验证数据上评估,再次调节模型,然后重复这一过程,直到模型达到最佳性能。

但是,如果多次使用验证过程来反馈调节模型, 会降低验证过程的可靠性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

postgresql安装配置和基本操作

1.安装 linux上安装 最好是centos7.6或者7.8, 参考官网 PGSQL的官方地址:PostgreSQL: The worlds most advanced open source database PGSQL的国内社区:PostgreSQL中文社区:: 世界上功能最强大的开源数据库... 点击download PostgreSQ…

【Struts2】二_Struts2参数映射、核心配置文件struts.xml中的标签与属性的使用

文章目录Struts2一、参数映射:▶传递基本数据类型:▶传递对象二、核心配置文件struts.xml:2.1、constant标签2.2、package标签2.3、action标签三、Action配置:3.1、Action简介:3.2、继承ActionSupport类:3.…

JAVA初阶——继承和多态

目录 一、继承 1、定义: 2、用法: 3、使用从父类继承的成员 (1)、子类使用从父类继承的成员变量 (2)、子类使用从父类继承的成员方法 4、super (1)、定义: 5、子…

ID3算法

目录 ID3算法 例子 ID算法总结 ID3算法 ID3算法是在每个结点处选取能获得最高信息增益的分支属性进行分裂 在每个决策结点处划分分支、选取分支属性的目的是将整个决策树的样本纯度提升 衡量样本集合纯度的指标则是熵; 举例来说,如果有一个大小为10的…

被裁后,狂刷607页JUC源码分析笔记,立马拿蚂蚁offer

前言 可能大家最近,在公众号,或者各大自媒体平台,都能够刷到,因为疫情美国经济面临结构性衰退,美联储疯狂印钞导致世界性经济波动,导致国际环境不是很好,也间接影响到了中国,中国也…

跟艾文学编程《Python基础》(2)Python 容器

作者: 艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂。 邮箱: 1121025745qq.com 博客:https://wenjie.blog.csdn.net/ 内容:跟艾文学编程《Pyt…

JAVA微服务场景下分布式日志收集排查问题实战

问题产生的根由?不同服务的日志存在哪里?我们怎么去排查线上问题? 问题场景:我们部署的java服务可能有几十个,不同的项目里面他是看不到别的服务的日志,只有服务的返回msg消息,相比传统的单体服…

计算机体系结构:1.1.系统加速比计算例题

文章目录题目内容题目分析题目求解题目内容 假设在某程序的执行过程中,浮点操作时间占整个执行时间的10%,现希望对浮点 操作加速 。 (1)设对浮点操作的加速比为Sf,请推导出程序总的加速比S和Sf之间的关系表达式&#…

IoU的计算实现详解(基于Python)

文章目录1. 交并比(IoU)2.原理3.代码实现1. 交并比(IoU) 具体来说,它是两边界框相交部分面积与相并部分面积之比,如下所示: 也就是两个框的交集和两个框的并集之比。 2.原理 这里详细解释一…

如何安装与配置Node.js

Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型, 让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等…

使用轻量应用服务器搭配宝塔面板搭建可道云kodbox私有云网盘的方法教程

你是否有过网盘下载速度只有十几KB,时不时出现网盘的文件被删除的问题,不如自己搭建一个云网盘吧,只需要一云服务器,即可搭建一个跟某度云一样的云盘。可以自由下载,不限制网速,随时都可上传下载。这篇文章…

nginx+redis+jvm三级缓存设计与落地实现

由于涉及到个人隐私,使用的是阿里云平台,所以下面的IP地址和密码我都做了修改。不是真实的地址。此模拟秒杀商品列表信息缓存案例实现的技术解决方案。 远程环境1版本操作系统ubuntu22.04openresty1.21.4.1jdkOracle JDK17IP192.168.1.1远程环境2版本redis7.0.5Springboot2.5…

149. SAP UI5 Table 控件数据进行 Excel 导出时如何进行格式控制

文章目录 字符串类型的显示控制数值类型(Number)的值显示控制日期和时间显示的格式控制布尔值的显示控制BigNumber 和百分比数值的显示总结本教程的前一步骤,我们成功的将 sap.m.Table 控件里显示的数据导出到了本地 Excel 文件中。 下图是使用 sap.m.Table 显示的表格页面:…

菜小白聊聊开源和开源协议

最近想入linux的深坑,于是开启了马哥sre课程的探险之旅。在了解到Linux是一款自由和开放源码的类UNIX操作系统的历史时,深深被开源精神所折服。也强烈感受到了开源精神的伟大。也正是因为有了开放源码的精神,才有了国产百花齐放的android系统…

【JUC源码专题】AQS 源码分析(JDK8)

文章目录同步队列同步队列结点 Node同步队列状态 state获取互斥锁acquire 方法tryAcquire 方法获取互斥锁addWaiter 方法enq() 入队acquireQueued()setHead 方法设置头节点shouldParkAfterFailedAcquire()parkAndCheckInterrupt()cancelAcquire 发生异常,取消线程获…

第七章第一节:顺序查找和折半查找

文章目录教程1. 查找的基本概念1.1 对查找表的常见操作1.2 查找算法的评价指标2. 顺序查找2.1 顺序查找的算法思想2.2. 顺序查找的实现2.3 查找效率分析2.4 顺序查找的优化(对有序表)2.5 用查找判定树分析ASL2.6 顺序查找的优化(被查概率不相…

在centos中注册gitlab runner

注册runner 有几种不同的方式,这里介绍的是在centos7中使用 rpm包来安装 按照gitlab runner的官网链接里面的介绍: gitlab runner 链接 下载 官网描述: ## Replace ${arch} with any of the supported architectures, e.g. amd64, arm, ar…

python 空间滤波

均值滤波器 空域变换包含灰度变换和空间滤波 灰度变换是通过点对点的映射进行图像增强,是一种点运算 空间滤波是基于邻域的一种运算,即图像像素的灰度值不仅和当前点有关,还和这个点周围邻域像素点的灰度值有关。所以空间滤波其实是一种加…

如何管理oralce口令文件和参数文件

口令文件 口令文件审核 Step 1: 使用root账号将 oracle dba的权限移除 [rootoracle-db-19c ~]# su - oracle [oracleoracle-db-19c ~]$ [oracleoracle-db-19c ~]$ id oracle uid1501(oracle) gid1501(oinstall) groups1501(oinstall),1502(dba),1503(oper),1504(backupdba)…

浅析linux 内核 高精度定时器(hrtimer)实现机制(一)

1 hrtimer 概述 在Linux内核中已经存在了一个管理定时器的通用框架。不过它也有很多不足,最大的问题是其精度不是很高。哪怕底层的定时事件设备精度再高,定时器层的分辨率只能达到Tick级别,按照内核配置选项的不同,在100Hz到1000…