《python深度学习》读书笔记(4) - 机器学习基础

本小节主要对前面3个小节的概念进行汇总,将机器学习的直觉固化转变为可靠的概念框架 。 这一步非常重要, 会影响你后面进行tensorflow开发时的固定调试技巧

过拟合 与 欠拟合

随着训练的进行,模型在验证数据上的性能开始提高,然后不可避免的在一段时间后 达到峰值。

如果数据的不确定性很大,或者包含罕见的特征,那么就特别容易出现 过拟合的现象。

如果机器学习模型在包含罕见特征的数据集上进行训练,也很容易出现过拟合。

如果你不确定特征究竟是有用的还是无关紧要的,那么常见的做法是在训练前进行特征选择。特征选择的常用方法是对每个特征计算有用性分数,只保留那些分数高于某个阈值的特征

例如前面的imdb的例子,我们就是限制出现频率最高的10000个单词,其他忽略

改进深度学习模型的最佳方法就是在更多的数据或更好的数据上训练模型

泛化

指训练好的模型在前所未见的数据上的性能 机器学习的目标是得到良好的泛化,但你无法控制他,只能让模型对训练数据进行拟合。 如果拟合的太好,就会出现过拟合,从而对泛化产生负面影响

为什么需要验证集

前面的例子中,我们获取到的数据 往往都是 训练集和测试集。但是通常我们会对 训练集再做一次拆分,拆成 训练集和 验证集。 有人会问,为什么需要验证集 不能直接用测试集?

因为我们训练出来的模型 需要在 数据上验证效果,如果直接在训练集上直接验证效果,然后通过效果来反向调优你的模型,那么最终的模型效果也是不可信的,因为此时训练集对模型产生了过拟合的效果,

所以大家一定要谨记,所有训练 都必须 分为训练集,验证集 和测试集。 测试集是不能用来验证模型效果然后去反向调优模型的。

留出验证

这个方案就是对训练集做拆分, 拆出一部分做验证集, 这里大家谨记 最好对数据进行打乱 也就是 np.random.shuffle(data)

如果训练集数据量很少,那么每次打乱以后 验证集上的效果 差别会特别大。 这种情况就要换一种方式

k折交叉验证

这种前面也用到过 ,就是把数据 分为不同的段,然后分别训练。 比如,将数据 分为 0 1 2 三块。

第一次训练 0块作验证集, 12 做训练集 第二次训练 1快 做验证集, 02 做训练集 。。。。。 以此类推

我们还可以在k折交叉验证上 加上打乱数据的一步,这样更加精准

模型评估的注意事项

  1. 将数据分为训练集和测试集之前,通常应该随机打乱数据
  2. 如果数据是带有时间的,比如股票和天气走势,那么要确保测试集中的所有数据晚于训练数据
  3. 数据冗余。要确保不会出现 某个数据同时存在于 训练集和验证集。

模型的三种常见问题

  1. 训练不开始 训练损失不随着时间的推移而减少
  2. 训练开始的狠话,但没有真正泛化,模型无法超越基于常识的基准
  3. 训练损失和验证损失 都随着时间的推移而减小,模型可以超越基准,但无法过拟合,似乎一直处于欠拟合的状态

请记住,对随机数据也可以拟合一个模型,即使这个问题毫无意义

训练不开始或者过早停止--调节关键的梯度下降参数

这种情况一般都是 优化器,模型权重初始值的分布,学习率或者批量大小。 这些参数都是相互依赖的。 保持其他参数不变,调节学习率和批量大小通常就足够了

  1. 降低或提高学习率,学习率过小,训练过于缓慢,过大则容易超出正常拟合的范围
  2. 增加批量大小

模型虽然能够训练的,但是无法泛化

主要原因如下:

  1. 输入数据没有足够的信息来预测目标
  2. 模型类型不适合解决当前问题

如果是后者 那么就要看看别人有没有解决过类似的问题了

无法出现过拟合的现象

理论上,任何情况下 都应该可以实现过拟合

出现这种问题的解决方案就是需要一个容量更大的模型

添加更多的层,和拥有更多参数的层,或者使用更适合当前问题的层类型

特征工程

将数据输入模型之前, 对数据进行编码的变换, 多数情况下,机器学习模型无法从完全随意的数据中进行学习,呈现给模型的数据应该便于模型进行学习

例如

提高泛化能力,降低过拟合

要想将神经网络的泛化能力最大化,有几条通用法则

  1. 获取更多更好的训练数据
  2. 找到更好的特征
  3. 缩减模型的容量
  4. 添加权重正则化(适用于较小的模型 )
  5. 添加dropput

其中4,5 两条,keras都有api可以直接调用。

模型开始过拟合以后,可以利用模型正则化还提高泛化能力,

谨防非代表性数据

用于训练的数据 必须是生产数据,不能是测试环境的数据,因为最终模型是在生产环境上部署 机器学习只能用来记忆训练数据中存在的模式 你只能识别出曾经见过的事物

如果生产数据的属性会随着时间发生变化,那么就会出现模型精度下降的问题

处理缺失值

如果是数值特征,应该避免输入像0 这样随意的值,。 应该考虑用数据集中该特征的均值或中位值来代替缺失值。

如果测试数据的分类有缺失值 而训练数据没有,则神经网络无法学会忽略该值

如果是分类特征,则可以创建一个新的类别,代表此值缺失,模型会自动学习这个新类别对于目标的含义

相关推荐
开始King8 小时前
Tensorflow2.0
人工智能·tensorflow
想要打 Acm 的小周同学呀1 天前
实现mnist手写数字识别
深度学习·tensorflow·实现mnist手写数字识别
_.Switch1 天前
Python机器学习:自然语言处理、计算机视觉与强化学习
python·机器学习·计算机视觉·自然语言处理·架构·tensorflow·scikit-learn
没有余地 EliasJie1 天前
Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT
pytorch·windows·深度学习·ubuntu·pycharm·conda·tensorflow
_.Switch2 天前
Python机器学习框架介绍和入门案例:Scikit-learn、TensorFlow与Keras、PyTorch
python·机器学习·架构·tensorflow·keras·scikit-learn
码匠许师傅4 天前
【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】
人工智能·stm32·单片机·ai·tensorflow
FL16238631295 天前
运行tensorflow报错InternalError: libdevice not found at ./libdevice.10.bc解决方法
人工智能·python·tensorflow
水上冰石5 天前
TensorFlow+springboot 花生病虫害叶片识别,如何训练模型
spring boot·tensorflow·neo4j
deflag6 天前
第T2周:TensorFlow实现彩色图片分类(CIFAR10数据集),并实现自己的真实图片分类
python·机器学习·分类·tensorflow
开始King6 天前
Tensorflow 2.0 cnn训练cifar10 准确率只有0.1 [已解决]
人工智能·cnn·tensorflow