机器学习08机器学习系统设计

首先要做什么 

一个垃圾邮件分类器算法为例:

为了解决这样一个问题,首先要做的决定是如何选择并表达特征向量 x。

可以选择一个由 100 个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中
出现,来获得我们的特征向量(出现为 1,不出现为 0),尺寸为 100×1。 


为了构建这个分类器算法,我们可以做很多事,例如: 

1. 收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本;’ 

2. 基于邮件的路由信息开发一系列复杂的特征;

3. 基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理; 

4. 为探测刻意的拼写错误(把 watch 写成 w4tch)开发复杂的算法。  

在上面这些选项中,非常难决定应该在哪一项上花费时间和精力,作出明智的选择,比随着感觉走要更好。

当我们使用机器学习时,总是可以“头脑风暴”一下,想出一堆方法来试试。实际上,当你需要通过头脑风暴来想出不同方法来尝试去提高精度的时候,你可能已经超越了很多人了。


我们将在随后的课程中讲误差分析, 我会告诉你怎样用一个更加系统性的方法。
从一堆不同的方法中,选取合适的那一个。

因此,你更有可能选择一个真正的好方法,能让你花上几天几周,甚至是几个月去进行深入的研究。 


—————————————————————————————————————————————————————————


误差分析(Error Analysis )

如果你准备研究机器学习的东西,或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统,拥有多么复杂的变量;而是构建一个简单的算法,这样你可以很快地实现它。 

每当我研究机器学习的问题时, 我最多只会花一天的时间, 就是字面意义上的 24 小时,来试图很快的把结果搞出来,即便效果不好。坦白的说,就是根本没有用复杂的系统,但是只是很快的得到的结果。即便运行得不完美,但是也把它运行一遍,最后通过交叉验证来检验数据

一旦做完,你可以画出学习曲线,通过画出学习曲线,以及检验误差,来找出你的算法是否有高偏差和高方差的问题,或者别的问题。在这样分析之后,再来决定用更多的数据训练,或者加入更多的特征变量是否有用。

这么做的原因是:这在你刚接触机器学习问题时是一个很好的方法, 你并不能提前知道你是否需要复杂的特征变量, 或者你是否需要更多的数据,还是别的什么。提前知道你应该做什么,是非常难的,因为你缺少证据,缺少学习曲线。因此,你很难知道你应该把时间花在什么地方来提高算法的表现。

但是当你实践一个非常简单即便不完美的方法时,你可以通过画出学习曲线来做出进一步的选择。 你可以用这种方式来避免一种电脑编程里的过早优化问题。

 这种理念是: 我们必须用证据来领导我们的决策,怎样分配自己的时间来优化算法,而不是仅仅凭直觉,凭直觉得出的东西一般总是错误的。


除了画出学习曲线之外,一件非常有用的事是误差分析,我的意思是说:当我们在构造垃圾邮件分类器时,我会看一看我的交叉验证数据集, 然后亲自看一看哪些邮件被算法错误地分类。

因此,通过这些被算法错误分类的垃圾邮件与非垃圾邮件,你可以发现某些系统性的规律:什么类型的邮件总是被错误分类。经常地这样做之后,这个过程能启发你构造新的特征变量,或者告诉你:现在这个系统的短处,然后启发你如何去提高它。


构建一个学习算法的推荐方法为: 

1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法;;

2. 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择 ;

3. 进行误差分析: 人工检查交叉验证集中我们算法中产生预测误差的实例, 看看这些实例是否有某种系统化的趋势 。


当你在构造学习算法的时候,你总是会去尝试很多新的想法,实现出很多版本的学习算法,如果每一次你实践新想法的时候,你都要手动地检测这些例子,去看看是表现差还是表现好,那么这很难让你做出决定。到底是否使用词干提取,是否区分大小写。

但是通过一个量化的数值评估,你可以看看这个数字,误差是变大还是变小了。你可以通过它更快地实践你的新想法,它基本上非常直观地告诉你:你的想法是提高了算法表现,还是让它变得更坏, 这会大大提高你实践算法时的速度。 

