Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python机器学习基础

python机器学习基础

作者头像
皮大大
发布于 2023-08-23 08:59:17
发布于 2023-08-23 08:59:17
20200
代码可运行
举报
运行总次数:0
代码可运行

Python深度学习-机器学习基础

本文的主要内容是介绍机器学习的基础概念,包含:

  1. 除了分类和回归之外的其他机器学习形式
  2. 评估机器学习模型的规范流程
  3. 深度学习准备数据
  4. 特征工程
  5. 解决过拟合
  6. 处理机器学习问题的通用流程

机器学习4个分支

监督学习supervised learning

最常见的机器学习类型。给定一组样本(通常是人工标准),它可以学会将数据映射到已知目标(也叫标注)。监督学习广泛应用到光学字符识别、语音识别、图像分类和语言翻译。

监督学习除了回归和分类,还有其他变体:

  1. 序列生成
  2. 语法树预测
  3. 目标检测
  4. 图像分割

无监督学习

无监督学习是指在没有目标的情况下寻找输入数据的有趣变换,目的是在于数据可视化、数据压缩、数据去噪或者更好地理解数据中的相关性

主要是降维聚类

自监督学习

自监督学习是监督学习的特例。自监督学习可以看做是没有人工标注的标签的监督学习。

标签是仍然存在的,但是他们是从输入数据中生成的,通常是使用启发式算法生成的。

一个常见的例子就是:自编码器autoencoder,其目标就是未经修改的输入。

给定视频中过去的帧来预测下一帧,或者给定文本中前面的词语来预测下一个次,都是属于自监督学习的例子(这两个例子是时序监督学习的例子)

强化学习

强化学习是因为谷歌的DeepMind公司将其成功应用于学习完Atari游戏(还有围棋阿尔法狗)中,才开始被广泛关注。

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

分类和回归术语

总结一下回归和分类中常出现的术语:

  1. 样本、输入:进入模型的数据点
  2. 预测、输出:从模型出来的结果
  3. 目标:真实值。对于外部数据源,理想状态下,模型能够预测出真实值
  4. 预测误差、损失值:预测值和真实值之间的距离
  5. 类别:分类问题中供选择的一组标签。比如对猫狗图像进行分类时,猫和狗就是标签
  6. 标签:分类问题中类别标注的具体例子。比如1234号图像被标注为包含类别狗,那么“狗”就是1234号图像的标签
  7. 真实值和标注:数据集的所有目标。通常是人工收集
  8. 二分类:一种分类任务,每个输入样本应该被划分到两个互斥的类别
  9. 多分类:一种分类任务,每个输入样本应该被划分到多个不同的类别中,比如手写数字分类
  10. 多标签分类:一种分类任务,每个输入样本都可以分配多个标签。比如一幅图像中既有猫又有狗,那么应该同时标注猫标签和狗标签。每幅图像的标签个数通常是可变的。
  11. 标量回归:目标是连续标量值的任务。比如预测房价
  12. 向量回归:目标是一组连续值(比如一个连续变量)的任务。如果对多个值进行回归,就是向量回归
  13. 小批量或批量:模型同时处理的一小部分样本,通常是8-128.样本数通常是2的幂,方便CPU上的内存分配。训练时,小批量用来为模型权重计算一次梯度下降更新。

评估机器学习的模型

机器学习的目的是得到可以泛化的模型:在前所未见的数据集上也能够表现的很好,而过拟合则是核心难点。

3大数据集

评估模型的重点是将数据划分为:训练集、验证集和测试集

  • 训练集:训练模型
  • 验证集:评估模型
  • 测试集:最后一次的测试

模型一定不能读取与测试集任何相关的信息,即使是间接读取也不行。3大经典评估方法:

  1. 简单的留出验证
  2. K折验证
  3. 带有打乱数据的重复K折验证

3大评估方法

简单的留出验证(hold-out validation)

留出一定的比例的数据作为测试集,在剩余的数据集上训练数据,然后在测试集上评估模型。

为了防止信息泄露,我们不能基于测试集来调节模型,必须保留一个验证集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 代码实现

num_validation_samples = 10000

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

validation_data = data[:num_validation_samples]  # 验证集

data = data[num_validation_samples:]
train_data = data   # 训练集

model = get_model()
model.train(train_data)  # 训练集训练模型

validation_score = model.evaluate(validation_data)  # 验证集上评估模型

