目前,我们对机器学习的算法也有了一定的了解,这一节将会给大家一些建议,关于如何有效的使用机器学习算法。对于相同的算法,不同的人会使其发挥不同的效果,所以,这一节的主题就是教大家如何用机器学习算法解决具体问题。

主要内容

  • 学习算法的调试诊断方法

  • 误差分析和消蚀分析

  • 如何求解机器学习问题

    例:过早优化问题(软件编写过程中让代码高速运行)

一、学习算法的调试问题

举个例子:

垃圾邮件识别系统,仔细筛选过后得到100个词作为特征(而不是词典中的50000+个词汇)。

使用的算法是贝叶斯逻辑回归,用梯度下降算法实现,测试误差为20%,这是一个不能接受的较高的误差。

这是贝叶斯逻辑回归,有点像最大似然估计,但是这里多了一项惩罚项,以防止过拟合。

我们的问题是:当你实现了贝叶斯逻辑回归并且经过测试得到了较高的误差,那么接下来该怎么办?

通常来说,我们会想方设法的改造算法,比如有如下几种解决方式:

1.使用更多的训练样本

2.使用更少的特征(特征太多缩小范围)

3.使用更多的特征(扩大范围继续找)

4.更改特征 邮件标题特征 vs 邮件内容特征

5.梯度下降可能没有收敛,再多次运行梯度下降

6.使用牛顿算法收敛(效果好)

7.调节参数 λ \lambda的值

8.使用SVM算法(效果好)

上述列举了几种改进算法的可能,这样的方法可能对算法有效,但非常耗费时间,且很大程度依赖于运气。

这八种改进方法处理的都是不同的问题,可能其中的一些方法根本不需要,如果可以排除其中的六项——通过某种方式深度的分析问题,就可以节省很多时间。

一般来说,不应该随意的改变学习算法,但改进方法如此之多,也不能一个一个的去尝试,更好的方式就需要通过不同的诊断方法来确定问题,之后再修正这些问题

之前举的例子中贝叶斯逻辑回归的误差太大了,假设我们认为可能是过拟合导致的问题(高方差),或者使用的特征太少了(高偏差)。那么应该怎样确定是高方差还是高偏差呢?

高方差存在一个特点:因为数据拟合的好,所以训练误差将会远远小于测试误差。高偏差的话,那么训练误差也会很高。

在高方差的前提下,随着训练集的增加,测试误差会逐渐减小(绿线),而训练误差会逐渐增加,(红线表示预期的误差)。同样也可以通过这个图,判断训练误差与测试误差的差距,如果差距很大,那么可以通过增加训练集的大小来缩短二者之间的差距。

在高偏差的前提下,随着训练集的增加,测试误差会逐渐减小并最终趋于平缓不再变化,训练误差会逐渐增加。如果发现训练误差超过预期误差了,那么即使增加再多的数据集,训练误差也不会发生改变,不能将其拉回到预期的误差。

那么,判断测试误差(绿色的曲线)是继续向下还是水平不变是比较困难的,所以判断高方差还是高偏差的问题的方法是通过观测测试误差与训练误差的差距

通过对上述问题的解答,我们回过头来看最初列举出的八种解决问题的方法。

1.使用更多的训练样本 【解决高方差问题】

2.使用更少的特征(特征太多缩小范围) 【解决高方差问题】

3.使用更多的特征(扩大范围继续找) 【解决高偏差问题】

4.更改特征 邮件标题特征 vs 邮件内容特征 【解决高偏差问题】

之后,我们针对后面的四种方法设计诊断方法。下面我们来看另外一个例子:

垃圾邮件分类系统中,使用贝叶斯逻辑回归算法,最终判断垃圾邮件时有2%的误差,判断非垃圾邮件时有2%的误差。系统会漏掉2%的垃圾邮件还可以接受,但同时有2%的非垃圾邮件被拒绝是不能忍受的。

