机器学习实战技能

| 研究学术  | 机器学习应用 

对于分类器而言通常需要考虑如下问题:

  • 如何评价分类器性能?
  • 数据需要如何预处理?
  • 如何设计代价函数?
  • 代价函数是凸的么?
  • 如何用最优化方法求解模型参数?
  • 如何调整参数,在Bias和Variance之间寻求平衡?
  • 如何解决多分类问题?
  • 如何处理线性不可分问题?

对于样本动态变化的情况,还需要考虑如何在线学习和动态更新模型参数;对于大规模数据集,需要考虑如何选择合适的模型,如何降低复杂度。

模型选择

本节的主要内容来自Andrew NG的机器学习课程[1]

模型选择主要是通过评估模型效果,评价模型Bias和Variance的状况,选择合适的模型和估计相应的参数。

数据集一般划分为训练集、交叉验证集和测试集3部分,分别占的比例大概是60%、20%和20%1。训练集用于估计模型参数,交叉验证集用于选择模型,测试集用于估计模型的泛化误差(generalization error);选择在交叉验证集上误差小的模型,但是用测试集上误差作为模型的误差。测试集上的数据对参数估计和模型选择都是不可见的,因此才能“公平”的评价模型的性能。

$J_\mbox{train}(\boldsymbol\theta)$、$J_\mbox{cv}(\boldsymbol\theta)$、$J_\mbox{test}(\boldsymbol\theta)$分别表示模型在训练集、交叉验证集和测试集上的误差

\begin{equation} J_{s}(\boldsymbol\theta) = \frac{1}{2m_{s}}\sum_{i=1}^{m_s}\left(h_\boldsymbol\theta\left(\mathbf x_s^{(i)}\right)-y_s^{(i)}\right)^2~~(s = \{\mbox{train},\mbox{cv},\mbox{test}\})。 \end{equation}

Bias vs. Variance

Bias vs. Variance

简单来说,Bias和Variance评价模型的拟合程度,High Bias就是欠拟合(underfit),High Variance就是过拟合(overfit)。对于欠拟合,$J_\mbox{cv}(\boldsymbol\theta)\approx J_\mbox{train}(\boldsymbol\theta)$且都较大;对于过拟合,$J_\mbox{cv}(\boldsymbol\theta)\gg J_\mbox{train}(\boldsymbol\theta)$且$J_\mbox{train}(\boldsymbol\theta)$较小,如上图所示[2]

模型选择与正则化——以多项式回归为例

模型的复杂度和参数估计时采用的正则化参数$\lambda$对模型的Bias和Variance均有影响。

多项式回归模型
图 1: 多项式回归模型 [PNG]

如果选用多项式回归模型,需要选择多项式的次数确定合适的模型。参数估计的时候,可以通过调节正则化系数,平衡Bias和Variance的关系。

多项式次数和正则化系数与误差的关系
图 2: 多项式次数和正则化系数与误差的关系 [PNG]

随着多项式次数$d$的增加, 模型从High Bias变为了High Variance;随着正则化系数$\lambda$的增加, 模型从High Variance变为了High Bias。通过评估调整模型和正则化参数时的误差,确定模型的相关系数。

学习曲线

High Bias和High Variance的学习曲线
图 3: High Bias和High Variance的学习曲线 [PNG]

学习曲线描绘了训练样本数目和误差之间的关系,展示了模型可能存在的问题。通过学习曲线,判断模型是否合适;如果不合适,模型是High Bias还是High Variance,从而有针对性地解决问题。

提升系统性能

提升系统性能可以从三方面入手:数据量、特征维数、模型复杂度。从问题诊断的角度,先判断系统的问题是high bias还是high variance,然后寻找相应的对策:

  • 导致high variance/overfitting的原因:(1)从可学习理论看,数据太少,没有覆盖到测试集;(2)复杂的模型过渡描述简单的数据,严重过拟合,过拟合可以通过增加数据量和降低模型复杂度解决。
  • 导致high bias/underfitting的原因:简单的模型不足以描述复杂的数据,欠拟合可以可以通过增加模型复杂度解决,增加数据量无助于解决该问题。

