共计 5710 个字符,预计需要花费 15 分钟才能阅读完成。
明天小 Mi 带大家学习如何设计一个机器学习零碎,也会带大家理解设计简单的机器学习零碎时可能会遇到的一些问题。当然啦,除此之外,小 Mi 还会提供一些对于奇妙构建简单机器学习零碎的小 tips。哦,对了,偷偷通知你们,可能会帮忙大家在构建大型的机器学习零碎时,节俭大量的工夫哦~
1 初始步骤
废话不多说,上例子!假如咱们须要设计一个垃圾邮件分类器的算法。为了解决这样一个问题,咱们首先要做的决定是如何抉择并表白特征向量。咱们能够抉择一个由 100 个最常呈现在垃圾邮件中的词所形成的列表,依据这些词是否有在邮件中呈现,来取得咱们的特征向量(呈现为 1,不呈现为 0),向量维度为 100×1。
为了构建这个分类器算法,咱们能够做很多事,例如:
收集更多的数据,让咱们有更多的垃圾邮件和非垃圾邮件的样本
基于邮件的路由信息开发一系列简单的特色
基于邮件的注释信息开发一系列简单的特色,包含思考截词的解决
为探测刻意的拼写错误(把 watch 写成 w4tch)开发简单的算法
在下面这些抉择中,应该具体钻研哪一个算法并且破费工夫和精力是须要慎重考虑的,而不是仅仅跟着感觉走。当咱们应用机器学习时,总是能够“头脑风暴”一下,想出一堆办法来试试。后续当小 Mi 带大家学到误差剖析的时候,就能够教会大家怎么用一个更加系统性的办法,从一堆不同的办法中,选取适合的那一个啦。
2 误差剖析
误差剖析(Error Analysis)通常能够帮忙咱们更系统地做出决定。如果咱们筹备钻研机器学习的货色,或者结构机器学习应用程序,最好的实际办法不是建设一个非常复杂的零碎,领有如许简单的变量;而是构建一个简略的算法,这样咱们就能够疾速地实现它。吴恩达大佬在提到钻研机器学习的问题的时候,他认为最多只须要花一天的工夫,尽快地把后果搞进去,即使失去的成果不是很好。即使运行得不完满,然而也把它运行一遍,最初通过穿插验证来测验数据。一旦做完,咱们就能够画出学习曲线,通过画出学习曲线,以及测验误差,来找出算法是否有高偏差和高方差的问题,或者别的问题。在这样剖析之后,再来决定是抉择应用更多的数据训练,还是退出更多的特色变量。其实这么做反而是一个很好的办法,因为咱们并不能提前晓得是否须要简单的特色变量,或者是否须要更多的数据,还是别的什么,从而也就很难晓得咱们应该把工夫花在什么中央来进步算法的体现。然而当咱们实际一个非常简单即使不完满的办法时,能够通过画出学习曲线来做出进一步的抉择,从而防止过早优化问题。
这种做法的理念就是:咱们必须用证据来领导咱们的决策,怎么调配本人的工夫来优化算法,而不是仅仅凭直觉。除了画出学习曲线之外,还有一件十分有用的工作就是误差剖析:当咱们在结构垃圾邮件分类器时,看一看穿插验证数据集,亲自看一看哪些邮件被算法谬误地分类。因而,通过这些被算法谬误分类的垃圾邮件与非垃圾邮件,进而能够发现某些系统性的法则:什么类型的邮件总是被谬误分类。常常这样做之后,这个过程就能启发咱们结构新的特色变量,或者通知咱们:当初这个零碎的短处,而后启发咱们如何去进步它。构建一个学习算法的举荐办法为:
1. 从一个简略的能疾速实现的算法开始,实现该算法并用穿插验证集数据测试这个算法
2. 绘制学习曲线,决定是减少更多数据,或者增加更多特色,还是其余抉择
3. 进行误差剖析:人工查看穿插验证集中咱们算法中产生预测误差的样本,看看这些样本是否有某种系统化的趋势
以咱们的垃圾邮件过滤器为例,误差剖析要做的是测验穿插验证集中咱们的算法产生谬误预测的所有邮件,看看是否能将这些邮件依照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者明码窃取邮件等。而后看分类器对哪一组邮件的预测误差最大,并着手优化。思考怎么能改良分类器。例如,发现是否短少某些特色,记下这些特色呈现的次数。例如记录下谬误拼写呈现了多少次,异样的邮件路由状况呈现了多少次等等,而后从呈现次数最多的状况开始着手优化。误差剖析并不总能帮忙咱们判断应该进行相干的改良。有时咱们须要尝试不同的模型,而后进行比拟,在模型比拟时,用数值来判断哪一个模型更好更无效,通常咱们是看穿插验证集的误差。在咱们的垃圾邮件分类器例子中,对于“咱们是否应该将 discount/discounts/discounted/discounting 解决成同一个词?”如果这样做能够改善咱们算法,咱们会采纳一些截词软件。误差剖析不能帮忙咱们做出这类判断,咱们只能尝试采纳和不采纳截词软件这两种不同计划,而后依据数值测验的后果来判断哪一种更好。
因而,当结构学习算法的时候,咱们总是会去尝试很多新的想法,实现出很多版本的学习算法,如果每一次实际新想法的时候,咱们都要手动地检测这些例子,去看看是体现差还是体现好,那么这会很难做出决定。到底是否应用词干提取,是否辨别大小写。然而通过一个量化的数值评估,咱们能够看到误差是变大还是变小了,而咱们的想法到底是进步了算法体现,还是让它变得更坏,从而大大提高实际算法时的速度。所以小 Mi 强推在穿插验证集上进行误差剖析,而不是在测试集上,哈哈。
总结来说,当咱们在钻研一个新的机器学习问题时,举荐大家实现一个较为简单疾速、即使不是那么完满的算法。当有了初始的实现之后,它会变成一个十分无力的工具,来帮忙咱们决定下一步的做法,通过误差剖析来决定优化的形式。同时当咱们有了一个疾速而不完满的算法实现,又有一个数值的评估数据时,这会帮忙咱们尝试新的想法,疾速地发现这些想法是否可能进步算法的体现,从而更快地做出决定,在算法中放弃什么,排汇什么误差剖析能够帮忙咱们系统化地抉择该做什么。
3 查准率和查全率
在上一节的介绍中小 Mi 提到了误差剖析,以及设定误差度量值的重要性,也就是说,设定某个实数来评估学习算法,并掂量它的体现,这样就有了算法的评估和误差度量值。有一件重要的事件值得注意的是,应用一个适合的误差度量值,可能会对学习算法造成十分奥妙的影响,这就波及到了偏斜类(skewed classes)的问题。类偏斜状况体现为咱们的训练集中有十分多的同一品种的样本,只有很少或没有其余类的样本。例如咱们心愿用算法来预测癌症是否是恶性的,在咱们的训练集中,只有 0.5% 的实例是恶性肿瘤。假如咱们编写一个非学习而来的算法,在所有状况下都预测肿瘤是良性的,那么误差只有 0.5%。然而咱们通过训练而失去的神经网络算法却有 1% 的误差。这时,误差的大小是不能视为评判算法成果的根据的。咱们将算法预测的后果分成四种状况(查准率 Precision 和查全率 Recall):
正确必定(True Positive,TP):预测为真,理论为真
正确否定(True Negative,TN):预测为假,理论为假
谬误必定(False Positive,FP):预测为真,理论为假
谬误否定(False Negative,FN):预测为假,理论为真
即:
查准率 Precision=TP/(TP+FP)
以上述预测癌症是否是恶性的示例具体解释来说,在所有咱们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率 Recall=TP/(TP+FN)
在所有实际上有恶性肿瘤的病人中,胜利预测有恶性肿瘤的病人的百分比,越高越好。因而,对于咱们方才那个总是预测病人肿瘤为良性的算法,其查全率是 0。
4 阀值的抉择
既然查准率和召回率作为遇到偏斜类问题的评估度量值,那么在很多利用中,咱们应该如何保障查准率和召回率的绝对均衡呢?持续沿用方才预测肿瘤的例子,倘若咱们的算法输入的后果在 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 值最大时候的阀值。
5 数据
当然啦,到用来训练的数据到底有多少,也是机器学习零碎设计中另一个重要的方面。在肯定条件下,失去大量的数据并在某种类型的学习算法中进行训练,能够是一种无效的办法来取得一个具备良好性能的学习算法。而这种状况往往呈现在这些条件对于你的问题都成立,并且你可能失去大量数据的状况下,这能够是一个很好的形式来取得十分高性能的学习算法。
Michele Banko 和 Eric Brill 进行了一个很乏味的钻研,钻研中尝试通过机器学习算法来辨别常见的易混同的单词,他们尝试了许多种不同的算法,并发现数据量十分大时,这些不同类型的算法成果都很好。
比方,在这样的句子中:For breakfast I ate__eggs(to,two,too). 在这个例子中,”two”是一个易混同的单词。于是他们把诸如这样的机器学习问题,当做一类监督学习问题,并尝试将其分类,什么样的词,在一个英文句子特定的地位,才是适合的。他们用了几种不同的学习算法,比方他们应用了一个方差,用于逻辑回归上的一个方差,被称作 ” 感知器 ”(perceptron)。他们也采取了一些过来罕用,然而当初比拟少用的算法,比方 Winnow 算法,很相似于回归问题。还有一种基于内存的学习算法、奢侈算法等等。而什么时候咱们会心愿取得更多数据,而非批改算法呢?这是咱们十分想晓得的。他们所做的就是扭转了训练数据集的大小,并尝试将这些学习算法用于不同大小的训练数据集中,以下是他们失去的后果。
这些趋势非常明显,首先大部分算法,都具备类似的性能,其次,随着训练数据集的增大,在横轴上代表以百万为单位的训练集大小,从 0.1 个百万到 1000 百万,也就是到了 10 亿规模的训练集的样本,这些算法的性能也都对应地加强了。事实上,如果你抉择任意一个算法,可能是抉择了一个 ” 劣等的 ” 算法,如果你给这个劣等算法更多的数据,那么从这些例子中看起来的话,它看上去很有可能会其余算法更好,甚至会比 ” 优等算法 ” 更好。因为这项原始的钻研十分具备影响力,并且有一系列许多不同的钻研显示了相似的后果。这些结果表明,许多不同的学习算法有时偏向于体现出十分类似的体现,这还取决于一些细节,然而真正能进步性能的,是可能给一个算法大量的训练数据。像这样的后果,引起了一种在机器学习中的广泛共识:” 取得成功的人不是领有最好算法的人,而是领有最多数据的人 ”。那么这种说法真的对吗?因为如果咱们有一个学习算法,并且如果这种说法是真的,那么失去大量的数据通常是保障咱们具备一个高性能算法的最佳形式,而不是去探讨到底应该用什么样的算法。如果有这样一些假如,在这些假如下有大量咱们认为有用的训练集,咱们假如在机器学习问题中,特征值 x 蕴含了足够的信息,这些信息能够帮忙咱们用来精确地预测 y,例如,如果咱们采纳了一些容易混同的词,如:two、to、too,如果说它可能形容 x,捕捉到须要填写的空白处四周的词语,那么特色捕捉到之后,咱们就心愿有对于“For breakfast I ate__eggs”,那么这就有大量的信息来通知我两头我须要填的词是“two”,而不是单词”to”或者”too”。
因而特色捕获,哪怕是四周词语中的一个词,就可能给我足够的信息来确定出标签 y 是什么。换句话说,从这三组易混同的词中,我应该选什么词来填空。那么让咱们来看一看,大量的数据是有帮忙的状况。假如特征值有足够的信息来预测 y 值,假如咱们应用一种须要大量参数的学习算法,比方有很多特色的逻辑回归或线性回归,或者用带有许多暗藏单元的神经网络,那又是另外一种带有很多参数的学习算法,这些都是十分弱小的学习算法,它们有很多参数,这些参数能够拟合非常复杂的函数,因而咱们要调用这些,把这些算法设想成低偏差算法,因为咱们可能拟合非常复杂的函数,而且因为咱们有十分弱小的学习算法,这些学习算法可能拟合非常复杂的函数。很有可能,如果咱们用这些数据运行这些算法,这种算法能很好地拟合训练集,因而,训练误差就会很低了。当初假如咱们应用了十分十分大的训练集,在这种状况下,只管咱们心愿有很多参数,然而如果训练集比参数的数量还大,甚至是更多,那么这些算法就不太可能会适度拟合,也就是说训练误差有心愿靠近测试误差。另一种思考这个问题的角度是为了有一个高性能的学习算法,咱们心愿它不要有高的偏差和方差。因而偏差问题,我么将通过确保有一个具备很多参数的学习算法来解决,以便咱们可能失去一个较低偏差的算法,并且通过用十分大的训练集来保障。
咱们在此没有方差问题,咱们的算法将没有方差,并且通过将这两个值放在一起,最终能够失去一个低误差和低方差的学习算法。这使得咱们可能很好地测试测试数据集。从根本上来说,这是一个要害的假如:特征值有足够的信息量,且咱们有一类很好的函数,这是为什么能保障低误差的关键所在。它有大量的训练数据集,这能保障失去更多的方差值,因而这给咱们提出了一些可能的条件,如果你有大量的数据,而且你训练了一种带有很多参数的学习算法,那么这将会是一个很好的形式,来提供一个高性能的学习算法。因而,测试的要害是:首先,能够依据特征值 x 精确地预测 y 值。其次,咱们失去一组宏大的训练集,并且能够在这个训练集中训练一个有很多参数的学习算法。如果咱们不能做到这两者,那么咱们只能抉择一个性能很好的学习算法咯。
好啦,如何设计一个机器学习零碎小 Mi 也曾经粗浅学习到啦~BTW,上周小 Mi 预报错了,咱们下周学反对向量机哦,哈哈~(挥手十分钟!)