吴恩达机器学习6——机器学习算法改进、系统设计

一、机器学习算法改进

1. 机器学习算法评价

1.1 评估模型

当面对测试集,你的算法效果不佳时,你一般会怎么做?

  • 获得更多的训练样本?
  • 尝试更少的特征?
  • 尝试获取附加的特征?
  • 尝试增加多项式的特征?
  • 尝试增加λ?
  • 尝试减小λ?

我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的。

  • 检验算法是否过拟合的方法:将数据集分成训练集和测试集,将训练集训练出的参数用测试集数据测试性能。通常情况下,训练集包含70%的数据,测试集是剩下的30%。(很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。 )
  • 在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差: 1.对于线性回归模型,我们利用测试集数据计算代价函数J。2. 对于逻辑回归函数,我们可以除了使测试集来计算代价函数,还可以计算:
    吴恩达机器学习6——机器学习算法改进、系统设计
    然后求平均。

1.2 模型选择和交叉验证集

因为学习算法很好地适合训练集,这并不意味着这是一个很好的假设。它可能会过于合适,因此您对测试集的预测会很差。这种现象称为过拟合问题。我们经常会从不同多项式模型中挑选一个最合适的。
吴恩达机器学习6——机器学习算法改进、系统设计
我们可以把数据集分为三类,训练集,交叉验证集和测试集,

  • 训练集:60%
  • 交叉验证集:20%
  • 测试集:20%

用交叉验证集来作为评判选择的标准,选择合适的模型,而测试集则是作为算法性能的评判。
具体步骤如下:

  • 使用训练集训练出 10 个模型
  • 用 10 个模型分别对交叉验证集计算得出 交叉验证误差(代价函数的值)
  • 选取代价函数值最小的模型
  • 用步骤 3 中选出的模型对测试集计算得出推广误差(代价函数的值)
    吴恩达机器学习6——机器学习算法改进、系统设计

2. 偏差与方差

2.1 诊断偏差和方差

下图分别表示了高偏差,刚好,高方差三种情况
吴恩达机器学习6——机器学习算法改进、系统设计
我们通常会通过将 训练集 和 交叉验证集 的 代价函数误差 与 多项式的次数 绘制在同一张图表上来帮助分析:
吴恩达机器学习6——机器学习算法改进、系统设计
吴恩达机器学习6——机器学习算法改进、系统设计

  • 对于训练集,当 d 较小时,模型拟合程度更低,误差较大;随着 d 的增长,拟合程度提高,误差减小。 对于交叉验证集,当 d 较小时,模型拟合程度低,误差较大;但是随着 d 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
  • 如果我们的交叉验证集误差较大,我们如何判断是方差还是偏差呢? 根据上面的图表,我们知道:
    吴恩达机器学习6——机器学习算法改进、系统设计
    训练集误差和交叉验证集误差近似时:偏差/欠拟合
    交叉验证集误差远大于训练集误差时:方差/过拟合

2.2 正则化和偏差/方差

在我们在训练模型的过程中,一般会使用一些 归一化 方法来 防止过拟合 。但是我们可能会归一化的程度太高或太小了,即我们在选择 λ 的值时也需要思考与刚才选择多项式模型次数类似的问题。
吴恩达机器学习6——机器学习算法改进、系统设计

  • 我们选择一系列的想要测试的 λ 值,通常是 0-10 之间的呈现 2 倍关系的值 (如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10 共 12 个)。 我们同样把数据分为训练集、交叉验证集和测试集。
    吴恩达机器学习6——机器学习算法改进、系统设计
    选择 λ 的方法为:
  • 使用训练集训练出 12 个不同程度 归一化 的模型
  • 用 12 模型分别对交叉验证集计算的出 交叉验证误差
  • 选择得出交叉验证误差最小的模型
  • 运用步骤 3 中选出模型对测试集计算得出 推广误差
    吴恩达机器学习6——机器学习算法改进、系统设计
    当 λ 较小时,训练集误差较小(过拟合)而交叉验证集误差较大。随着 λ 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加。

2.3 学习曲线

绘制学习曲线非常有用 。也许你想检查你的学习算法 运行是否一切正常 ,或者你希望改进算法的表现或效果。那么学习曲线 就是一种很好的工具, 使用学习曲线 来判断某一个学习算法 是否处于偏差 方差问题 或是二者皆有 。

  • 高偏差:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。
    吴恩达机器学习6——机器学习算法改进、系统设计
    由上图可以看出:在 高偏差/欠拟合 的情况下,增加数据到训练集不一定能有帮助。
  • 高方差:假设我们使用一个非常高次的多项式模型,并且归一化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。
    吴恩达机器学习6——机器学习算法改进、系统设计
    在高方差/过拟合 的情况下,增加更多数据到训练集可能提高算法效果。

