目录

一 演算法改进

  1. 评价演算法
  • 模型诊断
  • 模型选择validation

2. 偏差和方差

  • 诊断偏差和方差
  • 正则化方差与偏差
  • 学习曲线 Learning curves
  • 决定保留谁

二 机器学习系统设计

  1. 误差分析
  2. 处理倾斜数据
  3. 使用大的数据集

一. 演算法改进

1.评价演算法

(1) 模型诊断

对于正则化线性回归,其代价函数为:

当演算法效果不佳时,该怎么做?

获得更多的训练样本?

尝试更少的特征?尝试获取附加的特征?尝试增加多项式的特征?尝试增加λ?尝试减小λ?

通常的解决办法是:

将数据集分成训练集和测试集, 将训练集训练出的参数用测试集数据测试性能。

通常情况下,训练集包含70%的数据,测试集是剩下的30%。

(2) 模型选择,validation

给定许多具有不同多项式度的模型,我们可以用系统的方法来确定「最佳」函数。为了选择你的假设的模型,你可以测试每个多项式的程度,看看错误的结果。比如在多项式回归时,我们该怎么选择次数作为我们的假设模型呢?

我们可以把数据集分为三类,训练集,交叉验证集和测试集,

训练集:60%

交叉验证集:20%测试集:20%

用交叉验证集来作为评判选择的标准,选择合适的模型,而测试集则是作为演算法性能的评判。

现在我们可以使用以下方法为三个不同的集合计算三个单独的错误值:

使用每个多项式的训练集来优化Θ中的参数。

使用交叉验证集找出具有最小误差的多项式度d(确定合适的模型)。

使用带有Jtest的测试集(Θ(d))估计泛化误差,(d =具有较低误差的多项式的theta);(评价模型)

设置 「交叉验证集」的原因?

一般的数据集都是分为trainning set, cross validation set, test set.

当然, 也有只分为training set和test set的分法

  • 对第二种分法来说,取得min(Err(test_set))的model作为最佳model,但是我们并不能评价选出来的这个model的性能,如果就将Err(test_set)的值当作这个model的评价的话,这是不公正的,因为这个model本来就是最满足test_set的model
  • 相反,第一种方法取得min(Err(cv_set))的model作为最佳model,对其进行评价的时候,使用剩下的test_set对其进行评价, 而不是使用Err(cv_set))的值

2. 偏差和方差

(1) 诊断偏差和方差

在本节中,我们考察多项式d的程度与假设的不合适或过拟合之间的关系。

我们需要区分是否偏差bias 或方差variance 是造成不良预测的问题。

高偏差是不足的,高方差是过度拟合

随著我们增加多项式的阶数d,训练误差将趋于减小。

与此同时,交叉验证误差会随著我们将d增加到一个点而降低,然后随d的增加而增加,形成一个凸曲线。

训练集误差和交叉验证集误差近似时:偏差/欠拟合

交叉验证集误差远大于训练集误差时:方差/过拟合

(2) 正则化方差与偏差

在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能

会正则化的程度太高或太小了,即我们在选择λ 的值时也需要思考与刚才选择多项式模型次

数类似的问题。

验证集模型的代价函数误差与λ 的值绘制在一张图表上:

? 当 λ 较小时,训练集误差较小(过拟合)而交叉验证集误差较大

? 随著λ 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加

不断调整参数λ

(3)学习曲线 Learning curves

使用学习曲线 来判断某一个学习演算法 是否处于偏差 方差问题 或是二者皆有

在少数几个数据点(如1,2或3)上训练一个演算法将很容易产生0个错误,因为我们总是可以找到一个接近这些点数的二次曲线。但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。

如何利用学习曲线识别高偏差/欠拟合:作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观:

也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。

如何利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。

也就是说在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高演算法效果。

(4)决定保留谁

获得更多的训练实例——解决高方差

尝试减少特征的数量——解决高方差尝试获得更多的特征——解决高偏差尝试增加多项式特征——解决高偏差尝试减少正则化程度λ——解决高偏差尝试增加正则化程度λ——解决高方差

诊断神经网路:

使用较小的神经网路,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小

使用较大的神经网路,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据

对于神经网路中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网路训练神经网路, 然后选择交叉验证集代价最小的神经网路。

二、机器学习系统设计

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

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

3.误差分析

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

Step1.从一个简单的能快速实现的演算法开始,实现该演算法并用交叉验证集数据测试这个演算法;

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

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

4. 类偏斜的误差度量

类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。

例如我们希望用演算法来预测癌症是否是恶性的,在我们的训练集中,只有0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的演算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%。然而我们通过训练而得到的神经网路演算法却有1%的误差。这时,误差的大小是不能视为评判演算法效果的依据的。

查准率(Precision)和查全率(Recall) 我们将演算法预测的结果分成四种情况:

1. 正确肯定(True Positive,TP):预测为真,实际为真

2. 正确否定(True Negative,TN):预测为假,实际为假3. 错误肯定(False Positive,FP):预测为真,实际为假4. 错误否定(False Negative,FN):预测为假,实际为真

则:查准率=TP/(TP+FP)。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿

瘤的病人的百分比,越高越好。

召回率=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的

病人的百分比,越高越好。

在大多数的时候我们想找到两个评价指标的平衡。比如:

假设考虑到一个正常人如果误判为癌症,将会承受不必要的心理和生理压力,所以我们要有很大把握才预测一个病人患癌症(y=1)。那么一种方式就是提高阙值(threshold),不妨设我们将阙值提高到0.7,即:

Predict 1 if: hθ(x)≥0.7

Predict 0 if: hθ(x)<0.7

在这种情况下,我们将会有较高的precision,但是recall将会变低。

假设考虑到一个已经患癌症的病人如果误判为没有患癌症,那么病人可能将因不能及时治疗而失去宝贵生命,所以我们想要避免错过癌症患者的一种方式就是降低阙值,假设降低到0.3, 即

Predict 1 if: hθ(x)≥0.3

Predict 0 if: hθ(x)<0.3

在这种情况下,将得到较高的recall,但是precision将会下降。

为了将precision和Recal转变为一个单一数值,我们引入了F1值:

我们选择使得F1 值最高的阀值。

5. 使用大的数据集

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

像这样的结果引起了一种在机器学习中 的普遍共识:「取得成功的人不是拥有最好演算法的人 而是拥有最多数据的人」

那么这种说法在什么时候是真 什么时候是假呢?

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

推荐阅读:

相关文章