Advice for applying machine learning
Decide what to try next
Debugging a learning algorithm 调试学习算法
Suppose you have implemented regularized linear regression to predict housing prices.
\[ J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda\sum_{j=1}^m\theta_j^2 \right] \]
However, when you test your hypothesis on a new set of houses, you find that it makes unacceptably large errors in its predictions. What should you try next?
假如你已经完成了房价预测的正则化线性回归(也就是最小化代价函数\(J\)的值),然而在你测试新的样例时发现产生了巨大的误差。要想改进这个算法你该怎么办?
可选的方法:
- Get more training examples 用更多的训练样本(收集样本耗费太大精力)
- Try smaller sets of features 选用更少的特征集(防止过拟合)
- Try getting additional features 选用更多的特征(或许目前的特征集帮助不大)
- Try adding polynomial features(\(x_1^2,x_2^2,x_1x_2,ect.\)) 增加多项式特征
- Try decreasing \(\lambda\)
- Try increasing \(\lambda\)
大多数人都是凭感觉随便从这些方法中选择一种,导致有些时候花了大量的时间却没能有所突破。
Machine learning diagnostic 机器学习诊断法
Diagnostic: A test that you can run to gain insight what is/isn't working with a learning algorithm, and gain guidance as to how best to improve its performance.
Diagnostics can take time to implement, but doing so can be a very good use of your time.
通过对诊断法的学习,将会懂得在接下来的尝试中如何选择更有意义的方法,最终达到改进机器学习系统性的目的。
Evaluating a hypothesis 评价你的假设
当我们确定学习算法的参数时,我们考虑的是选择参数来使训练误差最小化。有人认为得到一个很小的训练误差一定是一件好事,但仅仅因为这个假设具有很小的训练误差并不能说明它一定是一个好的假设(如过拟合)。
如何判断假设是否过拟合?
- 对于简单的例子,我们可以画出假设函数来观察。
- 对于更一般的情况(特征值不止一个的例子),画出假设函数几乎是不可能的。我们可将数据分成两部分,一部分为训练集,另一部分为测试集。(经典的分割方法为训练集和测试集七三分)
Training/testing procedure for linear regression
线性回归算法的训练/测试方法
- Learn parameter \(\theta\) from training data (minimizing training error $J(\theta) \() 队训练集进行学习得到参数\)\theta\((即最小化训练误差\)J(\theta )$),这里用的是那70%的训练数据。
- Computer test set error: \(J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_{\theta}(x_{test}^{(i)}) - y_{test}^{(i)})^2\) 我们使用包含参数\(\theta\)的假设函数对每一个测试样本进行测试,然后通过假设函数和测试样本计算出\(m_{test}\)个评分误差。
Training/testing procedure for logistic regression
逻辑回归算法的训练/测试方法
Learn parameter \(\theta\) from training data
Computer test set error: \(J_{test}(\theta) = -\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}y_{test}^{(i)}logh_{\theta}(x_{test}^{(i)}) + (1 - y_{test}^{(i)})logh_\theta(x_{test}^{(i)})\)
Misclassification error (0/1 misclassification error): 误分类率(0/1错分率,0/1表示了预测到的正确或错误样本的情况)
\[ err(h_{\theta}(x), y) = \left \{ \begin{aligned} 1 & & if h_{\theta}(x) \geq 0.5, y=0 \\ & & or if h_{\theta}(x) < 0.5, y=1 \\ 0 & & otherwise \end{aligned} \right. \]
Test error = \(\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_{\theta}(x_{test}^{(i)}), y_{test}^{(i)})\).
Model selection and training/validation/test
模型的选择和训练、验证、测试
模型选择问题:确定对于某组数据最合适的多项式次数是几次、怎样选用正确的特征来构造学习算法、正确选择学习算法中的正则化参数\(\lambda\)……
Model selection
假设现在需要选择能最好地拟合数据的多项式次数,即应该选择一次函数、二次函数还是……?
\(h_\theta(x) = \theta_0 + \theta_1x\)
\(h_\theta(x) = \theta_0 + \theta_1x + \theta_2x^2\)
\(h_\theta(x) = \theta_0 + \theta_1x + \ldots + \theta_3x^3\)
\(\vdots\)
\(h_\theta(x) = \theta_0 + \theta_1x + \ldots + \theta_{10}x^{10}\)
\(d\) = degree of polynomial 定义d为应该选择的多项式次数。
任务:从这10个模型中选择一个最适当的多项式次数,并且用这个模型进行估测,预测假设是否很好地推广到新的样本上。
步骤:
- 先选择第一个模型,然后训练误差的最小值,这样会得到一个参数向量\(\theta^{(1)}\);再选择第二个模型,进行同样的过程得到另一个参数向量\(\theta^{(2)}\);再拟合三次函数,得到一个参数\(\theta^{(3)}\);……参数\(\theta^{(10)}\)。
- 对所有这些模型求出测试集误差\(J_{test}(\theta^{(1)})\)、\(J_{test}(\theta^{(2)})\)、……、\(J_{test}(\theta^{(10)})\)。
- 选取测试集误差最小的那一组假设作为模型。
思考:
问:假设通过上述做法我们选取了五次函数的模型,我们能否将其推广到其他样本?
答:否。可以观察这个五次多项式假设模型对测试集的拟合情况,但不能公平地说明此假设推广到一般时的效果。因为我们选择了一个能够最好地拟合测试集的的参数\(d\)的值(多项式的度),所以参数向量\(\theta^{(5)}\)在测试集上的表现可能导致对泛化误差过于乐观的估计。因为我是找了一个最能拟合测试集的参数\(d\),用测试集来评价我的假设就显得不公平了,因此我的假设可能更适用于测试集,而不是未知的新样本。
总结:对于一些训练集,我们是无法推测拟合后的模型在新的训练集上是否有效的。
Evaluating your hypothesis
为了调整这个评价假设时模型选择的问题,我们通常会采用将数据集分为三部分的方法来解决问题。
- Training set 60% 训练集
- Cross validation set (CV) 20% 交叉验证集
- Test set 20% 测试集
Train/validation/test error
Training error: \(J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2\)
Cross Validation error: \(J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}(h_\theta(x_{cv}^{(i)}) - y_{cv}^{(i)})^2\)
Test error: \(J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\theta(x_{test}^{(i)}) - y_{test}^{(i)})^2\)
Model selection
我们不再使用测试集来进行选择模型,而是使用验证集(即交叉验证集)进行选择。
步骤:
- 依次选取十个模型,分别使代价函数取最小值,得到\(\theta^{(1)}\)、\(\theta^{(2)}\)、……、\(\theta^{(10)}\)。
- 对所有这些模型求出交叉验证集误差\(J_{cv}(\theta^{(1)})\)、\(J_{cv}(\theta^{(2)})\)、……、\(J_{cv}(\theta^{(10)})\)。
- 选取交叉验证集误差最小的那一组假设作为模型。
因为我们是通过交叉验证集来确定的这个参数,因此这个参数\(d\)(即多项式次数),就没有跟测试集拟合过,故为测试集留出了一条路。现在我们就能够使用测试集来预测或者估计,通过学习算法得出的模型的泛化误差了。
Diagnosing bias vs. variance 偏差VS方差
如果一个学习算法表现的不理想,多半是出现两种情况:偏差较大/方差较大,即欠拟合和过拟合。
Bias/variance
- 训练误差:随着我们增大多项式的次数,我们将对训练集拟合得越来越好。所以当\(d = 1\)时,对应一个较大的训练误差;而多项式次数很高时,训练误差就会很小,甚至可能等于0(可能会过拟合)。
- 交叉验证误差:当\(d = 1\)时,对应一个很简单的函数来拟合数据,将会产生 一个较大的交叉验证误差;当用一个中等大小的多项式次数来拟合时,将会产生一个更小的交叉验证误差;当次数太大时,就会产生过拟合现象,又会得到一个较大的交叉验证误差。
Diagnosing bias vs. variance
Suppose your learning algorithm is performing less well than you were hoping.(\(J_{cv}(\theta)\) or \(J_{test} (\theta)\) is high.) Is it a bias problem or a variance problem?
如何区分欠拟合还是过拟合?
- Bias (underfit): \(J_{train}(\theta)\) will be high, \(J_{cv}(\theta) \approx J_{test} (\theta)\). 下图左边
- Variance (overfit): \(J_{train}(\theta)\) will be low, \(J_{cv}(\theta) \gt\gt J_{test} (\theta)\). 下图右边
Regularization and bias/variance
偏差和方差之间是如何影响的以及它们和算法的正则化之间的相互关系。
Choosing the regularization parameter \(\lambda\)
当\(\lambda\)过大时会产生高偏差(欠拟合),过小会出现高方差(过拟合)。该如何选取合适的参数\(\lambda\)?
定义如下代价函数,目标同样是最优化,但不使用正则化项。
\(J_{train}(\theta) = \frac{1}{2m} \sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2\)
\(J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}(h_\theta(x_{cv}^{(i)}) - y_{cv}^{(i)})^2\)
\(J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_{\theta}(x_{test}^{(i)}) - y_{test}^{(i)})^2\)。
Model:
- $h_\theta(x) = \theta_0 + \theta_1x + \theta_2x^2 + \theta_3x^3 + \theta_4x^4 $
- \(J(\theta) = \frac{1}{2m} \sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2 + \frac{\lambda}{2m}\sum_{j=1}^m\theta_j^2\)
Method:
- 选取一系列想要尝试的\(\lambda\)的值进行尝试直到一个较大的值。这样就能得到若干个不同的正则化参数\(\lambda\),对应若干个不同的模型,然后从这若干个模型中选出一个最合适的模型。
- 依次选取各个模型,尝试最小化我们的代价函数,得到参数向量\(\theta^{(1)}、\theta^{(2)}、\ldots、\theta^{(n)}\)。
- 用交叉验证集来评价它们,选取误差最小的模型。
- 通过对学习得出来的模型用测试集进行测试,预测效果如何。
Bias/variance as a function of the regularization parameter \(\lambda\)
当我们改变正则化参数\(\lambda\)的值时交叉验证集误差和训练集误差会随之发生怎样的变化?
\(\lambda\)与\(J_{train}(\theta)\)的关系:
\(\lambda\)很小时,正则化项基本可以忽略,只需要对平方误差做最小化处理,故最终会得到很小的\(J_{train}(\theta)\)。
\(\lambda\)很大时,处于高偏差,不能对训练集很好的拟合,误差会很大。
\(\lambda\)与\(J_{cv}(\theta)\)的关系:
\(\lambda\)很小时,过拟合,高方差,此时交叉验证集误差将会很大,我们的假设不能在交叉验证集上表现的很好。
\(\lambda\)很大时,欠拟合,高偏差,此时交叉验证集误差也会很大,我们的假设不能在交叉验证集上表现的很好。
综上,\(\lambda\)会在中间的某个值表现得刚好合适。(对于真实的数据,通常会含有很多噪声,曲线看起来比下图的要更加凌乱,只会或多或少的看出像这样的一个趋势)。
Learning curves 学习曲线
学习曲线是一种用于诊断学习算法是否可能存在偏差或方差问题的绘图工具,也可以用它来检查算法是否正常运行,或者来提高算法性能。
Learning curves
为了绘制一条学习曲线,通常会先绘制出\(J_{train}(\theta)\)或\(J_{cv}(\theta)\)关于参数\(m\)(样本总数)的函数。
- 当样本容量\(m\)很小的时候,训练误差也会很小;随着训练样本的增大,我们的平均训练误差是逐渐增大的。(因为很显然,如果我们训练集很小,那么很容易就能把训练集拟合到很好)
- 验证集误差和测试集误差都会随着训练集样本容量\(m\)的增加而减小。(交叉验证集误差是对完全陌生的交叉验证集数据进行预测得到的误差,当训练样本很小的时候,泛化程度不会很好,是不能很好地适应新样本的;只有当使用一个更大的训练集时,才能得到一个能够更好拟合数据的可能的假设,即使用的数据越多,获得的泛化表现更好,对样本的适应能力更强。)
High bias
引入:用一条直线拟合给出的数据,显然不能很好的拟合。当增大了样本容量,有了更多训练集时,用一条直线来拟合数据,依旧不能得到很好的拟合。
分析:
- 画出交叉验证集误差随训练样本容量增大而变化的情况后,发现当到达某一个容量值的时候,就找到那条最有可能拟合数据的直线,此时即使继续增大训练集的样本容量,基本上还是会得到一条差不多的直线,因此测试集误差很快会变为水平而不再变化。
- 训练误差一开始是很小的,随着样本容量的增大而逐渐增大,一直趋近于交叉验证集误差。这是因为选取的参数很少,但当\(m\)很大时数据太多,此时训练集和交叉验证集的预测效果将会非常接近。
总结:如果一个学习算法是高偏差的,那么当选用更多的训练样本时,交叉验证集误差的值不会表现出明显的下降(实际上最后变为水平了)。
结论:对于处于高偏差的学习算法,选用更多的训练集数据对改善算法表现无益。
High variance
引入:当样本训练集容量很小(如只有五组训练样本)时,如果用高阶次的多项式来拟合,并用了一个很小的\(\lambda\)值,显然,模型将对这组数据拟合得很好。
分析:
- 此时假设函数对数据过拟合,训练误差会很小。随着训练样本数量的增加,\(J(\theta)\)的值会随之增大,但总的训练集误差还是很小。因为是过拟合,所以交叉验证集误差会很大。
- 此时一个很明显的特点是在训练集误差和交叉验证集误差之间有一段很大的差距。这个曲线也反映出如果随着训练集样本数的增大,这两条曲线正在相互靠近。
- 可以预测出,如果继续增大训练样本的数量,将曲线向右延伸,交叉验证集误差将会逐渐下降。
总结:在高方差情行中,使用更多的训练集数据对改进算法的表现是有效果的。
Deciding what to try next (revisited)
Debugging a learning algorithm
方法:
- Get more training examples 用更多的训练样本(收集样本耗费太大精力)
- Try smaller sets of features 选用更少的特征集(防止过拟合)
- Try getting additional features 选用更多的特征(或许目前的特征集帮助不大)
- Try adding polynomial features(\(x_1^2,x_2^2,x_1x_2,ect.\)) 增加多项式特征
- Try decreasing \(\lambda\)
- Try increasing \(\lambda\)
评价:
- fix high variance 解决高方差问题
- fix high variance 解决高方差问题
- fix high bias 解决高偏差问题
- fix high bias 解决高偏差问题
- fix high bias 解决高偏差问题
- fix high variance 解决高方差问题
Neural networks and overfitting
"Small" neural network (fewer parameters; more prone to underfitting)
当对神经网络进行拟合的时候,可以选择一个相对比较简单的神经网络模型。相对来讲,这种模型的隐藏单元比较少(甚至有的只有一个隐藏单元)。因此它的参数不会很多,并且容易出现欠拟合。其优势在于计算量较小。
"Large" neural network (more parameters; more prone to overfitting)
较大型的神经网络,隐藏单元比较多(每一层中的隐藏单元数比较多或者有很多个隐藏层),因此一般它的参数比较多,也更容易出现过拟合(虽然计算量会偏大,但主要问题还是过拟合)。越大型的网络性能越好,为解决过拟合问题,可采取正则化的方法来修正。
总结:一般来说,使用一个大型的神经网络并使用正则化来修正过拟合问题通常比使用一个小型的神经网络效果更好。
思考:隐藏层的层数问题,使用多少个比较合适呢?
答:依次尝试不同层数并验证,保留最优结果。
来源:https://www.cnblogs.com/songjy11611/p/12271534.html