标签归档:斯坦福

斯坦福大学机器学习第十一课“机器学习系统设计(Machine learning system design)”

Deep Learning Specialization on Coursera

斯坦福大学机器学习斯坦福大学机器学习第十一课“机器学习系统设计(Machine learning system design)”学习笔记,本次课程主要包括5部分:

1) Prioritizing what to work on: Spam classification example(工作的优先级:垃圾邮件分类例子)

2) Error analysis(错误分析)

3) Error metrics for skewed classes(不对称性分类的错误评估)

4) Trading off precision and recall(精确度和召回率的权衡)

5) Data for machine learning(数据对于机器学习的重要性)

以下是每一部分的详细解读。

1) Prioritizing what to work on: Spam classification example(工作的优先级:垃圾邮件分类例子)

首先让我们来看一下垃圾邮件和非垃圾邮件的例子,以下是一个垃圾邮件示例:

垃圾邮件举例-我爱公开课-52opencourse.com

我们将其标注为“垃圾(spam)", 用1表示;以下是一个非垃圾邮件的例子:

非垃圾邮件举例-我爱公开课-52opencourse.com

我们将其标注为“非垃圾(non-spam)",用0表示。

如果我们有一些这样标注好的垃圾和非垃圾邮件样本,如何来训练一个垃圾邮件分类器?很清楚这是一个有监督学习的问题,假设我们选择逻辑回归算法来训练这样的分类器,首先必须选择合适的特征。这里定义:

x = 邮件的特征;
y = 垃圾邮件(1) 或 非垃圾邮件(0)

我们可以选择100个典型的词汇集合来代表垃圾/非垃圾(单词),例如deal, buy, discount, andrew, now等,可以按它们的字母顺序排序。对于已经标注好的邮件训练样本,如果100个词汇中有单词j在样本中出现,就用1代表特征向量x中的xj,否则用0表示,这样训练样本就被特征向量x所替代:
垃圾邮件分类特征向量表示-我爱公开课-52opencourse.com
注意在实际使用中,我们不会手动去选择100个典型的词汇,而是从训练集中选择出现频率最高的前n个词,例如10000到50000个。

那么,如何高效的训练一个垃圾邮件分类器使其准确率较高,错误率较小?

- 首先很自然的考虑到收集较多的数据,例如"honeypot" project,一个专门收集垃圾邮件服务器ip和垃圾邮件内容的项目;

- 但是上一章已经告诉我们,数据并不是越多越好,所以可以考虑设计其他复杂的特征,例如利用邮件的发送信息,这通常隐藏在垃圾邮件的顶部;

- 还可以考虑设计基于邮件主体的特征,例如是否将"discount"和"discounts"看作是同一个词?同理如何处理"deal"和"Dealer"? 还有是否将标点作为特征?

- 最后可以考虑使用复杂的算法来侦测错误的拼写(垃圾邮件会故意将单词拼写错误以逃避垃圾邮件过滤器,例如m0rtgage, med1cine, w4tches)

2) Error analysis(错误分析)

在我们需要机器学习算法来解决一些实际问题时,建议:

  • - 从一个简单的算法入手这样可以很快的实现这个算法,并且可以在交叉验证集上进行测试;
  • - 画学习曲线以决定是否更多的数据,更多的特征或者其他方式会有所帮助;
  • - 错误分析:人工检查那些算法预测错误的例子(在交叉验证集上),看看能否找到一些产生错误的原因。

假设交叉验证集上有500个邮件样本,其中算法错分了100个邮件,那么我们就人工来检查这100个bad case, 并且按如下的方式对它们进行分类:

  • (i) 邮件是什么类型的?
  • (ii) 什么样的线索或特征你认为有可能对算法的正确分类有帮助?

数值评估的重要性:
在对bad case进行分析后,我们可能会考虑如下的方法:

  • 对于discount/discounts/discounted/discounting 能否将它们看作是同一个词?
  • 能不能使用“词干化”的工具包来取单词的词干,例如“Porter stemmer"?

错误分析不能决定上述方法是否有效,它只是提供了一种解决问题的思路和参考,只有在实际的尝试后才能看出这些方法是否有效。
所以我们需要对算法进行数值评估(例如交叉验证集误差),来看看使用或不使用某种方法时的算法效果,例如:

  • 不对单词提前词干:5%错误率   vs 对单词提取词干:3% 错误率
  • 对大小写进行区分(Mom / mom): 3.2% 错误率

3) Error metrics for skewed classes(不对称性分类的错误评估)

什么是不对称性分类?

