10应用机器学习的建议(Advice for Applying Machine Learning)
10.1 决定下一步做什么(Deciding What to Try Next )
本章重点关注的问题是假如开发一个机器学习系统,或者想试着改进一个机器学习系统的性能,应如何决定接下来应该选择哪条道路?
改进算法性能的方法:
-
获得更多的训练样本——通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法。
-
尝试减少特征的数量
-
尝试获得更多的特征
-
尝试增加多项式特征
-
尝试减少正则化程度 λ \lambda λ
-
尝试增加正则化程度 λ \lambda λ
之后介绍如何评估机器学习算法的性能,也被称为"机器学习诊断法"。“诊断法”的意思是:这是一种测试法,通过执行这种测试能够深入了解某种算法到底是否有用。
10.2 评估一个假设(Evaluating a Hypothesis)
具有很小的训练误差并不能说明假设函数的正确性,可能会存在过拟合。如何判断一个假设函数是过拟合的呢?对需要一种方法来评估假设函数过拟合检验。
将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。训练集和测试集均要含有各种类型的数据,要对数据进行“洗牌”,然后再分成训练集和测试集。
测试集评估在通过训练集让模型学习得出其参数后,对测试集运用该模型,有两种方式计算误差:
- 对于线性回归模型,利用测试集数据计算代价函数 J J J
- 对于逻辑回归模型,除了可以利用测试数据集来计算代价函数外:
J
t
e
s
t
(
θ
)
=
−
1
m
t
e
s
t
∑
i
=
1
m
t
e
s
t
log
h
θ
(
x
t
e
s
t
(
i
)
)
+
(
1
−
y
t
e
s
t
(
i
)
)
log
h
θ
(
x
t
e
s
t
(
i
)
)
J_{test}{(\theta)} = -\frac{1}{{m}_{test}}\sum_{i=1}^{m_{test}}\log{h_{\theta}(x^{(i)}_{test})}+(1-{y^{(i)}_{test}})\log{h_{\theta}(x^{(i)}_{test})}
Jtest(θ)=−mtest1i=1∑mtestloghθ(xtest(i))+(1−ytest(i))loghθ(xtest(i))
还可以使用误分类的比率,对于每一个测试集样本,计算下式,然后对计算结果求平均。

10.3 模型选择和交叉验证集(Model Selection and Train/Validation/Test Sets )
假设要在10个不同次数的二项式模型之间进行选择,显然越高次数的多项式模型越能够适应训练数据集,但并不代表能推广至一般情况,应该选择一个更能适应一般情况的模型。需要使用交叉验证集来帮助选择模型。
即:使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集
模型选择的方法为:
-
使用训练集训练出10个模型
-
用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
-
选取代价函数值最小的模型
-
用步骤3中选出的模型对测试集计算得出推广误差(代价函数的值)
Training error:
J t r a i n ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2 Jtrain(θ)=2m1∑i=1m(hθ(x(i))−y(i))2
Cross Validation error:
J c v ( θ ) = 1 2 m c v ∑ i = 1 m ( h θ ( x c v ( i ) ) − y c v ( i ) ) 2 J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m}(h_{\theta}(x^{(i)}_{cv})-y^{(i)}_{cv})^2 Jcv(θ)=2mcv1∑i=1m(hθ(xcv(i))−ycv(i))2
Test error:
J t e s t ( θ ) = 1 2 m t e s t ∑ i = 1 m t e s t ( h θ ( x c v ( i ) ) − y c v ( i ) ) 2 J_{test}(\theta)=\frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_{\theta}(x^{(i)}_{cv})-y^{(i)}_{cv})^2 Jtest(θ)=2mtest1∑i=1mtest(hθ(xcv(i))−ycv(i))2
10.4 诊断偏差和方差(Diagnosing Bias vs. Variance)
如果算法表现不理想,多半是出现两种情况:要么是偏差比较大(欠拟合),要么是方差比较大(过拟合)。如果交叉验证集误差较大,如何判断是方差还是偏差呢?

