给定一个问题,如何设计机器学习系统来解决此问题?
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 确定是欠拟合还是过拟合
根据 Eout≤Ein+ϵ 和欠拟合、过拟合的定义:
对于欠拟合, Ein 很大, ϵ 较小,从而 Eout≈E