同样是垃圾邮件分类系统,通过SVM中的线性核算法,判断垃圾邮件时有10%的误差,判断非垃圾邮件时有0.01%的误差,这种解决方法更让人接受。

那么问题来了:如果你想用逻辑回归来实现垃圾邮件分类(可能因为逻辑回归运行效率高,更方便blablabla)可是现在逻辑回归的效果并不好,那么我们该怎么办?

非常常见的问题:你可能会怀疑逻辑回归算法并没有收敛。

图中曲线意味着逻辑回归算法要优化的目标 J(θ) J(\theta),随着迭代次数的增加,很难区分曲线是上升状态还是水平保持不变。所以相对于查看曲线的状态,我们还需要其他的方法来判断算法是否收敛。

另一个怀疑的问题是:我们是否找到了正确的优化函数。

上述等式是对所有预测正确的样本进行加权求和,意味着预测准确率。非垃圾邮件的权值要比垃圾邮件的权值大,因为我们更看重非垃圾邮件的准确率。

针对贝叶斯逻辑回归来说,它的优化目标是上述等式,基本上就是最大似然,只不过多了一个惩罚项。那么针对误差问题,我们是应该改变 λ \lambda的值,还是改变使用的参数?亦或是更改成SVM的优化目标?

那么接下来要讲的第二种诊断方法,用来帮助判断问题到底是因为算法的收敛上,还是出在一开始对于目标函数的选择上。

让我们再次回顾之前举的例子,SVM的效果比逻辑回归效果要好,但我们要用逻辑回归这一算法。那么用 θSVM \theta_{SVM}代表由SVM生成的参数,用 θBLR \theta_{BLR}代表由贝叶斯逻辑回归生成的参数。

因为SVM比贝叶斯逻辑回归效果要好,所以有 α(θSVM) \alpha(\theta_{SVM}) > α(θBLR) \alpha(\theta_{BLR})(加权准确率)。贝叶斯逻辑回归的目标是 J(θ) J(\theta),为了判断问题到底出在哪里,那么我们的诊断方法就是要比较 J(θSVM) J(\theta_{SVM})和 J(θBLR) J(\theta_{BLR})之间的大小

一种情况是:

我们知道,逻辑回归的目的是将 J(θ) J(\theta)最大化,而现在的等式中SVM获得使 J(θ) J(\theta)更大的值,那么问题出在算法没有收敛上。

另一种情况是:

这一不等式意味着,逻辑回归算法成功的将 J(θ) J(\theta)最大化,但是SVM在加权准确率方面做得更好。这表明最大化 J(θ) J(\theta)并不意味着可以最大化加权准确率。这也就说明 J(θ) J(\theta)可能是一个错误的目标函数。

通过对上述问题的解答,我们回过头来看最初列举出的八种解决问题的方法。

5.梯度下降可能没有收敛,再多次运行梯度下降 【解决优化算法问题】

6.使用牛顿算法收敛(效果好)【解决优化算法问题】

7.调节参数 λ \lambda的值 【解决优化目标函数问题】

8.使用SVM算法(效果好) 【解决优化目标函数问题】

总结:针对存在问题的算法应用,很多人花费大量的时间在优化算法上,或并不针对具体问题进行修改,从而浪费大量时间。解决问题之前我们要明确问题再后解决。

即使算法效果不错,用诊断方法来理解算法也是个不错的注意,具体原因如下:

1.帮助你更好的理解问题。深度挖掘具体问题,便于具体分析。针对不同的问题形成个人的见解。

2.写论文比较方便,诊断方法更容易阐述问题。

二、误差分析与销蚀分析

举个例子:

人脸识别问题。可以用图片作为输入,然后进行预处理,识别人脸的部位(眼睛、鼻子、嘴等),最后形成特征。

如果我们得知这些步骤中误差是源于哪个组件,那么会很有帮助。通常的误差分析过程是逐渐的用基准值代替每个组件的输出,并观察准确率的变化。