训练集误差和交叉验证集误差近似时:偏差/欠拟合
交叉验证集误差远大于训练集误差时:方差/过拟合
10.5 正则化和偏差/方差(Regularization and Bias/Varianc)
使用正则化方法可以防止过拟合。在选择λ的值时也需要思考是否正则化程度太高或太低。
选择 λ \lambda λ的方法为:
- 使用训练集训练出12个不同程度正则化的模型
- 用12个模型分别对交叉验证集计算的出交叉验证误差
- 选择得出交叉验证误差最小的模型
- 运用步骤3中选出模型对测试集计算得出推广误差,也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上:

• 当
λ
\lambda
λ 较小时,训练集误差较小(过拟合)而交叉验证集误差较大
• 随着 λ \lambda λ 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加
10.6 学习曲线(Learning Curves )
使用学习曲线可以来判断某一学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的合理检验(sanity check)。学习曲线是将训练集误差和交叉验证集误差作为训练集样本数量( m m m)的函数绘制的图表。
如何利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并且正则化非常小,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。

在高偏差/欠拟合的情况下,增加数据到训练集不一定有帮助。在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。
10.7 决定下一步做什么(Deciding What to Do Next Revisited)
调试一个学习算算法的方式:
-
获得更多的训练样本——解决高方差
-
尝试减少特征的数量——解决高方差
-
尝试获得更多的特征——解决高偏差
-
尝试增加多项式特征——解决高偏差
-
尝试减少正则化程度λ——解决高偏差
-
尝试增加正则化程度λ——解决高方差
神经网络的方差和偏差:
使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小;使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化来调整而更加适应数据。
通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络,然后选择交叉验证集代价最小的神经网络。
11机器学习系统的设计(Machine Learning System Design)
11.1 首先要做什么:垃圾分类例子(Prioritizing What to Work On:Spam calssification example )
以一个垃圾邮件分类器算法为例进行讨论。首先要做的决定是如何选择并表达特征向量 x x x。可以选择一个由100个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为1,不出现为0),尺寸为100×1。
为了构建这个分类器算法,可以做很多事,如:
-
收集更多的数据,有更多的垃圾邮件和非垃圾邮件的样本
-
基于邮件的路由信息开发一系列复杂的特征
-
基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理
-
为探测刻意的拼写错误(把watch 写成w4tch)开发复杂的算法
在上面这些选项中,非常难决定应该在哪一项上花费时间和精力,之后讲述怎样用一个更加系统性的方法,从一堆不同的方法中,选取合适的那一个。
11.2 误差分析(Error Analysis)
构建一个学习算法的推荐方法为:
- 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
- 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
- 进行误差分析:人工检查交叉验证集(而不是在测试集上)中算法中产生预测误差的样本,看看这些样本是否有某种系统化的趋势
11.3 类偏斜的误差度量(Error Metrics for Skewed Classes)
设定误差度量值:设定某个实数来评估学习算法,并衡量它的表现,有了算法的评估和误差度量值。使用一个合适的误差度量值会对于学习算法造成微妙的影响。
偏斜类(skewed classes)问题:训练集中有非常多的同一种类的样本,只有很少或没有其他类的样本。
例如我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%。然而我们通过训练而得到的神经网络算法却有1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。
查准率(Precision)和查全率(Recall) 将算法预测的结果分成四种情况:
| 预测值 | |||
|---|---|---|---|
| Positive | Negtive | ||
| 实际值 | Positive | TP | FN |
| Negtive | FP | TN |
查准率=TP/(TP+FP)。例,在所有预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
关于查准率和查全率在我深度学习的笔记中有记录:1.3单一数字评估指标
11.4 查准率和查全率之间的权衡(Trading Off Precision and Recall )
权衡查准率和查全率之间的方法:计算F1 值(F1 Score),公式为:
F 1 S c o r e : 2 P R P + R {{F}_{1}}Score:2\frac{PR}{P+R} F1Score:2P+RPR
选择使得F1值最高的阀值。
11.5 机器学习的数据(Data For Machine Learning)


本文深入探讨了机器学习中的关键步骤,包括如何决定下一个优化方向、评估假设函数、处理过拟合与欠拟合。通过训练集和测试集划分,以及交叉验证集的应用,来诊断模型的偏差和方差。介绍了正则化在调整偏差和方差中的作用,并展示了学习曲线在识别问题类型中的价值。此外,还讨论了在实际项目中如何优先处理特征选择和数据收集,以及误差分析和适合偏斜类别问题的评价指标。
1208

被折叠的 条评论
为什么被折叠?