variance和bias之间的关系可以从模型和数据复杂度的角度理解。如果相对于数据模型太弱,也就是简单的模型无法描述复杂的数据,即使在训练集上也学不会,这就会导致high bias;如果相对于数据模型太强,也就是复杂的模型过渡描绘简单的数据,这就会导致high variance。 因此,假设数据足够,可以只从模型的角度考虑平衡variance和bias:

  • 提升模型复杂度,解决high bias/underfitting:增加特征(包括构造多项式特征,相当于增加模型参数)、选择复杂的模型、减小$\lambda$;
  • 降低模型复杂度,解决high variance/overfitting:加入训练样本(模型相对于数据变弱了)、抽取特征子集(相当于减少模型参数)、选择简单的模型、增大$\lambda$。

在保持模型不变的情况下,增加数据量可以解决过拟合(high variance),减少数据量可以将欠拟合(high bias)变为过拟合。但是,从可学习理论角度,数据总是多多益善。

技术手段 处理问题
加入更多的训练样本 High Variance2
抽取特征子集 High Variance2
增加特征 High Bias
构造多项式特征 High Bias
增大$\lambda$ High Variance
减小$\lambda$ High Bias

Example


Suppose you have a dataset with n = 10 features and m = 5000 examples. After training your logistic regression classifier with gradient descent, you find that it has underfit the training set and does not achieve the desired performance on the training or cross validation sets. Which of the following might be promising steps to take? Check all that apply.

  • [A] Use an SVM with a Gaussian Kernel. (By using a Gaussian kernel, your model will have greater complexity and can avoid underfitting the data.)
  • [B] Increase the regularization parameter $\lambda$.
  • [C] Try using a neural network with a large number of hidden units. (A neural network with many hidden units is a more complex (higher variance) model than logistic regression, so it is less likely to underfit the data.)
  • [D] Reduce the number of examples in the training set. (While you can improve accuracy on the training set by removing examples, doing so results in a worse model that will not generalize as well.)
  • [E] Create / add new polynomial features.

Answer: A C E

数据越多越好么?

并非总是数据越多越好。在获取更多数据之前,先判断模型是否需要更多的数据。

针对Low Bias(或High Variance)的模型,获取更多的数据才能提高模型的性能。如果是High Bias(或Low Variance)的模型,先增加特征(神经网络增加神经元),使模型是Low Bias(或High Variance)的,然后更多的数据才有助于提升模型性能。获取更多数据的方法通常有人工合成、手动搜集标柱等[3]

针对OCR,可以将计算机字库中的标准字体叠加随机背景,然后进行形变,产生更多的样本集。一般而言,通过叠加高斯噪声增大样本集对提升性能帮助不大,除非需要解决的问题的就是高斯噪声下的OCR。

性能评估

本节的主要内容来自Andrew NG的机器学习课程[4]

如何和里评价机器学习算法,尤其是对于有偏的类别而言,单纯的正确率(Accuracy), \begin{equation} \mbox{Accuracy} = \frac{\mbox{true positives + true negatives}}{\mbox{total examples}}, \end{equation} 难以合理评价分类器性能。

比如癌症检测,癌症的概率大概只有0.5左右,对于分类器,采用作弊的方法,即使全部输出非癌症的结果,也可以获得99.5%的正确率。因此需要合理的评估方法,通常采用的是准确率(Precision)和召回率(Recall)。

Precision & Recall

准确率和召回率

准确率,表示正确分类的正样本占输出正样本的比率,

\begin{equation} \mbox{Precision} = \frac{\mbox{true positives}}{\mbox{true positives + false positives}}。 \end{equation}

  • true positives:正确分类的正样本数;
  • false positives:混入输出正样本的输入负样本数。

召回率,表示正确分类的正样本占输入正样本的比率,

\begin{equation} \mbox{Recall} = \frac{\mbox{true positives}}{\mbox{true positives + false negatives}}。 \end{equation}

  • false negatives:混入输出负样本的输入正样本数。

根据应用的具体需求,可以在准确率和召回率之间折中。若采用Logistic回归分类器,调高分类的阈值,可以提升该类别分类的准确率和降低召回率。

正样本的召回率也可称为Sensitivity,负样本的召回率称为Specificity,

