吴恩达机器学习笔记-机器学习系统设计
确定执行的优先级
我们已经学习过一些机器学习的算法,那么如何设计一个机器学习系统呢,课程中举了一个垃圾邮件分类器的例子,例子比较简单这里就不再赘述:
那么如何来提升这个分类器的准确度呢?有下面几个建议:
- 收集更多的数据
- 增加更复杂的特征(比如邮件头)
- 开发更复杂的算法来鉴定错误拼写
误差分析
如果你准备研发一个机器学习应用,下面有一些关于开发的一些建议:
其中误差分析不一定会对改善算法的表现有帮助,唯一的办法是尝试着去做然后看看其是否能起到效果。并且我们需要设定一个误差的度量值来判断该算法是否是有效的。
偏斜类问题的误差评估
举一个判断癌症的问题,这显然是个分类问题,假设y=1为是癌症,反之则判定为不是。我们可能会设计一个算法,该算法的准确率有99%,也就是说1%的误差。但如果癌症患者实际上只占据0.5%,那么设计一个算法,该算法设定y的值恒为0,那么这个算法的误差率只有0.5%。比之前设计的算法的误差要低,但这个算法显然是不符合要求的,因为它设定y的值为一个固定值,这并不是我们想要的。
像这种分类问题中,正负样本的数量偏差太大,比如这个例子里假设是癌症为正样本,那么这里的负样本的数量显然远远大于正样本,这种情况就叫做偏斜类(skewed classes)。那么在这种情况下,我们需要一个不同的误差度量值,其中一种误差度量值叫做查准率和召回率,如下所示:
假设我们用一个测试集评估一个分类模型,对于测试集中的样本,每个测试集的样本都等于1或者0,学习算法要做的是做出值的预测,并且学习算法会为每一个测试集中的实例做出预测,预测值也是1或者0。那么如上图的2*2的表格。如果有一个样本它实际所属的类是1,预测的类也是1,那么我们叫这个样本为True Positive,意思是算法预测其为1且实际上它的确为1;如果有一个样本所属的类为0,但算法预测的值为1,那么称这个样本为False Positive;如果有一个样本所属的类为1,但算法预测的值为0,那么称这个样本为False Negative;如果有一个样本所属的类为0,且算法预测的值为0,那么称这个样本为True Negative;
所谓查准率(precision),在这里就是实际上患有癌症且我们预测患有癌症的占据所有预测的患有癌症的比例,公式就是:
$$\frac{True Positives}{Predicted Positive} = \frac{True Positive}{True Positive+False Positive}$$
所谓召回率(recall),在这里就是实际上患有癌症且我们预测患有癌症的占据实际上患有癌症的比例,公式就是:
$$\frac{True Positives}{Actual Positive} = \frac{True Positive}{True Positive+False Negative}$$
当查准率和召回率都很大时,我们就可以断定该算法是符合我们期望的。上述例子里,恒为0的那个算法的召回率就是0,因此判定该算法是不符合我们所期望的。
查准率和召回率的权衡
继续讨论上述的癌症判定问题,之前我们判定分类问题时经常设定大于等于0.5则为1,反之为0。但假设这里希望对于判定癌症的肯定程度更高一点,那么就可以设定大于等于0.7的时候才判定为癌症。那么这个时候,按照公式,查准率会变高,召回率会变低。如果假设这里希望不漏过更多可能为癌症的患者,那么久可以设定大于等于0.3时判定为癌症,根据公式,此时召回率会变高,查准率会变低。一般来说这里的判定临界值需要根据不同情况来决定。
那如何来比较这些查准率和召回率呢?下面有三组算法对应的查准召回率:
如果用两者的平均值来衡量算法是否合适呢?我们来看最后一个算法的召回率为1,也就是说假预测所有的数据都为1,这种算法显然是不符合要求的,但其查准召回率的平均值是三者中最高的,显然用平均值来判断是不合适的。这里就提出一个F Score的概念(也叫做F1 Score):
$$F Score = 2\frac{PR}{P+R}$$
用这个值来判定算法是否合适,上述三个算法中,第一个算法的F Score最高,因此可以判定该算法是最合适的。这个F Score没有什么其他特殊含义,但可以给我们选择机器学习算法时起到一个帮助判断的作用。
机器学习数据
在有大量的数据的情况下,并在某种类型的学习算法中进行训练。可以是一种获得一个具有良好性能的学习算法 有效的方法。因此在机器学习中有一个共识:
取得成功的人不是拥有最好算法的人 而是拥有最多数据的人
那么这种说法怎样判断是否正确呢?首先特征x要包含足够的信息来预测y(比如在只给定x的情况下,该领域的专家能自信的预测y),然后,我们要训练一个具有大量参数(能够学习或表示相当复杂的函数)的学习算法,这样可以使得偏差更小,在此之上拥有大量数据的话,可以使得方差减小。这样我们可以得出一个较为良好的算法。