机器学习(12):吴恩达笔记

  • 这篇文章主要看下机器学习时要着重考虑的几个问题。我们以垃圾邮件分类为例,给定一些加了标签集的训练集,垃圾邮件y=1,非垃圾邮件y=0,通过监督学习构造分类器。

image
### 首先,考虑如何构造向量X

  • 在垃圾邮件分类中,我们可以给出一些区分垃圾和非垃圾邮件的单词,如deal、buy、discount是垃圾邮件常有的词,名字(Andrew)、now(表示比较急)是非垃圾邮件常有的词。我们选出这样的单词,有为1,没有为0,用特征向量表示
  • 上边的特征由我们手动选择,而在实际工作中,我们往往选出邮件中出现频率较多的词,作为特征向量

image

其次,我们考虑下使用哪种方法改进算法,来提高垃圾邮件分类器的准确度

  • 在直觉上,我们会先想到收集大量数据,但是这不一定有用
  • 除此外,我们也可以考虑使用更复杂的特征变量。

(1)因为垃圾邮件常常通过不常见的服务器发送,来源模糊,所以我们可以用邮件路径信息作为特征变量
(2)相同词义的不同词性作用相同,如discount=discounts、deal=dealer;大小写作用相同;垃圾邮件的标点符号有一定的特点(促销邮件使用大量!!!);垃圾邮件可能会用故意的拼写错误来避免被垃圾邮件特征单词筛出
image

### 误差分析:如何选择合适的改进算法的方法

  • 误差分析,指我们在构建机器学习程序时,最好不要先建立复杂的系统、构建复杂变量,而是先构建简单的算法来很快学习出模型来。尽管模型的效果可能不好,但我们可以找到误差产生的地方,来进一步决定是增大数据集还是使用复杂特征变量
  • 使用误差分析,是因为我们缺少学习曲线,不能提前知道是需要复杂变量还是更多数据,也就不知道把时间花在什么地方来提高效率。我们先构造简单的算法画出学习曲线,以此避免编程中的过早优化问题:我们必须用证据领导决策,而不是凭直觉,因为直觉往往是错误的
  • 误差分析的前提:虽然算法有简单和复杂之分,但是不同算法出现的错误一般是同样的,即一般都会把某些邮件错误的分类
  • 在垃圾邮件分类的例子中,我们学习到简单的模型,并交叉验证后。人工检查出现的错误,找出系统规律,看看哪一类的邮件总是被错误的分类,进而启发我们构造新的特征变量来提升算法
  • 我们发现错误分类的邮件中,卖药邮件12封、仿品邮件4封、钓鱼邮件53封、其余邮件31封。可以看出算法区分钓鱼邮件的表现很差,所以我们就多研究研究这方面,构造更好地特征变量区分钓鱼邮件
  • 我们看一下哪些方法能帮助我们更好地分类钓鱼邮件,检查拼写错误能检查出5封、检查不寻常的邮件路径来源能检查出16封、标点符号能检查出32封,看出标点符号是作用很强的特征,所以花费时间构造关于标点符号的特征复杂变量
    image
  • 综上,误差分析是一个手动监测的过程,来检测可能发生的错误