所以我强烈推荐在交叉验证集上来实施误差分析,而不是在测试集上。但是,还是有一些人会在测试集上来做误差分析。即使这从数学上讲是不合适的。所以我还是推荐你在交叉验证向量上来做误差分析。 


总结一下, 当你在研究一个新的机器学习问题时, 我总是推荐你实现一个较为简单快速、即便不是那么完美的算法。我几乎从未见过人们这样做。大家经常干的事情是:花费大量的时间在构造算法上,构造他们以为的简单的方法。

因此,不要担心你的算法太简单,或者太不完美,而是尽可能快地实现你的算法。当你有了初始的实现之后,它会变成一个非常有力的工具, 来帮助你决定下一步的做法。因为我们可以先看看算法造成的错误, 通过误差分析,来看看他犯了什么错,然后来决定优化的方式。

另一件事是:假设你有了一个快速而不完美的算法实现,又有一个数值的评估数据,这会帮助你尝试新的想法,快速地发现你尝试的这些想法是否能够提高算法的表现,从而你会更快地做出决定,在算法中放弃什么,吸收什么。误差分析可以帮助我们系统化地选择该做什么。 


—————————————————————————————————————————————————————————


类偏斜的误差度量(Error Metrics for Skewed Classes)

有一件重要的事情要注意, 就是使用一个合适的误差度量值, 这有时会对于你的学习算法造成非常微妙的影响,这件重要的事情就是偏斜类(skewed classes)的问题。

类偏斜情况表现为训练集中有非常多的同一种类的实例,只有很少其他类的实例。


例如预测癌症是否恶性,在训练集中,只有 0.5%的实例是恶性肿瘤。

假设编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有 0.5%。

然而通过训练而得到的神经网络算法却有 1%的误差。

这时,误差的大小是不能视为评判算法效果的依据的。


 

将算法预测的结果分成四种情况: 

1. 正确肯定(True Positive,TP):预测为真,实际为真 

2. 正确否定(True Negative,TN):预测为假,实际为假 

3. 错误肯定(False Positive,FP):预测为真,实际为假 

4. 错误否定(False Negative,FN):预测为假,实际为真


查准率(Precision)和查全率(Recall)

查准率=TP/(TP+FP)例, 在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。 

查全率=TP/(TP+FN)例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。 


—————————————————————————————————————————————————————————————————————————————


查全率和查准率之间的权衡(Trading Off Precision and Recall)

作为偏斜类问题的评估度量值,在很多应用中,我们希望能够保证查准率和召回率的相对平衡。 

假使,算法输出的结果在 0-1 之间,使用阀值 0.5 来预测真和假。

 

查准率(Precision)=TP/(TP+FP) 例:在所有预测为恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。 

查全率(Recall)=TP/(TP+FN)例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。 


如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比 0.5 更大的阀值,如 0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。 

如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比 0.5 更小的阀值,如 0.3。 


我们可以将不同阀值情况下, 查全率与查准率的关系绘制成图表, 曲线的形状根据数据的不同而不同: 



我们希望有一个帮助我们选择这个阀值的方法。

一种方法是计算 F1 值(F1 Score),其计算公式为:

我们选择使得 F1值最高的阀值。 


—————————————————————————————————————————————————————————


机器学习的数据(Data For Machine Learning)

讨论一下机器学习系统设计中另一个重要的方面:用来训练的数据有多少。

 得到大量的数据并在某种类型的学习算法中进行训练, 可以是一种有效的方法来获得一个具有良好性能的学习算法。

而这种情况往往出现在这些条件对于你的问题都成立,并且你能够得到大量数据的情况下。

这可以是一个很好的方式来获得非常高性能的学习算法。




事实上,如果你选择任意一个算法,可能是选择了一个"劣等的"算法,如果你给这个劣等算法更多的数据,那么从这些例子中看起来的话,它看上去很有可能会其他算法更好,甚至会比"优等算法"更好。由于这项原始的研究非常具有影响力,因此已经有一系列许多不同的研究显示了类似的结果。这些结果表明,许多不同的学习算法有时倾向于非常相似的表现,这还取决于一些细节,但是真正能提高性能的,是你能够给一个算法大量的训练数据。