# 调节模型、重新训练、评估,然后再次调节,最后在测试集上评估
model = get_model()
# 将训练集和验证合并起来进行重新训练
model.train(np.concatenate([train_data,validation_data]))
# 测试集上进行评估
test_score = model.evaluate(test_data)

一个缺点:如果可用的数据很少,可能验证集和测试集包含的样本很少,从而无法从统计学上代表数据。

因此就有了K折验证和重复的K折验证来解决这个问题。

K折验证

使用K折交叉验证的基本原来:

  • 将数据划分为K个分区,通常是4或者5
  • 实例化K个模型,将模型在K-1个分区上训练,剩下的一个区上进行评估
  • 模型的验证分数等于K个验证分数的均值。

如何K折交叉验证:以3折交叉验证为例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 代码实现

k = 4

num_validation_samples = len(data) // k
# 随机打乱数据
np.random.shuffle(data)

validation_scores = []

for fold in range(k):
    # 验证集
    validation_data = data[fold * num_validation_samples: (fold + 1) * num_validation_samples]
    # 训练集
    train_data = data[: fold * num_validation_samples] + data[(fold + 1) * num_validation_samples:]

    model = get_model()
    model.train(train_data)

    validation_score = model.evaluate(validation_data)  # 每个验证集上的得分
    validation_scores.append(validation_score)  # 放到列表中

validation_score = np.average(validation_scores)  # K折验证的均值

model = get_model()
model.train(data)  # data = train_data + validation_data  所有非测试集上进行训练
test_score = model.evaluate(test_data)  #  测试集上进行评估
带有打乱数据的K折验证

如果数据很少,又想精确地评估模型,可以使用打乱数据的K折交叉验证:iterated K-fold validation with shuffling。

具体做法:在每次将数据划分为k个分区之前,先将数据打乱,最终分数是每个K折验证分数的均值

注意:这个做法一共要训练和评估P*K个模型,P是重复次数,计算代价很大。

评估模型的注意事项

  1. 数据代表性:随机打乱数据
  2. 时间箭头:如果想根据过去预测未来,即针对所谓的时间序列的数据,则不应该随机打乱数据,这样会造成时间泄露
  3. 数据冗余:确保训练集和验证集之间没有交集

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

预处理

预处理的主要步骤:

  • 向量化
  • 标准化
  • 处理缺失值
  • 特征提取
向量化

神经网络的所有输入和输出都必须是浮点张量。都必须转成张量,这一步叫做向量化data vectorization

值标准化

数据输入网络前,对每个特征分别做标准化,使其均值为0,标准差为1。

输入神经网络的数据应该具有以下特征:

  • 取值较小:大部分取值在0-1范围内
  • 同质性(homogenous):所有特征的取值范围都在大致相同的范围内

Numpy实现的标准化过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X -= X.mean(axis=0)  # 假定X是个二维矩阵
X -= X.std(axis=0)
缺失值处理

在神经网络中,一般将缺失值用0填充。

特征工程

根据已有的知识对数据进行编码的转换,以改善模型的效果。

特征工程的本质:用更简单的方式表述问题,从而使得问题变得更容易。

现在大部分的深度学习是不需要特征工程的,因为神经网络能够从原始数据中自动提取有用的特征。

解决过拟合

什么是过拟合和欠拟合

机器学习的根本问题是优化和泛化的对立。

优化:调节模型以在训练集上得到最佳性能;泛化:训练好的模型在未知数据上的性能好坏。

  • 过拟合overfit:模型在训练集上表现良好,但是在测试集上表现不好。过拟合存在所有的机器学习问题中。
  • 欠拟合underfit:训练数据上的损失越小,测试数据上的数据损失也越小。

过拟合和欠拟合的产生

1、欠拟合问题,根本的原因是特征维度过少,导致拟合的函数无法满足训练集,误差较大。

解决方法:欠拟合问题可以通过增加特征维度来解决。

2、过拟合问题,根本的原因则是特征维度过多,导致拟合的函数完美的经过训练集,但是对新数据的预测结果则较差。解决过拟合问题,则有2个途径:

  • 减少特征维度;可以人工选择保留的特征,或者模型选择算法
  • 正则化;保留所有的特征,通过降低参数θ的值,来影响模型

3招解决过拟合

减小网络大小

防止过拟合最简单的方案:减小模型大小,即减少模型中学习参数的个数(层数和每层的单元个数决定)。

容量:在深度学习中,模型中可学习参数的个数称之为容量。

使用的模型必须具有足够多的参数,以防止过拟合,即模型应该避免记忆资源不足。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 电影评论分类的原网络