\begin{equation} \begin{aligned} \mbox{Sensitivity} &= \frac{\mbox{true positives}}{\mbox{true positives + false negatives}}\\ \mbox{Specificity} &= \frac{\mbox{true negatives}}{\mbox{true negatives + false positives}}, \end{aligned} \end{equation}

那么有

\begin{equation} \begin{aligned} \mbox{False Negative Error Rate} &= 1 - \mbox{Sensitivity}\\ \mbox{False Positive Error Rate} &= 1 - \mbox{Specificity}。 \end{aligned} \end{equation}

$F$/$F_1$ Score

采用准确率和召回率可以合理评估分类器性能,但是两个数值不如单数值的评估直接明了。$F$/$F_1$ Score是基于准确率和召回率的单数值评估指标,

\begin{equation} F = 2 \times \frac{\mbox{Precision}\times\mbox{Recall}}{\mbox{Precision} + \mbox{Recall}}, \end{equation}

数值越高表示效果越好。

数据为王

数据集大小对准确率的影响

通常而言,增加参数数目(比如:Logistic回归增加特征数目,神经网络增加隐藏层神经元)和训练样本数目,可以提升分类器的性能。增加参数数目可以获得Low Bias($J_\mbox{train}(\theta)$小),增加样本数目可以获得Low Variance($J_\mbox{test}(\theta)$小)。

“It’s not who has the best algorithm that wins. It’s who has the most data.”[4, P. 16]

在大规模数据上训练模型,取得良好效果的前提条件是:

  1. 模型具备足够多的参数,能够表示复杂的函数;
  2. 特征$\mathbf x$包含了预测$y$的足够信息(例如:该领域的专家可以仅仅通过$x$的有把握地预测$y$)。

Guo-Xun Yuan等撰文指出[5],对于大规模数据的应用而言,线性分类器可能获得和非线性分类器接近的性能,并且训练和测试的速度要快得多。

提升关键步骤性能

针对一个机器学习应用的流水线,找出影响性能的瓶颈,对症下药,才能更有效的改善性能[3]

学习字符分割间隔的神奇方法
图 4: 学习字符分割间隔的神奇方法 [PNG]

对OCR问题而言,通常分为文字检测、字符分割、字符识别几个步骤。提升OCR性能,需要先定量分析究竟哪个步骤对性能的影响最大,然后有针对性的解决。

Ceiling Analysis
图 5: Ceiling Analysis [PNG]

上图给出了通过Ceiling Analysis分析出关键问题的示例,系统的总体精度是$72\%$。如果手动标注(检测定位)待识别的文字区域(也就是让文字都正确定位),那么系统的精度会提升到$89\%$;如果继续将所有的字符都正确分割出,精度会提升到$90\%$。从而可得出,字符检测可以提升$17\%$的精度,字符识别可提升$10\%$的精度,首先从这两个地方改善性能,字符分割对性能的提升只有$1\%$,可先不考虑改进。

人脸识别
图 6: 人脸识别 [PNG]

上图给出了对人脸识别的Ceiling Analysis,可以看出预处理的背景移除对提升性能影响不大,仅仅为$0.1\%$,这个步骤其实可以去掉。人脸检测才是影响性能的关键。

参考资料

  1. [1]A. Ng, “Advice for applying machine learning.” Coursera, 2014. [Online]
  2. [2]P. Domingos, “A few useful things to know about machine learning,” Communications of the ACM, vol. 55, no. 10, pp. 78–87, 2012.
  3. [3]A. Ng, “Application example: Photo OCR.” Coursera, 2014. [Online]
  4. [4]A. Ng, “Machine Learning System Design.” Coursera, 2014. [Online]
  5. [5]G.-X. Yuan, C.-H. Ho, and C.-J. Lin, “Recent Advances of Large-Scale Linear Classification,” Proceedings of the IEEE, vol. 100, no. 9, pp. 2584–2603, 2012.

脚注

  1. 对于不需要做模型选择的情况,只需要训练集和测试集,样本的比例通常是70%和30%。 

  2. Not good if you have high bias  2


打赏作者


上一篇:机器学习资源     下一篇:支持向量机简介