您的位置:首页 > 其它

机器学习(十六) - Machine Learning System Design

2017-07-27 14:11 441 查看

Building a Spam Classifier

Prioritizing What to Work On

假设我们现在有一个任务,是建立一个垃圾邮件分类器。首先我们想到可以通过邮件里的内容来进行分类,比如人工选出100个词,作为100个特征xj,如果该词存在于邮件当中就将该词对应的xj置为1,否则为0。当我们建立好训练集,就可以开始对模型进行训练,训练完成之后就可以开始分类了。



实际中,人工选择特征是不太准确的,一般我们选取训练集中出现频率最高的n个词(10000~50000),这样更具有实际意义。

当我们建立好模型,也训练好了。接下来我们的任务就是如何提高我们分类器的准确率了。对于垃圾邮件分类器来说,我们有三个方向的选择:

1. 收集大量的数据

2. 选择、运用复杂的特征(如利用email的header数据)

3. 编写精细复杂的算法去处理我们的输入(如识别垃圾邮件中的故意的错误单词拼写)

如果不进行任何分析,很难说我们需要从哪方面入手对我们的模型进行优化。

Error Analysis

由于机器学习算法有很多优化方向,而且实际中任何优化方向都会花费我们很多的时间。凭直觉选择或者随意选择都是不合理的,于是我们需要对我们的算法模型进行error analysis。

接下来为Andrew Ng教授给出的推荐步骤:

1. 首先给出一个可以很快编写和运行的简单算法和模型,然后进行训练,最后用验证集进行测试。(不要一开始就去追求复杂的算法,不要想着一开始就能取得一个理想的test error,而浪费更多的时间)

2. 画出学习曲线,决定模型是需要使用更多的数据,还是需要更多的特征等

3. 误差分析:除了使用学习曲线,还有一种非常有效的方法叫作误差分析。人工地检查在验证集中被我们的算法错误分类的数据,从这些分离出的数据集中我们探究是否存在某种趋势或某种特征导致分类失误,例子如下。



通过上图,我们发现有一半的错误分类邮件都是关于盗取密码的,这关于盗取密码的53封错误分类邮件中,又有32封邮件有着胡乱使用标点符号的特征。那么我们就可以有针对性的对这类邮件进行处理并添加标点符号这一特征。

当我们完成了改进,很重要的一点,我们需要一个单一的数值结果来表征我们的error,否则我们很难去描述我们的模型算法的效果。通过这个单一数值,我们就能知道,当我们使用了新的特征,新的数据处理算法,模型是否变好了。



Handling Skewed Data

Error Metrics for Skewed Classes

刚刚我们提到单一数值的误差度量是很重要的,我们需要通过这个数值来评判我们模型的好坏和泛化能力。对于分类问题,如果我们一般采用classification accuracy(classification error),即正确分类的样本数除以总样本数。但是这样的误差度量对于带有skewed class(倾斜类)的样本来说不是很准确。所谓skewed class就是样本中,一类样本特别少,另一类样本特别多的情况。下图为例:



如上图,如果我们的模型在test set上的error仅有1%,乍看之下,我们的模型挺棒的,但是如果我们的样本中仅有0.5%的病人有癌症,那么对于这个test set我不需要任何复杂的算法,我只需要全部预测为没有癌症,error只有0.5%比之前的1%还要低,那么显然这样的误差度量是不合适的。下面我们将要介绍另外两种评价度量Precision/Recall(准确度/召回率)。



首先需要说明的是,y=1代表我们想要探查样本中少的那一方(比如对于是否有癌症,有癌症表示为y=1)。

Precision

对于所有我们判定y=1的类,实际上有多少比例是真正的y=1

Recall

对于所有的真正y=1的类,实际上我们判定了多少比例的y=1

对于刚刚的情况(只有0.5%的人患有癌症,如果我们全部判定没有癌症),accuracy为99.5%,recall为0,那么显然这个算法就有问题,不能使用。

Trading Off Precision and Recall

有了Precision和Recall,我们就能解决带有skewed class的样本问题。在实际问题中,很多时候我们需要对Precision和Recall进行一定的权衡。我们依然以判定是否病人有癌症为例。

我们知道运用逻辑回归,一般我们将阈值设置为0.5,即当hθ(x)≥0.5预测y=1,hθ(x)<0.5预测y=0。但其实我们可以调整阈值来达到不同的效果:

1. 阈值高

我们希望我们判断的准确度高,即要么我们不下判断,一旦下了判断y=1,那么这个样本实际上就属于y=1(即判断一个病人有癌症,那么他就有癌症),但是这种情况容易漏掉很多y=1的样本(即他有癌症,但是我们判定他没有癌症),召回率低。

2. 阈值低

我们希望我们需要判断出样本中所有的y=1,即宁可错判,也不要放过一个(为了避免错将有癌症的人判定为没有癌症,耽误他们的治疗)。这样做的话,召回率就高,当然准确率就会比较低了。



那么接下来的问题是如何判定这个算法和模型的好坏呢,如果是只有单一数值度量,那么当然我们就可以直接运用这个度量来进行评判。但是对于带有skewed class的样本有了两个测量值(准确度和召回率),就需要把它们结合起来转化为一个数值度量,因此我们引入 F1 Score。



不必纠结于 F1 Score 的实际意义,实际上它不具备什么实际意义,只是很好的把准确度和召回率结合了起来。那么实际运用当中,我们要如何设置我们的阈值呢,等价于模型选择时对次方的设置,以及正则系数的选择,我们需要设置一系列的阈值,然后通过验证集来找到一个对于这个任务的最佳的阈值。

Using Large Data Sets

对于机器学习任务来说,很多时候不是谁的算法好谁就能取得很高的accuracy,而是取决于谁的训练数据大,如果训练数据大小差上好几个量级,再好的算法也是无济于事的。



但是我们前面也经常提到过,并不是所有的情况下,只要增大数据集就有效,这与上面的说法并不矛盾,因为训练集大正确率就高是有前提条件的。就是我们选取的feature带有足够的信息以至于能够很好的预测 y 。那么怎么判断我们选取的特征带有足够的信息呢,我们只需要知道在人类相应领域的专家能否通过这些特征很好的预测出 y 就行了,如果可以说明这些特征足够了,如果不行,说明这些特征不够或者特征选取有误。因为一味增加数据集对欠拟合的模型是没有帮助的。



最后下面这张图就是讲述了大数据集能够取得很好的error的道理。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息