0%

Part1-机器学习系统设计

Part1-机器学习系统设计

确定执行的优先级

假定需要搭建一个垃圾邮件分类器,它是一个监督学习,输入x是邮件的特征,y是1(垃圾邮件)或0(非垃圾邮件)

对于邮件特征如何选取呢?

可以选择100个可以表示垃圾或非垃圾邮件的单词

如:选择的单词是:deal,buy,discont,now,...

则对于邮件内容为Deal of the week! Buy now!对应的x可能是:

\(x=\left[ \begin{matrix} 0\\ 1 \\ 1 \\ \cdots \\ 1 \\ \cdots \end{matrix} \right]\begin{matrix} discont\\ buy \\ deal \\ \cdots \\ now \\ \cdots \end{matrix},\ x\in \mathbb R^{100}\)

即:\(x_j = \left\{ \begin{align} &1,如果x_j出现在邮件中 \\ &0,如果x_j没有出现在邮件中 \end{align} \right.\)

注:在实际工作中,普遍的做法是在训练集中选出出现频率最多的n个单词(n通常在10000到50000之间),然后将它们作为特征向。

如何在有限时间下,尽可能降低错误率呢?

  • 收集大量的数据
  • 使用更加复杂的特征(如:邮件头信息、邮件主体信息、检测拼写错误)

误差分析

推荐方法:

  • 通过一个简单的算法来快速实现它,然后在交叉验证集上验证
  • 画出学习曲线来检测出高偏差问题或高方差问题,然后判断是否使用更多数据或特征
  • 误差分析:说明当前系统的优缺点,指导我们想出办法来改进。如实现垃圾邮件分类器时,观察交叉验证集的情况,然后看看那些被错误分类的文件,观察它们共同的特征和规律,进而设计新特征

例:

假设我们正在做一个垃圾邮件分类器,\(m_{cv}=500\),假设结果有较高的错误率,错误分类了100个交叉验证集样本,现在,我们要做的是手动核查这100个错误,然后手工为它们分类,同时考虑:

  1. 这些邮件是什么类型的邮件(如:卖药的、卖假货的、钓鱼的等)
  2. 有什么线索或特征能帮助正确地进行分类(如:拼写错误、奇怪的邮件头、奇怪标点等)

数值估计的重要性

对学习算法要有一种数值估计的方法,意思就是当改进学习算法时,如果算法能够返回一个数值评价指标,来估计算法执行的效果,将会很有帮助。

如:决定是否应该将 discount/discounts/discounted/discounting 视为同一个单词?

可以使用词干提取软件

误差分析或许无法帮助决定它对于算法结果是否有效果,唯一的做法就是尝试它,其后看它在实际中是否有用。而如果要这样做的话,通过数值估计来评估算法的效果将会非常有用,如:

在不使用词干提取时,错误率为5%;在使用词干提取时,错误率为3%,则可以很快判断出使用词干提取是一个有效方法。

在这个特征问题下,这是很自然的单一规则的数值评价指标,就叫做交叉验证错误率,但也有一些其它带有数值评价指标的例子,还需要进行一些处理。

注:通常推荐在交叉验证集上进行误差分析

不对称性分类的误差评估

例:

以癌症分类为例,我们拥有病人的特征变量,我们希望知道他们是否患有癌症。则:

训练逻辑回归模型\(h_\theta(x)\) (y=1表现患有癌症,y=0表示没有)

假设我们在测试集上测试,发现错误率只有1%,有99%的正确诊断,看起来不错,但是假如我们发现在测试集中只有0.5%的患者真正得了癌症,因此在我们的筛选程序中,有0.5%的患者患了癌症。

因此,在这个例子中,1%的错误率就不再显得那么好了,因为:

假设我们的算法所有的输出都\(y=0\),则意味着,其实错误率只有0.5%,这甚至比上述例子更好,这是一个非机器学习算法。

这种情况发生正例和负例的比率非常接近于一个极端情况,我们把这种情况称为不对称性分类,这种情况下,使用分类误差或分类精确度来作为评估度量就可能会产生如下问题:如有一个算法的精确度是99.2%,即误差只有0.8%,假设对算法进行了一些改变,结果精确度变成了99.5%,这样到底是否是算法的提升呢?使用数值对误差进行评估是调整算法非常有用的一种方法,而如果有一个不对称分类的话,用分类精确度就并不能很好地衡量算法,此时就需要一个不同的误差度量值或者不同的评估度量值。

查准率/召回率

假设我们正在使用测试集来评估一个分类模型,对于测试集中的样本,假设是一个二分类问题,则每个结果都会为0或1,我们的学习算法要做的就是值的预测,并且学习算法会为每个测试集中的实例做出预测,预测值也是0或1,即如图:

这样,我们就有另一种方式来评估算法的表现,我们要计算两个数字,查准率召回率

查准率:(对于所有我们预测患有癌症的病人中有多大比率的病人是真正患有癌症的?)

\(查准率=\frac{True\ positive}{\#predicted\ positive}=\frac{True\ positive}{True\ positive+False\ positive}\)

召回率:(如果所有测试集或验证集中的病人,确实得了癌症,有多大比例我们正确预测他们得了癌症,召回:可以理解为挽救了多少病人)

\(召回率=\frac{True\ positive}{\#actual\ positive}=\frac{True\ positive}{True\ positive+False\ negative}\)

这样,对于上述的预测值总是\(y=0\)的,则召回率就是0,这样就能轻易发现算法的问题。

总之,如果一个分类模型,具有较高的查准率和召回率,则可以确信地说这个算法表现很好

查准率和召回率的权衡

假设还是以上述癌症预测为例,我们使用逻辑回归预测\(0 \le h_\theta(x) \le 1\),则如果\(h_\theta(x) \ge 0.5,y=1\)\(h_\theta(x)<0.5,y=0\),假设我们想要能非常自信地说明\(y=1\)的情况,由于癌症对于人的影响是较大,所以在有较高准确性前,不能随意判断。

这样,一种方法是调整阈值,即:\(h_\theta(x) \ge 0.7,y=1;h_\theta(x)<0.7,y=0\),这样就会有较高的查准率,而召回率则会降低。

同样的,假设我们希望避免遗漏掉患有癌症的人,由于如果一个人患有癌症,但我们并没有告诉他,则这可能造成严重后果,这种情况下,我们就需要将阈值设置得较低,如0.3,这样就会有较高的召回率,而查准率则会降低。

对应地,可能画出它们之间的关系曲线,如图(也有可能是其它样式的):

\(F_1\)值 (F值)

如何比较不同的查准率和召回率?具体地,如果我们有如图三个算法对应不同的查准率和召回率,如何进行比较?

可能可以使用平均值:\(Average=\frac{P+R}{2}\),但这可能并不是一个很好的解决办法,因为其对于极端情况处理不好

使用\(F_1\) Score:\(F_1=2\frac{PR}{P+R}\)

通过\(F_1\)值计算,可以得出三个算法对应的值分别是:0.444,0.175,0.0392;可以看出,算法1相对较好

\(P=0或R=0 \Rightarrow F=0\)

\(P=1且R=1 \Rightarrow F=1\)

机器学习数据

如图,大多情况下,随着数据集的增大,算法表现会越来越好

大数据原理

  • 假设特征\(x\in \mathbb R^{n+1}\)包含足够的信息来正确地\(y\)

    如对于房价预测中,只给定房屋面积,而没有其它信息,即使数据再多,可能预测结果也不是那么准确。

    或者说:给定这个输入x,如果是人类专家,能准确地预测出y么?

  • 使用一个具有很多参数的学习算法(如:有许多特征的逻辑回归或线性回归、有很多隐藏单元的神经网络)(本身就是低偏差、高方差的模型)

  • 使用非常大的数据集