像这样的结果,引起了一种在机器学习中的普遍共识:"取得成功的人不是拥有最好算法的人,而是拥有最多数据的人"。

那么这种说法在什么时候是真, 什么时候是假呢?因为如果我们有一个学习算法,并且如果这种说法是真的,那么得到大量的数据通常是保证我们具有一个高性能算法的最佳方式, 而不是去争辩应该用什么样的算法。


那么让我们来看一看, 大量的数据是有帮助的情况。

假设特征值有足够的信息来预测 y 值,假设我们使用一种需要大量参数的学习算法,比如有很多特征的逻辑回归或线性回归,或者用带有许多隐藏单元的神经网络。 这些都是非常强大的学习算法,它们有很多参数,这些参数可以拟合非常复杂的函数。因此我要调用这些,我将把这些算法想象成低偏差算法,因为我们能够拟合非常复杂的函数,而且因为我们有非常强大的学习算法,这些学习算法能够拟合非常复杂的函数。很有可能,如果我们用这些数据运行这些算法,这种算法能很好地拟合训练集,因此,训练误差就会很低了。 现在假设我们使用了非常非常大的训练集,在这种情况下,尽管我们希望有很多参数,但是如果训练集比参数的数量还大,甚至是更多,那么这些算法就不太可能会过度拟合。也就是说训练误差有希望接近测试误差。 


另一种考虑这个问题的角度是为了有一个高性能的学习算法, 我们希望它不要有高的偏差和方差。 
因此偏差问题, 我么将通过确保有一个具有很多参数的学习算法来解决, 以便我们能够得到一个较低偏差的算法;并且通过用非常大的训练集来保证, 我们在此没有方差问题,我们的算法将没有方差。通过这两个方面,我们最终可以得到一个低误差和低方差的学习算法。 这使得我们能够很好地测试测试数据集。 

从根本上来说,这是一个关键的假设:特征值有足够的信息量,且我们有一类很好的函数,这是为什么能保证低误差的关键所在。它有大量的训练数据集,这能保证得到更多的方差值,因此这给我们提出了一些可能的条件,如果你有大量的数据,而且你训练了一种带有很多参数的学习算法,那么这将会是一个很好的方式,来提供一个高性能的学习算法。 


我觉得关键的测试: 首先, 一个人类专家看到了特征值 x, 能很有信心的预测出 y 值吗? 因为这可以证明 y 可以根据特征值 x 被准确地预测出来。

其次,我们实际上能得到一组庞大的训练集, 并且在这个训练集中训练一个有很多参数的学习算法吗?

如果你能做到这两者,那么更多时候,你会得到一个性能很好的学习算法。 



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学笔记1——导数1(导数的基本概念)

什么是导数导数是高数中的重要概念,被应用于多种学科。从物理意义上讲,导数就是求解变化率的问题;从几何意义上讲,导数就是求函数在某一点上的切线的斜率。我们熟知的速度公式:v s/t,这求解的是平均速度&a…

python接口自动化(四)--接口测试工具介绍(详解)

简介 “工欲善其事必先利其器”,通过前边几篇文章的介绍,大家大致对接口有了进一步的认识。那么接下来让我们看看接口测试的工具有哪些。 目前,市场上有很多支持接口测试的工具。利用工具进行接口测试,能够提供测试效率。例如&…

机器学习09支持向量机

支持向量机(Support Vector Machines) 在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法 A 还是学习算法 B,而更重要的是, 应用这些算法时,所创建的大量数据在应用这些算…

数学笔记2

数学笔记2——导数2(求导法则和高阶导数)和、差、积、商求导法则设uu(x),vv(x)都可导,则:(Cu)’ Cu’, C是常数(u v)’ u’ v’(uv)’ u’ v’(u/v)’ (u’v – uv’) / v21、2不解释,下面给出3、4的推导过程乘法法则的推导过乘法法则…

机器学习10聚类

无监督学习 在非监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中, 然后让它找这个数据的内在结构。 我们可能需要某种算法帮助我们寻找一种结构。图上的数据看起来可以分成两个分开的点集(称为簇)&am…

关联分析(Association analysis)

