[C5]机器学习诊断

机器学习诊断(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%

[C5]机器学习诊断

用误差评估假设(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\), 训练误差
  • 交叉验证误差(泛化误差):\(Error_{cv} = J_{cv}\)
    • 计算方法:使用上面的 \(\Theta\),\(\lambda\) 在交叉验证集上计算 交叉验证误差
  • 测试误差:\(Error_{test} = J_{test}\)
    • 计算方法:使用上面的 \(\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) 诊断 欠拟合 / 过拟合 / 均衡状态

[C5]机器学习诊断

高偏差(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)的例子,可以看到:随着训练样本增加,训练误差和泛化误差非常接近,并且处于很低的位置。

以下为三个学习曲线的绘图数据,可供参考:

[C5]机器学习诊断

模型选择曲线(Model Selection curves)

这里展开说明一下,上面例子中 多项式次幂数 = 8 和 \(\lambda\) = 1 的由来。

[C5]机器学习诊断

上面 9 张图对应 9 个 \(\lambda\) 的值,其中每张图中,x轴为多项式次数从1 ~ 10,y轴为 Error,两条线分别为训练误差和交叉验证(泛化)误差。

可以看到

  • 9 张图中,只有当 \(\lambda\) = 1 时,训练误差和泛化误差最为接近,且维持在一个低位。
  • 当 \(\lambda\) = 1 时,只有多项式次数为 8 的时候,训练误差和泛化误差最为接近(有个交叉),且维持在一个低位,同时测试误差也非常低。此处结合画图所用的数据来观察更为直观一些,下面会给出具体的用来绘制 9 张图的数据信息。

[C5]机器学习诊断

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。

上一篇:c# – 来自C5 Generic Collection Library的小型集合相对来说非常慢 – 可以做任何事情吗?


下一篇:jQuery之小米官网重构