机器学习(二):如何使用机器学习来解决一个问题?

给定一个问题,如何设计机器学习系统来解决此问题?

1. 机器学习流水线

1.1设计问题的流水线

什么是“machine learning pipeline”?对于一个由多个阶段/模块组成的系统,当系统中含有机器学习的阶段/模块时,我们就说这是一个机器学习流水线。
Photo OCR问题:识别图片中的文字。
这里写图片描述
我们将这一问题分成三部分:首先是检测到图片中存在文字的部分,然后将文字分割成一个个的字符,最后识别每一个字符。
其流水线如下:
这里写图片描述
这样我们就可以分模块的进行机器学习算法设计了。
假设三个模块都使用机器学习算法,而且对于每一个模块,都有一个简单的机器学习算法。现在我们想要改进整个系统的性能,那么,从哪个模块开始改进比较好?

1.2 使用ceiling analysis决定下一步的工作

这里写图片描述
如图所示:
使用测试数据集test set:
1. 首先得出最初整个系统的准确率为72%;
2. 采用人工标记的方式,将text detection的输出校正,使得text detection的准确率为100%,此时得到整个系统的准确率为89%;
3. 采用人工标记的方式,将Character segmentation的输出校正,使其准确率为100%,此时得到整个系统的准确率为90%;
4. 采用人工标记的方式,将Character recognition的输出校正,使其准确率为100%,此时得到整个系统的准确率为90%;
5. 我们可以发现:
- 改进text detection:最多可以提升17%的性能;
- 改进Character segmentation:最多可以提升1%的性能;
- 改进Character recognition:最多可以提升10%的性能;
6. 所以我们按照优先级:先改进第一个模块;再改进第三个模块;最后是第二个模块。

2. 单个机器学习算法的设计和改进

根据机器学习(一):统计学习问题概述中关于机器学习步骤的描述,可以得知设计一个机器学习算法时,我们需要考虑的问题有很多,如何有序、有效的处理这些问题呢?

2.1 设计机器学习算法的方法

这里写图片描述
分三步:
1. 设计一个比较简单的算法;
2. 改进这个算法;
3. 使用error analysis来深入分析这个算法
其中,设计简单算法这一步不需要过多的解释。

2.2 改进初始算法的性能

首先设计一个比较简单的算法,然后测试其性能。发现其性能不好,如何改进?
这里写图片描述
如上图所示,可能增大训练集、增加/减小特征量,使用多项式特征量/非线性特征量,使用较大/较小的正则化……等等,每一个改进方法都需要花费大量的时间,那么我们如何选择有效的改进方法呢?

我们根据之前的知识可以得出:
如果性能不好的话,可以有两种理由:
- 欠拟合,也就是说模型的复杂度不够,这个时候我们要做的事情就是:使用更复杂的假设空间H。
- 过拟合,过拟合的影响因素有哪些?根据之前的讨论,有训练数据集大小N,模型复杂度和噪声多少。
首先我们需要确定初始模型性能不好的原因,然后再针对各种原因选择有效的改进方法。但是,无论哪种改进方法,都需要涉及到多个假设空间H,所以数据集分三个部分:training set、validation set和test set。

2.3 确定是欠拟合还是过拟合

根据 EoutEin+ϵ 和欠拟合、过拟合的定义:
对于欠拟合, Ein 很大, ϵ 较小,从而 EoutEin is high ;对于过拟合, Ein 很小, ϵ 很大,从而 Eout 很大。
对于欠拟合,我们称之为high Bias;对于过拟合,我们称之为high variance。
这里写图片描述
[此图可以形象地表现过拟合和欠拟合,其中横轴表示模型复杂度。]
所以,对于某一模型,我们只要确定了 Ein Eout 的关系即可。如何确定呢?上图是不行的,它反应的是多个模型的对比。
我们可以使用学习曲线(learning curve),它反映了模型的误差随着训练数据量的变化而变化的过程:
这里写图片描述
根据之前过拟合和欠拟合对应的学习曲线:
这里写图片描述
如果某一个模型的学习曲线是这样的:
这里写图片描述
EinEtest 同时, Ein 较大,那么这个模型就是欠拟合的(High Bias);
如果一个模型的学习曲线是这样的:
这里写图片描述
Ein 很小, Etest 较大,那么这个模型就是过拟合的(High variance);


对于许多机器学习的算法,更容易出现的问题是过拟合。如何处理过拟合问题,是我们研究的重点。

2.4如何处理过拟合?

ϵ=12N(ln2M+ln1δ) 得:我们要么减少假设空间模型复杂度,要么增加数据量。

2.4.1 增加训练数据量N

这里写图片描述
上图是一个实验:对于一个问题,采用复杂度不同的4种算法,我们发现:(比较“低级”的算法+large N)的性能远好于(比较“高级”算法+small N)的性能。所以:it’s not who has the best algorithm that wins, it’s who has the most data
这给我们一个启示:
这里写图片描述
如果我们能获取大量的数据,那么我们可以采用复杂的机器学习算法来获得良好的性能,而不用担心过拟合问题。

2.4.2 正则化

正则化是减少模型复杂度的常用方法。正则化是在经验风险上加一个正则化项。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化的值就越大。当加入正则化项之后,假设空间的范围就会被限制,从而减小假设空间。
具体细节可以参考机器学习(一)的内容。

总之我们要最小化的是: 1NNi=1L(yi,g(xi))+λ||w||p
λ的值不同,则对应的假设空间不同。所以使用多个λ就如同使用多个假设空间一样,λ与 Etest 关系如下:
这里写图片描述
可以看出λ的作用就如同复杂度。当λ很大时,正则化项就很大,从而导致模型不再复杂;(注意图中用来训练的J与用来测试的J的不同)

那我们怎么将正则化运用到我们的算法当中呢?
这里写图片描述
首先按照学习算法对不同的λ(对应于不同的假设空间),学习出各自的最优模型。然后根据 Ecv(Jcv) 选择最优的模型。然后使用 Etest 评估性能。

2.5 error analysis

根据之前的描述:当改进玩算法之后,我们就需要进行error analysis分析了。什么是error analysis呢?就是人工的查看算法发生错误的样本,看看这些样本的特点,从而构造新的特征量。
以垃圾邮件分类为例:
这里写图片描述
1. 我们分析发生错误分类的邮件的type,发现卖仿品的12封,卖假表的有4封,钓鱼邮件有53封,其他的31封。那么我们就知道:我们的算法对于钓鱼邮件的分类效果并不是很好,那么我们就可以重点设计针对钓鱼邮件的特征量。
2. 分析可能有帮助的特性。譬如我认为“拼写错误”这一特性可能有用,但是发现我们发生错误分类的“拼写错误”邮件只有5封,那么我们就不要花经历放到拼写错误特征量的设计上了。

3. 总结

现在我们对如何着手用机器学习来解决问题已经有了一个大致的了解了:
1. 设计问题的流水线,对每个模块实现一个基础、简单的算法。
2. 使用ceiling analysis,确定改进模块算法的优先级。
然后,对于要改进的模块,
1. 先确定是High Bias还是High variance,从而决定我们要采取的改进方法。
2. 如果是High Bias,那么我们就使用更加复杂的算法;
3. 如果是High Variance:

  • 如果有可能,那么使用更加多的数据;
  • 否则的话,使用正则化。由于正则化的过程我们需要选择一个λ,所以需要使用validation。

[待解决问题:如果机器学习算法本身就是多个假设空间,然后对每一个假设空间进行正则化,那么validation的过程是什么?]

猜你喜欢

转载自blog.csdn.net/wangyanphp/article/details/54572089
今日推荐