以癌症预测或者分类为例,我们训练了一个逻辑回归模型h_\theta(x). 如果是癌症,y = 1, 其他则 y = 0。
在测试集上发现这个模型的错误率仅为1%(99%都分正确了),貌似是一个非常好的结果?
但事实上,仅有0.5%的病人得了癌症,如果我们不用任何学习算法,对于测试集中的所有人都预测y = 0,既没有癌症:

不对称分类预测例子-我爱公开课-52opencourse.com

那么这个预测方法的错误率仅为0.5%,比我们废好大力训练的逻辑回归模型的还要好。这就是一个不对称分类的例子,对于这样的例子,仅仅考虑错误率是有风险的。

现在我们就来考虑一种标准的衡量方法:Precision/Recall(精确度和召回率)

首先对正例和负例做如下的定义:

正负例问题-我爱公开课-52opencourse.com

其中:

True Positive (真正例, TP)被模型预测为正的正样本;可以称作判断为真的正确率

True Negative(真负例 , TN)被模型预测为负的负样本 ;可以称作判断为假的正确率

False Positive (假正例, FP)被模型预测为正的负样本;可以称作误报率

False Negative(假负例 , FN)被模型预测为负的正样本;可以称作漏报率

那么对于癌症预测这个例子我们可以定义:

Precision-预测中实际得癌症的病人数量(真正例)除以我们预测的得癌症的病人数量:

Precision精确度-我爱公开课-52opencourse.com

Recall-预测中实际得癌症的病人数量(真正例)除以实际得癌症的病人数量:

召回率-我爱公开课-52opencourse.com

4) Trading off precision and recall(精确度和召回率的权衡)

假设我们的分类器使用了逻辑回归模型,预测值在0到1之间:0 \le h_\theta(x) \le 1, 一种通常的判断正负例的方法是设置一个阈值,例如0.5:

  • 如果 h_\theta(x) \ge 0.5,则预测为1, 正例;
  • 如果 h_\theta(x) < 0.5, 则预测为0, 负例;

这个时候,我们就可以计算这个分类器的precision and recall(精确度和召回率):

精确度和召回率的权衡-我爱公开课-52opencourse.com

这个时候,不同的阈值回导致不同的精确度和召回率,那么如何来权衡这二值?对于癌症预测这个例子:

假设我们非常有把握时才预测病人得癌症(y=1), 这个时候,我们常常将阈值设置的很高,这会导致高精确度,低召回率(Higher precision, lower recall);

假设我们不希望将太多的癌症例子错分(避免假负例,本身得了癌症,确被分类为没有得癌症), 这个时候,阈值就可以设置的低一些,这又会导致高召回率,低精确度(Higher recall, lower precision);

这些问题,可以归结到一张Precision Recall曲线,简称PR-Curve:

Precision Recall 曲线-PR 曲线-我爱公开课-52opencourse.com

那么如何来比较不同的Precison/Recall值呢?例如,对于下表:

精确度召回率表对比-F值-我爱公开课-52opencourse.com

通常我们会考虑用它们的均值来做比较,但是这会引入一个问题,例如上面三组Precision/Recall的均值分别是:0.45, 0.4, 0.51,最后一组最好,但是最后一组真的好吗?如果我们将阈值定的很低,甚至为0, 那么对于所有的测试集,我们的预测都是y = 1, 那么recall 就是1.0,我们根本就不需要什么复杂的机器学习算法,直接预测y = 1就得了,所以,用Precison/Recall的均值不是一个好办法。

现在我们引入标准的F值或者F1-score:

F值F1值-我爱公开课-52opencourse.com

F值是对精确度和召回率的一个很好的权衡,两种极端的情况也能很好的平衡:

F值-Precision/Recall-我爱公开课-52opencourse.com
5) Data for machine learning(数据对于机器学习的重要性)

在设计一个高准确率的机器学习系统时,数据具有多大的意义? 2001年的时候,Banko and Brill曾做了一个实验,对易混淆的单词进行分类,也就是在一个句子的上下文环境中选择一个合适的单词,例如:
For breakfast I ate ___ eggs
给定{to, two, too},选择一个合适的单词。
他们用了如下几种机器学习算法:

  • -Perceptron(Logistic regression)
  • -Winnow
  • -Memory-based
  • -Naïve Bayes

根据训练集的不同规模记录这几种算法的准确率,并且做了如下的图:

数据对于机器学习的意义

最终得到的结论是:

“It's not who has the best algorithm that wins. It's who has the most data."

选择大数据的理由?

假设我们的特征x \in R^{n+1} 有很多的信息来准确的预测y, 例如,上面的易混淆词分类的例子,它有整个句子的上下文可以利用;

