机器学习诊断(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.
划分数据集(Train / Cross Validation / Test)
一个算法在训练集上拟合的好,但泛化能力未必好。所以可改进一下,将原有训练集重新划分(如果训练集非随机分布,先随机打散,之后再划分,可防止样本数据倾斜)为三个部分(Train Set / Cross Validation Set / Test Set),让算法在相对独立的数据集上 训练 / 交叉验证(泛化)/ 测试
:
- Training set: 60%
- Cross validation set: 20%
- Test set: 20%
用误差评估假设(Evaluating a Hypothesis with error)
线性回归 和 逻辑回归 的 cost function
可用来配合求解假设的最优参数 \(\Theta\),还可用来评估假设,此时称 J 为 误差(error)。
回顾 线性回归 和 逻辑回归 的 cost function
:
\(J(\theta)=\frac{1}{2m} \Bigg[ \sum\limits_{i=1}^m \Big( h_\theta(x^{(i)}) - y^{(i)} \Big)^2 + \lambda \sum\limits_{j=1}^n \theta_j^2 \Bigg]\)
\(J(\theta)=-\frac{1}{m} \sum\limits_{i=1}^m \Bigg[ y^{(i)} \cdot log \bigg(h_\theta(x^{(i)}) \bigg) + (1-y^{(i)}) \cdot log \bigg(1-h_\theta(x^{(i)}) \bigg) \Bigg] + \frac{\lambda}{2m} \sum\limits_{j=1}^n \theta_j^2\)
对于分类问题(e.g. 逻辑回归),除了使用 J (标准的)来表示误差之外,还可以使用误分率(Misclassification Error)来表示,如下:
\(\begin{cases} err(h_{\Theta}(x),y) = \begin{cases} 1 \quad & \text{if } h_\Theta(x) \geq 0.5 \text{ and } y=0 \text{ or } h_\Theta(x) < 0.5 \text{ and } y = 1 \\ 0 \quad & otherwise \end{cases} \\ \\ Error=\frac{1}{m} \sum\limits_{i=1}^{m}err(h_\Theta(x^{(i)}),y^{(i)}) \end{cases}\)
三个数据集和误差结合使用
将误差对应到不同的数据集,可对应得到三个误差:
-
训练误差 :\(Error_{train} = J_{train}\)
- 计算方法:使用训练集训练样本,得到 \(\Theta\),\(\lambda\),
训练误差
- 计算方法:使用训练集训练样本,得到 \(\Theta\),\(\lambda\),
-
交叉验证误差(泛化误差):\(Error_{cv} = J_{cv}\)
- 计算方法:使用上面的 \(\Theta\),\(\lambda\) 在交叉验证集上计算
交叉验证误差
- 计算方法:使用上面的 \(\Theta\),\(\lambda\) 在交叉验证集上计算
-
测试误差:\(Error_{test} = J_{test}\)
- 计算方法:使用上面的 \(\Theta\),\(\lambda\) 在测试集上计算
测试误差
- 计算方法:使用上面的 \(\Theta\),\(\lambda\) 在测试集上计算
应用:在不同角度下,观察多种场景对应的 Errors 的变化情况,可监测算法的性能。
举例 说明:
- 从样本的角度来看,我们观察样本数量从1增加到m时,对应的训练误差和交叉验证误差的变化情况,可画出
学习曲线
,它可以判断算法是否处于高偏差
或高方差
或是Just Right
- 从多项式次幂数的角度来看,我们观察不同多项式次幂数时,对应的训练误差和交叉验证误差的变化情况,可画出一个曲线图辅助我们选择最优的多项式次幂数。
- 从正则化参数 \(\lambda\) 的角度来看,我们观察选择不同 \(\lambda\) 时,对应的训练误差和交叉验证误差的变化情况,可画出一个曲线图辅助我们选择最优的 \(\lambda\)。
- 其他角度同训练误差和交叉验证误差相结合 ... etc.
实际的例子
Suppose your learning algorithm is performing less well than you were hoping.
训练误差很低,但是泛化误差很高,所以你需要优化算法。
对于大多数机器学习需要解决的是以下两个问题
:1. 欠拟合(Underfitting),即 高偏差(High Bias) 2. 过拟合(Overfitting),即 高方差(High Variance)
而针对 欠拟合 或 过拟合,有以下6 种方法
可以用来优化算法和解决对应的问题:1. Get more training examples -> fixes high variance 2. Try smaller sets of features -> fixes high variance 3. Try getting additional features -> fixes high bias 4. Try adding polynomial features (\(x_1^2,x_2^2,x_1x_2,etc.\)) -> fixes high bias 5. Try decreasing lambda -> fixes high bias 6. Try increasing lambda -> fixes high variance
学习曲线(Learning curves) 诊断 欠拟合 / 过拟合 / 均衡状态
高偏差(Figure 1 和 Figure 4)
Figure 1 为用线性回归拟合数据,Figure 4 为它对应的学习曲线。这是一个高偏差的例子,可以看到:
- 训练集很少时,训练误差很低,交叉验证(泛化)误差很高
- 训练集增多时,训练误差和泛化误差近似,但是都居高不下
- 此时,对于高偏差问题,即使增加再多的训练样本也于事无补
高方差(Figure 2 和 Figure 5)
通过上面的学习曲线,发现算法存在高偏差问题,假定我们决定使用引言中所示的 6种方法
中的第4种(即添加多项式特征)来改善高偏差的情况,假定我们已经选择了 8 次多项式。如下:
Figure 2 为用多项式回归拟合数据,Figure 5 为它对应的学习曲线。这又变成了一个高方差的例子,可以看到:
- 训练集很少时,训练误差很低,交叉验证(泛化)误差很高
- 随着训练集增加训练误差升高,泛化误差持续降低但并未持平,且仍和训练误差有很大距离
- 此时,增加训练样本数量对解决高方差问题非常有帮助,当样本数量到达一定程度,两条线会靠近并持平,且维持在低位。
比较均衡的情况(Figure 3 和 Figure 6)
通过上面的学习曲线,发现算法存在高方差问题,假定我们决定使用引言中所示的 6种方法
中的第6种(即增加正则化参数 \(\lambda\))来改善高方差的情况,假定我们已经选择了 \(\lambda\) = 1。如下:
Figure 3 为用多项式回归拟合数据,Figure 6 为它对应的学习曲线。这次是一个比较均衡(Just Right)的例子,可以看到:随着训练样本增加,训练误差和泛化误差非常接近,并且处于很低的位置。
以下为三个学习曲线的绘图数据,可供参考:
模型选择曲线(Model Selection curves)
这里展开说明一下,上面例子中 多项式次幂数 = 8 和 \(\lambda\) = 1 的由来。
上面 9 张图对应 9 个 \(\lambda\) 的值,其中每张图中,x轴为多项式次数从1 ~ 10,y轴为 Error,两条线分别为训练误差和交叉验证(泛化)误差。
可以看到
- 9 张图中,只有当 \(\lambda\) = 1 时,训练误差和泛化误差最为接近,且维持在一个低位。
- 当 \(\lambda\) = 1 时,只有多项式次数为 8 的时候,训练误差和泛化误差最为接近(有个交叉),且维持在一个低位,同时测试误差也非常低。此处结合画图所用的数据来观察更为直观一些,下面会给出具体的用来绘制 9 张图的数据信息。
Diagnosing Neural Networks
A neural network with fewer parameters is prone to underfitting.
It is also computationally cheaper.
A large neural network with more parameters is prone to overfitting.
It is also computationally expensive.
In this case you can use regularization (increase λ) to address the overfitting.
Using a single hidden layer is a good starting default.
You can train your neural network on a number of hidden layers using your cross validation set.
You can then select the one that performs best.
程序代码
直接查看Machine Learning Diagnostics & Bias-Variance & Learning Curve.ipynb可点击
获取源码以其他文件,可点击右上角 Fork me on GitHub
自行 Clone。