关联分析(Association analysis) 简介 大量数据中隐藏的关系可以以‘关联规则’和‘频繁项集’的形式表示。rules:{Diapers}–>{Beer}说明两者之间有很强的关系,购买Diapers的消费者通常会购买Beer。 除…

机器学习11主成分分析

降维(Dimensionality Reduction) : 一、 降维目的: 目的一:数据压缩(Data Compression) 目的二:数据可视化(Visualization) 二、 主成分分析(PCA) 主成分…

使用Apriori进行关联分析(一)

使用Apriori进行关联分析(一)大型超市有海量交易数据,我们可以通过聚类算法寻找购买相似物品的人群,从而为特定人群提供更具个性化的服务。但是对于超市来讲,更有价值的是如何找出商品的隐藏关联,从而打包促…

主成分分析法 (PCA) 用于数据可视化实验 -- Matlab版

第一步:下载数据集。 https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html#pendigits 第二步:改变数据格式。 注:此数据集的各特征值均为像素,即属于同一量纲,故无需归一化步骤。 原格式为&a…

机器学习12推荐系统

推荐系统(Recommender Systems) 推荐系统根据浏览用户过去买过什么书,或过去评价过什么电影来判断并推荐新产品给用户。 这些系统会为像亚马逊和网飞这样的公司带来很大一部分收入。 因此,对推荐系统性能的改善,将对这些企业的有实质性和…

使用Apriori进行关联分析(二)

使用Apriori进行关联分析(二)书接上文(使用Apriori进行关联分析(一)),介绍如何挖掘关联规则。发现关联规则我们的目标是通过频繁项集挖掘到隐藏的关联规则。所谓关联规则,指通过某个…

数学笔记3——导数3(隐函数的导数)

数学笔记3——导数3(隐函数的导数)幂函数的扩展形式f(x) xn的导数:f’(x) nxn-1,n是整数,该公式对f(x) xm/n, m,n 是整数同样适用。推导过程:什么是隐函数引自知乎:“如果方程F(x,y)0能确定y…

机器学习13大规模数据集

大型数据集的学习(Learning With Large Datasets) 如果我们有一个低方差的模型, 增加数据集的规模可以帮助你获得更好的结果。 我们应该怎样应对一个有 100 万条记录的训练集? 以线性回归模型为例,每一次梯度下降…

Java07多线程

14 多线程 操作系统的多任务(multitasking):在同一时刻运行多个程序的能力。 多线程在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。 通常,每一个任务称为一个线程(tread)&…

MySQL字段拼接Concat

有时候,从数据库中拿出的数据并不是我们想要的格式,比如,有以下的vendors表 如果,想以 name (location)的格式展现出来,那么就要用到MySQL的Concat了。 Concat()拼接串,即把多个串连接起来形成一个较长的串…

使用pycharm调用模块后字体变灰 是什么原因呢?

使用pycharm调用模块后字体变灰 是什么原因呢?点击小灯泡提示出现以下内容:This inspection detects names that should resolve but dont. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-l…

操作系统01概述

第一章 概论 《Operating System Internals and Design Principles》 《Applied Operating System Concepts》 操作系统——裸机上的第一层软件,它是对硬件系统功能的首次扩充,填补人与机器之间的鸿沟。 1.1 操作系统与计算机同在 1.2 对操作系统的…

Linux re

正则表达式并不是一个工具程序,而是一个字符串处理的标准依据,如果想要以正则表达式的方式处理字符串,就得使用支持正则表达式的工具,例如grep、vi、sed、asw等。 注意:ls不支持正则表达式。 grep 正则表达式: 注意gr…

操作系统02进程管理Process_Description_and_Control

作业的基本概念:用户再一次计算过程中或一次事务处理过程中,要求计算机系统所做的工作的集合。 包含多个程序、多个数据、作业控制说明书 系统调用时操作系统提供给编程人员的唯一接口。 1、文件操作类; 2、进程控制类; 3、资…

蓝桥杯 方格填数(全排列+图形补齐)

方格填数 如下的10个格子 填入0~9的数字,同一数字不能重复填。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数。注意:你提交的应该是一个…