import tensorflow as tf  # add
import keras as models
import keras as layers

model = models.Sequential()
model.add(tf.keras.Dense(16, activation="relu",input_shape=(10000, )))
model.add(tf.keras.Dense(16, activation="relu"))
model.add(tf.keras.Dense(1, activation="sigmoid"))

用一个更小的网络来替代:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = models.Sequential()
model.add(tf.keras.Dense(4, activation="relu",input_shape=(10000, )))
model.add(tf.keras.Dense(4, activation="relu"))
model.add(tf.keras.Dense(1, activation="sigmoid"))

我们发现:更小的网络开始过拟合的时间要晚于之前的网络;而且小网络的性能变差的速度也更慢。

换成更大的模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = models.Sequential()
model.add(tf.keras.Dense(512, activation="relu",input_shape=(10000, )))
model.add(tf.keras.Dense(512, activation="relu"))
model.add(tf.keras.Dense(1, activation="sigmoid"))

网络的容量越大,拟合训练数据的速度也越快,更容易过拟合。

添加权重正则化(最佳)

奥卡姆剃刀(Occams razor) 原理:如果一件事有两种解释,那么最可能正确的就是最简单的那个,即假设更少的那个。

权重正则化:强制让模型权重只能取较小的值,从而限制模型的复杂度,使得权重的分布更加规则regular。其实现方法:向网络损失函数中添加与较大权重值相关的成本。

具体两种方式:

  • L1正则化:权重系数的绝对值;L1范数
  • L2正则化:权重系数的平方;L2范数

神经网络中的L2正则化也叫做权重衰减weight decay。

Keras中添加权重正则化的方法是向层传递:权重正则化实例 作为关键字参数,以添加L2权重正则化为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from keras import regularizers

model = models.Sequential()
model.add(tf.keras.layers.Dense(16,kernel_regularizer=regularizers.l2(0.001),
                               activation="relu",
                               input_shape=(10000,)))
model.add(tf.keras.layers.Dense(16,kernel_regularizer=regularizers.l2(0.001),
                               activation="relu"))
model.add(tf.keras.layers.Dense(1,activation="sigmoid"))

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

由于这个惩罚项只在训练时添加,所以网络的训练损失会比测试损失大的多

添加L2正则项前后对比:

其他权重正则化的添加方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from keras import regularizers

regularizers.l1(0.001)  # l1正则化
regularizers.l1_l2(l1=0.001, l2=0.001)  # 同时添加
添加dropout正则化

dropout是神经网络中最有效也是最常用的正则化方式之一,做法:在训练过程中随机将该层的一些输入特征舍弃(设置为0)

dropout的比例就是被设置为0的特征所占的比例,通常在0.2-0.5之间。添加dropout的具体过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.add(tf.keras.layers.Dropout(0.5))

要应用在前面一层的输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = models.Sequential()
model.add(tf.keras.layers.Dense(16,activation="relu",input_shape=(10000,)))
model.add(tf.keras.layers.Dropout(0.5))  # 添加
model.add(tf.keras.layers.Dense(16,activation="relu"))
model.add(tf.keras.layers.Dropout(0.5))  # 添加
model.add(tf.keras.layers.Dense(1,activation="sigmoid"))

总结

防止神经网络过拟合的方法:

  1. 获取更多的训练数据
  2. 减小网络容量
  3. 添加权重正则化
  4. 添加dropout

机器学习的通用工作流程

  1. 问题定义、收集数据
  2. 选择衡量成功的标准
    • 平衡分类问题:精度和接受者操作特征曲线下面积-ROC/AUC
    • 分类不平衡问题:准确率和召回率
  3. 确定评估方法
    • 留出验证集
    • K折交叉验证
    • 重复的K折交叉验证
  4. 准备数据
    • 数据转成张量
    • 取值缩放到0-1之间
    • 数据标准化
    • 特征工程
  5. 开发比基准更好的模型
  6. 扩发模型规模:开发过拟合的模型

机器学习中无处不在的对立是优化和泛化的对立,理想的模型是刚好在欠拟合和过拟合的边界上,在容量不足和容量过大的边界上。

为了弄清楚我们需要多大的模型,就必须开发一个过拟合的模型:

  • 添加更多的层
  • 让每一层变的更大
  • 训练更多的轮次