系统整体的准确率为85%,我们想知道这15%的误差来自哪里。所以首先用手动编码的方式替代扣除背景的算法,准确率增长至85.1%,之后我们用基准值代替人脸识别的输出,我们会告诉算法人脸的具体位置,那么此时准确率增长至91%。以此类推,我们将每个组件的输出替换成基准值,告诉算法具体的眼睛、鼻子、嘴的位置,得到如图所示的准确率值。

从这张表中可以看到,当我们将人脸识别的输出替换成基准值时,准确率由85.1%增长至91%。这意味着如果提高人脸识别算法的性能,可以将准确率提高6%。这类诊断方法非常有用,如果你的目标是改善整个系统的性能的话,选择正确的改善方面是非常重要的,那么这种诊断方法就可以告诉你哪方面的努力是最值得的。

接下来要讲的是另一种分析方法,与误差分析相反,误差分析打算将现有的系统性能与完美的性能进行对比,而销蚀分析则尝试将现有的系统性能与一些较差的处于底线的系统性能做对比。

举个例子:

假设已构建一个垃圾邮件分类系统(好吧,还是它),并且对逻辑回归算法加了一些很好的特征,比如说:

  • 拼写检查的特征

  • 发送者主机的特征

  • 邮件头的特征

  • 邮件文本分析的特征

  • javascript解析特征

  • 嵌入图片的特征等

假如说你想统计一下哪个特征对系统性能的改进影响最大。利用销蚀分析可以这样做,假设利用简单的逻辑回归算法,没做任何的改进得到了94%的提升,那么如何判断每种特征对系统性能提高的影响力度呢?利用销蚀分析,我们不会每次添加一个组件,而是去除一个组件,然后观察准确率的变化。

从系统现有的准确率99.9%开始,去除拼写校正这个特征,准确率下降了,之后再去除发送主机这个特征…..,之后我们得到了这个表格。从图中可以看出,当去除邮件文本分析这一特征时,准确率下降的最快,也就是说它的影响最大。

三、应用机器学习的建议

方法一:仔细设计系统

  • 提取正确的特征,收集正确的数据集合,设计正确的算法结构

  • 实现它

优点:得到表现更好、伸缩性更强的算法。

方法二:“构建—修改”法

  • 先快速、简陋的实现

  • 然后利用误差分析来看看哪里出现问题,再进行改进

优点:非常快的建立系统,快速出现在市场,让系统更快的工作起来。这种方式比较好,原因是:通常情况下,一个系统中哪部分更简单,需要更仔细的设计,需要花更多的时间,这些都不明确。在不明确的前提下,我们可能会花费大量的时间在不能大幅度提高系统性能的部分,造成时间成本浪费。

另外,有很多这样的情况:在设计算法过程中,发现数据集出了问题,里面大部分的值不符合你的要求,是错误的,在算法设计一大半时发现了这样的问题。其实,一开始处理问题时,不要急着设计算法,或者越复杂越好,先看看数据集,把点画出来,对数据的结构有大体的了解(当然也包括数据清洗等,数据的质量影响最终的结果,所以不要小看每一个步骤,并不是算法越高深越好,有可能最后的结果不尽人意)。

以上的一些建议并不适合所有情况,比如说如果你想要发明一个新的学习算法时,快速实现一个东西并且继续修正,出现问题后再修正并不是合适的方法,应该更深入的思考而不是参考这些建议。

总结:花在设计诊断方法的时间通常都是有价值的,且通常情况下都需要你自己去设计诊断方法。设计算法时,不要堆叠貌似相关的、但是高大上理论,我们要明确应用与我们的算法/系统相关的理论,而不是道听途说的那些理论,如果真的想应用,就先研究透彻这个理论是否与我们研究的目标相关。总而言之,挖掘问题,对症下药。