评估算法的数值计算方法

    • 在构造算法时,有一种数值计算的方式来评估机器学习算法是很有用的。
    • 在垃圾邮件分类的例子里,我们经过误差分析,考虑构造新的特征变量,将discount、discounts、discounts、discounting视为等同。在自然语言处理中,这可以通过porter等词干提取软件实现,软件通过检查开头几个字母是否相同,来判断是否视为等同
    • 但是检查开头几个字母得到的结果不一定正确,如universe、university就不一个意思。所以我们增加这个特征后,很难知道效果好不好
    • 所以我们通过交叉验证,看使用词干提取和不使用词干提取的错误率,看决定是否增加这个特征

    image

    • 总的来说,误差分析能帮助我们找到算法的劣势,启发我们提出改进方案;数值评估则负责评估改进方案是否提升了算法的效果。但是,数值评估需要有一个合适的误差度量值,有时候错误率作为误差度量值不合适,因此我们要找到合适的误差度量值

    偏斜类

    image

    • 在肿瘤分类的例子中,假设我们得到的模型用测试集检验只有1%正确率,从错误率角度看已经非常不错了。但是在测试集中只有0.5%的人得了癌症,那么1%的错误率就不那么友好了
    • 我们若假设y总是为0,即预测所有人都不得癌症,这时候错误率才0.5%,比1%的错误率更小,但这显然是不合适的。
    • 当一个类的样本数远多于另一个类的样本数,或者说当正样本和负样本的比例接近一个极端时,这种情况称为偏斜类。这时我们使y恒等于0或1时,错误率非常低,但是模型质量实际上很差。所以我们希望遇到偏斜类时,能使用另外的误差度量值评估算法,即召回率和查准率
    查准率和召回率

    image

    • 先看下这四个定义:

    (1)真阳性:实际上y=1,预测y=1
    (2)真阴性:实际上y=0,预测y=0
    (3)假阳性:实际y=0,预测y=1
    (4)假阴性:实际上y=1,预测y=0

    可以看出,真假是对预测值是否正确而言,阴阳是对预测值而言

    • 有了上边四个定义,我们就可以引入查准率和召回率了

    (1)查准率:对于所有预测患有癌症的病人,实际上真正患有癌症的病人占的比例。高查准率表明对于病人,我们预测他们得了癌症具有很高的准确率
    (2)召回率:所有实际上患有癌症的病人,我们能预测出来的比例。

    通过这两个,我们可以判断对于偏斜类的分类模型到底好不好。值得注意的是,这里查准率和召回率的阳性定义为y=1,这并不绝对,一般那个出现的比较少,我们就把那个定义为阳性

    • 查准率和召回率能够较好的解决偏斜类问题。当我们总是预测y=0,级没有人患癌症,就没有真阳性,召回率为0
    查准率和召回率的权衡

    image

    • 在癌症预测的例子中,我们用逻辑回归模型训练数据,输出在0~1间的概率值。并且一般情况下,当h函数大于等于0.5时预测为1
    • 但是,我们希望能在非常确信的情况下,才预测一个人得了癌症。因为告诉病人他得了癌症意味着非常坏的消息,他会经历一段非常痛苦的治疗过程。
    • 所以,我们修改算法,把临界值设为0.7,即只有在概率比较高的情况下才预测病人得了癌症。这样,我们预测的癌症病人中,非常大概率真正患有癌症,这样就有高查准率、低召回率
    • 但是,另一方面,我们又希望能避免遗漏掉患有癌症的病人,即避免假阴性的出现。所以我们将概率设的低一点(0.3),这样真正患有癌症的人就能大部分被标记出来,但是预测的人中有很大部分并没有患癌症。这会导致低查准率、高召回率
    • 综上,查准率和召回率两者不可兼得,我们需要权衡,看看更看重哪一个
    如何使用查准率和召回率比较模型好坏
    • 前边我们使用错误率作为评估度量值时,只需要比较一个实数;而这里我们有两个数需要比较,如何确定一个评价标准,即怎么知道是0.5、0.4好,还是0.7、0.1好呢?
    • 首先,我们提出了计算查准率和召回率的平均值。但是这样有局限性,如我们总预测y=0,会得到接近0的召回率和接近1的查准率,这样可能取平均值还是比较高。所以取平均值不是评估算法的好办法
    • 因此我们用F值评估。F值也考虑了平均值,但是会给较低的值更大的权重。从分子可以看出来,分子是乘积,所以一个是0整个就是0。F值返回一个0~1的数值

    image

    • 我们可以试一试不同的临界值,然后在交叉验证集上做测试,看看那个F值最高

    数据量的重要性

    • 前边我们讨论了模型的评价指标,下边我们来看下数据量的重要性
    • 之前,人们做了一个研究。来比较不同算法的效果,以及这些算法用到不同训练集大小上的效果。问题是如何在易混淆的词间进行分类(to、two、too),人们使用了方差、winnow算法、基于内存的学习算法、朴素算法四种算法,并改变数据量大小,进行了实验。

    image

    • 结论:无论算法好坏,大部分算法的性能都是类似的,但是随着训练数据量的增大,算法性能逐渐增强。因此,数据量是非常重要的,一个劣等的算法如果数据量远大于优等算法的话,可能会取得更好的效果
    • 普遍共识:最好的不是拥有最好算法的,而是拥有最多数据的。
    • 但是数据量的重要性有一个前提,就是特征集x能包含足够多的信息来预测y。例如在单词分类中,空白周围的词语给了足够的信息;而在房价预测中,如果我们只给大小,没有位置、装修、卧室数量的话,就很难预测价格
    • 我们可以这样看特征是否提供了足够的信息,如果把句子给英语专家看,能预测出来;但是只给售楼小姐看大小,预测不出房价

    image

    • 综上,得到高性能算法的关键:

    (1)特征值包含足够多的信息能够预测y
    (2)具有大量的训练数据。训练数据过大,大于特征数量,可以避免过拟合,使训练误差接近测试误差
    (3)使用很多参数的学习算法,如多特征线性回归和逻辑回归、有很多隐藏单元的神经元。多参数可以拟合非常复杂的参数,减小训练误差
    image

    你可能感兴趣的:(机器学习)