在训练的过程中始终监控训练损失和验证损失,以及我们关心的指标。

  1. 模型正则化和调节参数
  • 添加dropout
  • 尝试增加或者减少层数
  • 添加L1或者L2正则化项
  • 尝试不同的超参数
  • 反复做特征工程
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-4-3,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python深度学习精华笔记5:机器学习基础
监督学习supervised learning:机器学习中最常见的类型,它可以学会将输入数据映射到已知目标annotation。比如回归问题和分类问题(二分类、多分类问题等)是最常见的监督学习的例子。
皮大大
2023/09/09
5680
[Deep-Learning-with-Python]机器学习基础
二分类、多分类以及回归问题都属于监督学习--目标是学习训练输入和对应标签之间的关系。 监督学习只是机器学习的冰山一角。机器学习主要分为4类:监督学习、非监督学习、半监督学习和强化学习。
用户1631856
2018/08/01
3400
[Deep-Learning-with-Python]机器学习基础
Deep learning with Python 学习笔记(1)
Python 的 Keras 库来学习手写数字分类,将手写数字的灰度图像(28 像素 ×28 像素)划分到 10 个类别 中(0~9) 神经网络的核心组件是层(layer),它是一种数据处理模块,它从输入数据中提取表示,紧接着的一个例子中,将含有两个Dense 层,它们是密集连接(也叫全连接)的神经层,最后是一个10路的softmax层,它将返回一个由 10 个概率值(总和为 1)组成的数组。每个概率值表示当前数字图像属于 10 个数字类别中某一个的概率 损失函数(loss function):网络如何衡量在训练数据上的性能,即网络如何朝着正确的方向前进 优化器(optimizer):基于训练数据和损失函数来更新网络的机制
范中豪
2019/09/10
1.5K0
Deep learning with Python 学习笔记(1)
Python 深度学习第二版(GPT 重译)(二)
本章旨在帮助您开始使用神经网络解决实际问题。您将巩固从第二章和第三章中获得的知识,并将所学应用于三个新任务,涵盖神经网络的三种最常见用例 — 二元分类、多类分类和标量回归:
ApacheCN_飞龙
2024/03/21
3500
Python 深度学习第二版(GPT 重译)(二)
机器学习基础知识
特征工程的本质:用更简单的方法表述问题,使问题变得容易,需要深入理解问题的本质。可能的话加一点遐想。
机器视觉CV
2019/07/15
6530
机器学习基础知识
从零开始学keras(五)
【导读】Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。本系列将教你如何从零开始学Keras,从搭建神经网络到项目实战,手把手教你精通Keras。相关内容参考《Python深度学习》这本书。
墨明棋妙27
2022/08/24
3160
从零开始学keras(五)
LSTM 08:超详细LSTM调参指南
LSTM 01:理解LSTM网络及训练方法 LSTM 02:如何为LSTM准备数据 LSTM 03:如何使用Keras编写LSTM LSTM 04:4种序列预测模型及Keras实现 LSTM 05:Keras实现多层LSTM进行序列预测 LSTM 06:Keras实现CNN-LSTM模型 LSTM 07:Keras实现Encoder-Decoder LSTM LSTM 08:超详细LSTM调参指南
全栈程序员站长
2022/09/09
7.3K0
LSTM 08:超详细LSTM调参指南
深度学习进阶:神经网络优化技术全解析
神经网络是深度学习的核心,但训练一个高效、稳定的模型并非易事。优化技术直接影响模型的收敛速度、性能和泛化能力。本文将深入探讨神经网络优化中的关键方法,包括梯度下降变种、正则化、学习率调度等,并结合Python代码展示其实战效果。如果你已经掌握神经网络基础,想进一步提升模型性能,这篇教程将是你的进阶指南。欢迎在评论区分享你的优化经验!
DevKevin
2025/03/09
1630
基于Keras/Python的深度学习模型Dropout正则项
dropout技术是神经网络和深度学习模型的一种简单而有效的正则化方式。 本文将向你介绍dropout正则化技术,并且教你如何在Keras中用Python将其应用于你的模型。 读完本文之后,你将了解: dropout正则化的原理 如何在输入层使用dropout 如何在隐藏层使用dropout 如何针对具体问题对dropout调优 神经网络的Dropout正则化 Dropout是Srivastava等人在2014年的一篇论文中提出的一种针对神经网络模型的正则化方法 Dropou
CSDN技术头条
2018/02/12
1K0
Python 深度学习第二版(GPT 重译)(三)
您现在对 Keras 有了一些经验——您熟悉 Sequential 模型、Dense 层以及用于训练、评估和推断的内置 API——compile()、fit()、evaluate() 和 predict()。您甚至在第三章中学习了如何从 Layer 类继承以创建自定义层,以及如何使用 TensorFlow 的 GradientTape 实现逐步训练循环。
ApacheCN_飞龙
2024/03/21
3620
Python 深度学习第二版(GPT 重译)(三)
[Deep-Learning-with-Python]计算机视觉中的深度学习
卷积网络接收(image_height,image_width,image_channels)形状的张量作为输入(不包括batch size)。MNIST中,将图片转换成(28,28,1)形状,然后在第一层传递input_shape参数。 显示网络架构
用户1631856
2018/08/01
2.2K0
[Deep-Learning-with-Python]计算机视觉中的深度学习
深度学习实战-CNN猫狗识别
本文记录了第一个基于卷积神经网络在图像识别领域的应用:猫狗图像识别。主要内容包含:
皮大大
2023/08/23
7280
迁移学习全面指南:概念、应用、优势、挑战
【编者按】Springboard AI顾问、前Intel数据科学家Dipanjan (DJ) Sarkar全面介绍了迁移学习的概念、应用、优势、挑战,重点关注深度迁移学习。
zenRRan
2019/11/20
2.4K0
迁移学习全面指南:概念、应用、优势、挑战
一文深层解决模型过拟合
过拟合是指模型只过分地匹配特定训练数据集,以至于对训练集外数据无良好地拟合及预测。其本质原因是模型从训练数据中学习到了一些统计噪声,即这部分信息仅是局部数据的统计规律,该信息没有代表性,在训练集上虽然效果很好,但未知的数据集(测试集)并不适用。
算法进阶
2022/06/02
1.2K0
一文深层解决模型过拟合
从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革
本文旨在为读者提供一个全面的人工智能学习指南,涵盖从基础概念到高级技术的方方面面。我们将通过理论讲解、代码示例和应用场景分析,帮助读者深刻理解人工智能、机器学习、算法、深度学习和计算机视觉的基本原理和实际应用。
小李很执着
2024/08/20
4450
从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革
机器学习实战--对亚马逊森林卫星照片进行分类(2)
分类准确性通常适用于二进制分类任务,每个类中具有平衡数量的示例。在这种情况下,我们既不使用二进制或多类分类任务; 相反,它是一个多标签分类任务,标签数量不均衡,有些使用比其他标签更重要。因此,Kaggle比赛组织选择了F-beta指标,特别是F2得分。这是与F1分数(也称为F-measure)相关的度量。
PM小王
2019/07/02
8790
机器学习实战--对亚马逊森林卫星照片进行分类(2)
Deep learning with Python 学习笔记(9)
使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推力,之后你便再也无法控制其飞行轨迹或着陆点。如果想要避免不好的结果(并避免浪费纸飞机),更聪明的做法是不用纸飞机,而是用一架无人机,它可以感知其环境,将数据发回给操纵者,并且能够基于当前状态自主航行。下面要介绍的技术,可以让model.fit() 的调用从纸飞机变为智能的自主无人机,可以自我反省并动态地采取行动
范中豪
2019/09/10
6500
Deep learning with Python 学习笔记(9)
实际应用效果不佳?来看看提升深度神经网络泛化能力的核心技术(附代码)
神经网络是一种由神经元、层、权重和偏差组合而成的特殊机器学习模型,随着近些年深度学习的高速发展,神经网络已被广泛用于进行预测和商业决策并大放异彩。
ShowMeAI
2022/10/31
7250
实际应用效果不佳?来看看提升深度神经网络泛化能力的核心技术(附代码)
Deep learning with Python 学习笔记(2)
卷积神经网络接收形状为 (image_height, image_width, image_channels)的输入张量(不包括批量维度),宽度和高度两个维度的尺寸通常会随着网络加深而变小。通道数量由传入 Conv2D 层的第一个参数所控制
范中豪
2019/09/10
7100
Deep learning with Python 学习笔记(2)
【机器学习】干货!机器学习中 5 种必知必会的回归算法!
提到回归算法,我想很多人都会想起线性回归,因为它通俗易懂且非常简单。但是,线性回归由于其基本功能和有限的移动自由度,通常不适用于现实世界的数据。
黄博的机器学习圈子
2021/04/29
1.4K0
【机器学习】干货!机器学习中 5 种必知必会的回归算法!
推荐阅读
相关推荐
Python深度学习精华笔记5:机器学习基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验