机器学习笔记10——应用机器学习算法的建议相关推荐

  1. 吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection)

    吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection) 对于异常检测算法,使用特征是至关重要的,下面谈谈 ...

  2. Python机器学习笔记:异常点检测算法——Isolation Forest

    Python机器学习笔记:异常点检测算法--Isolation Forest 参考文章: (1)Python机器学习笔记:异常点检测算法--Isolation Forest (2)https://ww ...

  3. 机器学习笔记——数据挖掘与机器学习区别以及课程内容

    机器学习笔记 慕课|蒋良孝|中国地质大学 机器学习的定义 机器学习:利用经验改善计算机系统自身的性能 数据挖掘的定义 数据挖掘:识别出巨量数据中有效的.新颖的.潜在有用的.最终可理解的模式的非平凡的过 ...

  4. 七月算法机器学习笔记10 人工神经网络

    七月算法(http://www.julyedu.com) 12月份 机器学习在线班 学习笔记

  5. 吴恩达机器学习笔记 —— 10 神经网络参数的反向传播算法

    http://www.cnblogs.com/xing901022/p/9350271.html 本篇讲述了神经网络的误差反向传播以及训练一个神经网络模型的流程 更多内容参考 机器学习&深度学 ...

  6. 01. 机器学习笔记01——K近邻算法 , CV_example

    K近邻算法(K-nearest neighbor,KNN算法) 李航博士<统计学习方法> 最近邻(k-Nearest Neighbors,KNN)算法是一种分类算法 应用场景:字符识别.文 ...

  7. matlab算法用python做_机器学习笔记—朴素贝叶斯算法实现(matlab/python)

    原理知道一百遍不如自己动手写一遍,当然,现在基本上不需要自己来写算法的底层code了,各路大神们已经为我等凡夫俗子写好了,直接调用就行. 这里介绍在MATLAB中和Python中应用贝叶斯算法的小例子 ...

  8. 机器学习笔记(3)---K-近邻算法(1)---约会对象魅力程度分类

    参考资料 <机器学习实战>,Machine Learning in Action,本文中简称MLiA <机器学习>周志华,本文简称西瓜书 <Web安全之机器学习>刘 ...

  9. 随机森林分类算法python代码_Python机器学习笔记:随机森林算法

    随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为&q ...

最新文章

  1. spark安装和优化
  2. 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))
  3. java list 比较_Java中List的五种去重方法及效率对比,你都用对了吗?
  4. whiel oracle,Oracle中的for和while循环
  5. Windows进程间各种通信方式浅谈(转)
  6. 1010 Radix (25 分) 超级坑恶魔坑
  7. 20130830sqlplus使用及联机文档
  8. XP框架管理器EdXposed v4.6.2 (46200)
  9. sat数学逻辑推理题解题方法
  10. android epson wifi,epson投影仪无线投屏怎么连接手机、电脑
  11. 计算机显示u盘隐藏分区,如何查看及删除u盘的隐藏分区
  12. mro列表_类的继承mro
  13. 图书馆管理系统需求规格说明书
  14. 收藏!程序猿治愈系表白图来了!
  15. 庖丁解牛Transformer原理
  16. 四周无人机的姿态解算(2)
  17. oracle ora 00910,ORA-00910: 指定的长度对于数据类型而言过长
  18. Python黑马头条推荐系统第四天 TensorFlow框架介绍和深度学习
  19. redis学习(借鉴网上的文档)
  20. nginx 获取body参数_nginx 处理request body参数配置

热门文章

  1. 固件firmware和驱动driver
  2. 基于Cookie信息的互联网精准广告定向技术研究
  3. 暴利项目赚钱月入5万,进来看看吧!
  4. win7计算机脱机,win7浏览器解除脱机状态的简单方法(图文)
  5. Linux系统调用四、lseek()函数详解
  6. 离散余弦变换matlab
  7. Java_核心编程_初级
  8. mysql prepare有什么用_mysql中的prepare介绍和应用
  9. 追梦之旅,从这里开始
  10. 在 Excel 中以编程方式复制工作表会导致运行时错误 1004