反过来,例如预测房价的时候,如果仅有房屋大小这个特征,没有其他的特征,能预测准确吗?

对于这样的问题,一种简单的测试方法是给定这样的特征,一个人类专家能否准确的预测出y?

如果一个学习算法有很多的参数,例如逻辑回归/线性回归有很多的特征,神经网络有很多隐藏的单元,那么它的训练集误差将会很小,但容易陷入过拟合;如果再使用很大的训练数据,那么它将很难过拟合,它的训练集误差和测试集误差将会近似相等,并且很小。所以大数据对于机器学习还是非常重要的。

参考资料:

机器学习视频可以在Coursera机器学习课程上观看或下载: https://class.coursera.org/ml

第十一课“机器学习系统设计”的课件资料下载链接:
PPT   PDF

http://en.wikipedia.org/wiki/Precision_and_recall

http://en.wikipedia.org/wiki/Accuracy_and_precision

召回率 Recall、精确度Precision、准确率Accuracy、虚警、漏警等分类判定指标

True(False) Positives (Negatives)

http://en.wikipedia.org/wiki/F1_score

 

本系列文章来自我在52opencourse上发布的笔记,这里做个备份,转载请注明出处:
http://52opencourse.com/275/coursera%E5%85%AC%E5%BC%80%E8%AF%BE%E7%AC%94%E8%AE%B0-%E6%96%AF%E5%9D%A6%E7%A6%8F%E5%A4%A7%E5%AD%A6%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AC%AC%E5%8D%81%E4%B8%80%E8%AF%BE-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-machine-learning-system-design

斯坦福大学机器学习第十课“应用机器学习的建议(Advice for applying machine learning)”

Deep Learning Specialization on Coursera

斯坦福大学机器学习斯坦福大学机器学习第十课“应用机器学习的建议(Advice for applying machine learning)”学习笔记,本次课程主要包括7部分:

1) Deciding what to try next(决定下一步该如何做)

2) Evaluating a hypothesis(评估假设)

3) Model selection and training/validation/test sets(模型选择和训练/验证/测试集)

4) Diagnosing bias vs. variance(诊断偏差和方差)

5) Regularization and bias/variance(正则化和偏差/方差)

6) Learning curves(学习曲线)

7) Deciding what to try next (revisited)(再次决定下一步该做什么)

以下是每一部分的详细解读。

1) Deciding what to try next(决定下一步该如何做)

对学习算法进行调试:
假设你实现了一个正则化的线性回归算法来预测房价:

正则化线性回归模型-我爱公开课-52opencourse.com

然而,当你用它来测试一批新的房屋数据时,发现预测出来的数据是很不准确的,那么,下一步你该干啥?以下提供一些选项,但是暂时不过多解释,当我们学完这一章时,就知道选择这些选项的依据了。

- 获取更多的训练样本

- 尝试使用更少的特征的集合

- 尝试获得其他特征

- 尝试添加多项组合特征

- 尝试减小 \lambda

- 尝试增加 \lambda

机器学习(算法)诊断(Diagnostic)是一种测试方法,使你能对一种学习算法进行深入的认识,知道什么能运行,什么不能运行,并且能指导你如何最大限度的提高学习算法的性能。

诊断测试虽然需要一些时间来实现,但是这样做可以更有效的利用你的时间。

2) Evaluating a hypothesis(评估假设)

在房价预测问题中,如果Hypotheis如下:

评估假设hypothesis-我爱公开课-52opencourse.com

定义了如下的特征:

房价预测问题特征定义模版-我爱公开课-52opencourse.com

并且对训练数据做了非常好的拟合:

房价预测拟合图-我爱公开课-52opencourse.com

但是对不在训练集的新数据的预测的很差,失去通用性,那么,我们该如何评估这个假设?

首先,我们需要将数据集进行切分,一部分(例如70%)作为训练集,另一部分(例如30%)作为测试集:

假设评估中的数据集-我爱公开课-52opencourse.com

对于线性回归来说:
- 通过最小化训练集的error J(\theta)来学习参数\theta;
- 再计算测试集的error:

线性回归测试集error-我爱公开课-52opencourse.com

对于逻辑回归来说,与线性回归相似:
-首先从训练集中学习参数\theta;
-计算测试集的error:

逻辑回归测试集error公式-我爱公开课-52opencourse.com

-额外再加一个错误分类的error(或者称为0/1错误分类error);

3) Model selection and training/validation/test sets(模型选择和训练/验证/测试集)

首先让我们来回顾上面那个过拟合的例子:

机器学习模型选择过拟合例子-我爱公开课-52opencourse.com