2.4 选择修正方法

我们已经介绍了怎样评价一个学习算法,我们讨论了模型选择问题,偏差和方差的问题。那么这些诊断法则怎样帮助我们判断,哪些方法可能有助于改进学习算法的效果,而哪些可能是徒劳的呢?

  • 获得更多的训练实例——解决 高方差
  • 尝试减少特征的数量——解决 高方差
  • 尝试获得更多的特征——解决 高偏差
  • 尝试增加多项式特征——解决 高偏差
  • 尝试减少归一化程度 λ——解决 高偏差
  • 尝试增加归一化程度 λ——解决 高方差

神经网络的方差和偏差:
吴恩达机器学习6——机器学习算法改进、系统设计
使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小;使用 较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过 归一化 手段来调整而更加适应数据。 通常选择较大的神经网络并采用归一化处理 会比采用较小的神经网络效果要好。
对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。

二、机器学习系统设计

给定一个电子邮件数据集,我们可以为每个电子邮件构建一个向量。这个向量中的每个条目代表一个单词(词袋模型)。该矢量通常包含10,000到50,000个条目,通过查找我们数据集中最常用的单词来收集。如果在电子邮件中找到一个单词,我们将分配它的相应条目1,否则如果没有找到,条目将是0.一旦我们已经准备好了所有的x向量,我们将训练我们的算法,最后,我们可以用它来分类电子邮件是否是垃圾邮件。

那么你怎么能花时间来提高这个分类器的准确度呢?

  • Step1.使用快速但不完美的算法实现;
  • Step2.画出学习曲线,分析偏差、方差,判断是否需要更多的数据、增加特征量….;
  • Step3.误差分析:人工检测错误、发现系统短处,来增加特征量以改进系统。

那么你怎么能花时间来提高这个分类器的准确度呢?

  • 收集大量的数据(例如“蜜罐”项目,但并不总是有效)
  • 开发复杂的功能(例如:在垃圾电子邮件中使用电子邮件标题数据)
  • 开发算法以不同的方式处理您的输入(识别垃圾邮件中的拼写错误)。

1. 误差分析

一般我们提升模型的步骤为:

  • Step1.使用快速但不完美的算法实现;
  • Step2.画出学习曲线,分析偏差、方差,判断是否需要更多的数据、增加特征量….;
  • Step3.误差分析:人工检测错误、发现系统短处,来增加特征量以改进系统。

因此,我们应该尝试新的东西,为我们的错误率得到一个数值,并根据我们的结果决定是否要保留新的特征。(使用误差度量值 来判断是否添加新的特征)

2. 处理偏斜数据

有些时候,一些数据很不平衡,比如正向的占99%、负向的占1%(倾斜数据shewed data)。这样只用准确度这个指标就不能很好的衡量算法的好坏,所以我们引入了信度precision和查全率recall。
查准率(Precision)和 查全率(Recall)我们将算法预测的结果分成四种情况:

  • 正确肯定(True Positive,TP):预测为真,实际为真
  • 正确否定(True Negative,TN):预测为假,实际为假
  • 错误肯定(False Positive,FP):预测为真,实际为假
  • 错误否定(False Negative,FN):预测为假,实际为真
    查准率 = TP/(TP+FP)例,在所有我们 预测 有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
    查全率 = TP/(TP+FN)例,在所有 实际 上有恶性肿瘤的病人中,成功预测 有恶性肿瘤的病人的百分比,越高越好。
    为了将precision和Recall转变为一个单一数值,我们引入了F值:F=2PR/(P+R)

总结:衡量一个算法应该用一下值综合考虑:
Accuracy = (true positives + true negatives) / (total examples)
Precision = (true positives) / (true positives + false positives)
Recall = (true positives) / (true positives + false negatives)
F 1 score = (2 * precision * recall) / (precision + recall)

3. 使用大数据集

但事实证明 在一定条件下 , 得到大量的数据并在 某种类型的学习算法中进行训练。 可以是一种 获得 一个具有良好性能的学习算法 有效的方法。

  • 特征x包含足够的信息来准确地预测y。 (例如,验证这种情况的一种方式是,如果只有在给定x的情况下,领域上的专家才能自信地预测y)。
  • 我们训练一个具有大量参数(能够学习/表示相当复杂的函数)的学习算法。