一旦参数\theta_0, \theta_1,...,\theta_4对于某些数据集(训练集)适应(最终学习的参数),那么基于该数据及参数所计算的模型的error(训练误差J(\theta)很可能比实践泛化的error要小。

所以我们需要考虑一下模型选择(Model Selection)的问题,首先来看一个选择多项式回归模型的例子,我们有1-10次方的多项式回归模型,或者hypothesis:

模型选择多项式回归问题-我爱公开课-52opencourse.com

如何选择模型?

这里我们首先基于训练集学习参数,然后计算测试集的error, 最后选择测试集error最小的多项式回归模型,例如这里我们选择:

5次方多项式回归模型-我爱公开课-52opencourse.com

那么这个模型的泛化能力如何?测试集的error J_{test}(\theta^{(5)})基本能代表它的泛化能力,但是这是否准确?
我们用测试集来选择参数,然后有用测试集来评估假设(hypothesis), 看起来这样的评估是基于测试集进行了优化的?
的确存在一点问题,所以,这里我们再引入第三个集合:交叉验证集,我们用它来选择参数,而仅仅在测试集上评估假设。
对于原始的数据集,一种比较典型的划分方式是60%的训练集,20%的交叉验证集以及20%的测试集:
训练集-交叉验证集-测试集-我爱公开课-52opencourse.com

有了这三个数据集合,我们也可以分别定义它们各自的error:

训练集误差-验证集误差-测试集误差-我爱公开课-52opencourse.com

但是在实际使用时,我们通过训练集学习到参数, 再计算交叉验证集上的error, 再选择一个在验证集上error最小的模型,最后再在测试集上估计模型的泛化误差(error):

实践的模型选择过程-我爱公开课-52opencourse.com

4) Diagnosing bias vs. variance(诊断偏差和方差)

首先看一下偏差和方差的例子,这些例子和正则化那一章的例子相同,不过同时被贴上了偏差或方差的标签:

a) 高偏差(欠拟合):

高偏差-欠拟合-我爱公开课-52opencourse.com

b) 高方差(过拟合):
高方程-过拟合-我爱公开课-52opencourse.com

c) 合适的拟合:
合适的拟合-我爱公开课-52opencourse.com

我们来计算这三个模型的train error和cross validation error:

训练集及交叉验证集的误差-我爱公开课-52opencourse.com

我们会发现:

当多项式回归模型的次数d=1,也就是高偏差(欠拟合)时,训练集误差和验证集误差都比较大;

当d=4, 也就是高方差(过拟合)时,训练集误差会很小(拟合的非常好),但是验证集误差却很大;

当d=2,也就是拟合的刚刚好时,无论训练集误差还是验证集误差都刚刚好,介于上面两者之间。

如果用图形表示,就是下面这个样子:

训练集误差和验证集误差画图表示-我爱公开课-52opencourse.com

有了上面的解释,我们就可以来诊断偏差还是方差的问题了。假设你的学习算法表现的不尽如人意,没有达到你的期望,如何来判定它是一个偏差的问题还是方差的问题?我们可以计算他们的训练集误差和交叉验证集误差,如果它们落入了上图的“头部”区域,可以判断是偏差(欠拟合)问题,如果落入了“尾部”区域,可以判断是方差(过拟合)问题,如下图所示:

偏差问题还是方差问题-我爱公开课-52opencourse.com

最后,对于偏差还是方差的问题,可以做一个总结如下:

偏差方差问题总结-欠拟合过拟合-我爱公开课-52opencourse.com

5) Regularization and bias/variance(正则化和偏差/方差)

对于过拟合问题,正则化是一个非常有效的解决方案,所以这一小节我们将考虑正则化和偏差/方差的关系。首先来看一个正则化的线性回归的例子:正则化的线性回归模型-我爱公开课-52opencourse.com

如果正则化参数\lambda过大,一种极端的情况例如\lambda = 10000, 那么除去\theta_0,所学的其他参数都将近似为0,这就是欠拟合或高偏差的情况:

正则化参数过大欠拟合高偏差-我爱公开课-52opencourse.com

如果\lambda过小,极端的情况是\lambda = 0,等于没有对线性回归模型进行正则化,那么过拟合高方差的问题就很容易出现:

正则化参数过小过拟合高方差-我爱公开课-52opencourse.com

如果\lambda选取的比较合适,介于上述二者之间,那么我们将得到合适的拟合:

正则化参数合适拟合也合适-我爱公开课-52opencourse.com

那么,如何选择正则化参数 \lambda ?

对于数据集,我们仍将它划为3份:训练集,验证集,测试集。对于给定的正则化模型,例如上面的例子,我们按 \lambda 从小到大的顺序依次取数,然后在训练集上学习模型参数,在交叉验证集上计算验证集误差,并选择误差最小的模型, 也就是选择 \lambda,最后再在测试集上评估假设:

选择正则话参数的过程-我爱公开课-52opencourse.com

偏差/方差可以作为正则化参数 \lambda 的函数,与上一小节相似,我们也可以画出这个函数图,这样我们就能评估 \lambda 合适的选择范围了:

作为正则化参数函数的方差和偏差-我爱公开课-52opencourse.com

6) Learning curves(学习曲线)

这一小节考虑Learning curves(学习曲线)的问题,主要针对的是训练样本数目来观察训练集误差和验证集误差之间的差异:
训练集误差交叉验证集误差-我爱公开课-52opencourse.com

以下来考虑训练样本数目和模型的关系。以二次项多项式回归为例,如果仅有一个训练样本,那么模型很容易和样本点拟合,训练集误差近似为0,几乎可以忽略不计,而验证集误差可能会很大;如果有两个样本点,模型也很容易拟合样本点,训练集误差会略大一点,验证集误差可能会小一些;以此类推,当样本点比较多时,模型虽然不能拟合所有的样本点,但是泛化能力会更好一些,因此训练集误差会更大一点,而验证集误差会更小一些,如下图所示:

二次项多项式回归-我爱公开课-52opencoruse.com

而误差和训练样本数目m的关系或者学习曲线如下:

训练误差和验证集误差与训练样本大小的关系-我爱公开课-52opencourse.com

以下通过学习曲线来考虑高偏差和高方差的问题。对于高偏差欠拟合问题:

高偏差欠拟合问题举例-我爱公开课-52opencourse.com

即使增大了训练样本数目,模型拟合的依然不够,依然还是欠拟合问题。以下是高偏差欠拟合问题的学习曲线:
高偏差欠拟合问题学习曲线-我爱公开课-52opencourse.com

我们发现,如果一个学习算法是高偏差的,那么它的训练误差和验证集误差在一定的训练样本数目之后都很高,而且不会随着样本数目的增大而改变,所以对于高偏差欠拟合的问题,增加训练样本数目不是一个好的解决办法。

而对于高方差过拟合问题:

高方差过拟合问题-我爱公开课-52opencourse.com

增大样本数目后,模型的泛化能力会好一些,一些是高方差过拟合问题的学习曲线:

高方差过拟合学习曲线-我爱公开课-52opencourse.com

我们发现,如果一个学习算法是高方差的,那么它的训练误差和验证集误差在一定的训练样本数目之后虽然有差异,但是会随着样本数目的增大而减小她们之间的gap,所以对于高方差过拟合的问题,增加训练样本数目是解决方法之一。
7) Deciding what to try next (revisited)(再次决定下一步该做什么)

好了,说完了这么多与偏差/方差有关的问题,我们再次回到本章的开头的问题,
假设你实现了一个正则化的线性回归算法来预测房价,然而当你用它来测试一批新的房屋数据时,发现预测出来的数据是很不准确的,那么,下一步你该干啥?以下这些选项,分别针对的是高方差或高偏差的问题,你可以尝试用上述小节的一些方法来诊断你的学习算法,不过对于下述选项,需要你考虑一下是针对高偏差还是方差的问题,可以先思考一分钟再看答案:

- 获取更多的训练样本

- 尝试使用更少的特征的集合

- 尝试获得其他特征

- 尝试添加多项组合特征

- 尝试减小 \lambda

- 尝试增加 \lambda

答案:

- 获取更多的训练样本 - 解决高方差

- 尝试使用更少的特征的集合 - 解决高方差

- 尝试获得其他特征 - 解决高偏差

- 尝试添加多项组合特征 - 解决高偏差

- 尝试减小 \lambda - 解决高偏差

- 尝试增加 \lambda -解决高方差

最后我们再来看一下神经网络和过拟合的问题:

以下是“小”的神经网络(参数比较少,很容易欠拟合):

简单的神经网络-我爱公开课-52opencourse.com

它的计算代价较少。

以下是“大”的神经网络(参数比较多,很容易过拟合):

复杂的神经网络-我爱公开课-52opencourse.com

它的计算代价较大,对于神经网络过拟合的问题,可以通过正则化(\lambda)方法解决。

参考资料:

机器学习视频可以在Coursera机器学习课程上观看或下载: https://class.coursera.org/ml

第十课的课件资料下载链接:
PPT   PDF

Mitchell教授的经典书籍《机器学习

李航博士《统计学习方法

机器学习中的数学(2)-线性回归,偏差、方差权衡


如转载52opencourse上的任何原创文章,请注明出处,谢谢!