精华内容
下载资源
问答
  • 机器学习】解释机器学习模型

    千次阅读 2018-08-23 10:05:54
    在这篇博客文章中,我试图解释机器学习中可解释性的重要性,并讨论一些您可以自己试验的简单操作和框架。 关于机器学习的xkcd   为什么机器学习中的可解释性很重要? 在传统统计中,我们通过调查整个数据来...

    无论数据科学解决方案的最终目标如何,最终用户总是更喜欢可解释且易于理解的解决方案。此外,作为数据科学家,您将始终受益于模型的可解释性,以验证和改进您的工作。在这篇博客文章中,我试图解释机器学习中可解释性的重要性,并讨论一些您可以自己试验的简单操作和框架。

    关于机器学习的xkcd

     

    为什么机器学习中的可解释性很重要?

    在传统统计中,我们通过调查整个数据来构建和验证假设。我们构建模型来构建规则,我们可以将这些规则合并到流程的心理模型中。例如,营销公司可以构建一个模型,该模型将营销活动数据与财务数据相关联,以确定什么构成有效的营销活动。
    这是一种自上而下的数据科学方法,可解释性是关键,因为它是所定义的规则和流程的基石。由于相关性通常不等于因果关系,因此在制定决策和解释时需要一个可靠的模型理解。

    在自下而上的数据科学方法中,我们将业务流程的各个部分委托给机器学习模型。此外,通过机器学习实现了全新的商业创意。自下而上的数据科学通常对应于手动和繁重任务的自动化。制造公司可以例如将传感器放在他们的机器上并执行预测性维护。因此,维护工程师可以更高效地工作,而无需执行昂贵的定期检查。模型可解释性是必要的,以验证模型正在做什么符合您的期望,并允许与用户建立信任并简化从手动过程到自动过程的过渡。

    在自上而下的过程中,您可以迭代地构造和验证一组假设。在自下而上的方法中,您尝试通过自下而上解决问题来自动化流程。

     

    作为数据科学家,您经常关注微调模型以获得最佳性能。数据科学通常被定义为:'给定带有标签y的数据X,找到具有最小误差的模型'。虽然培训高性能模型的能力对于数据科学家来说是一项关键技能,但重要的是能够从更大的角度看待。数据和机器学习模型的可解释性是数据科学管道实际“有用”中关键的一个方面,它确保模型与您要解决的问题保持一致。虽然在构建模型时尝试使用最先进的技术很容易迷失自己,但能够正确解释您的发现是数据科学过程的重要组成部分。

    需要解释模型来验证模型预测的有用性。

     

    为什么对模型进行深入分析至关重要?

    作为数据科学家,有几个理由关注模型可解释性。虽然这些之间存在重叠,但它们捕获了可解释性的不同动机:

    识别并减轻偏见。

    偏差可能存在于任何数据集中,由数据科学家来识别并尝试修复它。数据集的大小可能有限,并且可能无法代表整个数据集,或者数据捕获过程可能没有考虑潜在的偏差。在彻底的数据分析之后或当模型预测与模型输入之间的关系被分析时,偏差通常才会变得明显。如果您想了解更多有关不同类型偏见的信息,我强烈推荐以下视频。请注意,解决偏见没有单一的解决方案,但是在解释性方面意识到潜在偏见的关键步骤。

     

    其他偏见的例子如下:

    例如,word2vec向量包含性别偏见,因为他们已经训练过的语料库中存在固有的偏见。当您使用这些单词嵌入来训练模型时,搜索“技术配置文件”的招聘人员会将女性简历留在堆的底部。

    例如,当您在小型手动创建的数据集上训练对象检测模型时,通常情况下图像的宽度太有限。需要在不同环境,不同闪电条件和不同角度的物体的各种图像,以避免仅适合数据中的噪声和不重要元素的模型。

    考虑问题的背景。

    在大多数问题中,您正在使用的数据集只是您要解决的问题的粗略表示,而机器学习模型通常无法捕获现实任务的完整复杂性。可解释的模型可帮助您理解和解释模型中包含的(未)因素,并在根据模型预测执行操作时考虑问题的上下文。

    改善泛化和绩效。

    高可解释性通常会导致模型更好地推广。可解释性不是要理解所有数据点的模型的每个细节。固体数据,模型和问题理解的结合对于拥有更好的解决方案是必要的。

    道德和法律原因。

    在金融和医疗保健等行业中,审核决策流程并确保其不歧视或违反任何法律至关重要。随着GDPR等数据和隐私保护法规的兴起,可解释性变得更加重要。此外,在医疗应用或自动驾驶汽车中,单个不正确的预测可能会产生重大影响,并且能够“验证”模型是至关重要的。因此,系统应该能够解释它是如何达到给定的建议的。

     

    解释你的模型

    关于模型可解释性的一个共同点是,随着模型复杂性的增加,模型可解释性至少下降得如此之快。特征重要性是解释模型的基本(通常是免费)方法。即使对于诸如深度学习的黑盒模型,也存在提高可解释性的技术。最后,将讨论LIME框架,作为模型分析的工具箱。

    特征重要性

    • 广义线性模型

    广义线性模型(GLM)都基于以下原则:  
    如果您将特征x与模型权重w进行线性组合,并通过壁球函数f提供结果,则可以使用它来预测各种各样的响应变量。GLM的最常见应用是回归(线性回归),分类(逻辑回归)或建模泊松过程(泊松回归)。训练后获得的权重是特征重要性的直接代表,它们为模型内部提供了非常具体的解释。

    例如,在构建文本分类器时,您可以绘制最重要的特征并验证模型是否过度拟合噪声。如果最重要的单词与您的直觉(例如名称或停用词)不对应,则可能意味着该模型适合数据集中的噪声,并且在新数据上表现不佳。

    TidyTextMining中用于文本可解释性的整洁可视化示例

     

    • 随机森林和SVM

    甚至诸如基于树的模型(例如,随机森林)之类的非线性模型也允许获得关于特征重要性的信息。在随机森林中,在训练模型时,特征重要性是免费的,因此它是验证初始假设并确定模型正在学习什么的好方法。基于内核的方法(如SVM)中的权重通常不是特征重要性的非常好的代表。内核方法的优点是,您可以通过将特征投影到内核空间来捕获变量之间的非线性关系。另一方面,仅仅将权重视为特征重要性并不能完成特征交互。

    通过查看特征重要性,您可以确定模型正在学习什么。由于这个模型中的许多重要性都被放到了一天中,因此可能值得加入其他基于时间的功能。(Kaggle

     

    • 深度学习

    由于参数的剪切数量和提取和组合特征的复杂方法,深度学习模型因其不可解释性而臭名昭着。由于这类模型能够在许多任务上获得最先进的性能,因此许多研究都集中在将模型预测与输入联系起来。

    可解释机器学习的研究数量正在快速增长(麻省理工学院)。

    特别是当转向处理文本和图像数据的更复杂系统时,很难解释模型实际学习的内容。研究的主要焦点目前主要是将输出或预测与输入数据联系起来并将其关联起来。虽然这在线性模型的背景下相当容易,但对于深度学习网络来说仍然是一个未解决的问题。两种主要方法是基于梯度或基于注意力。

    - 在基于梯度的方法中,在向后传递中计算的目标概念的梯度用于产生突出显示输入中用于预测目标概念的重要区域的地图。这通常应用于计算机视觉环境中。

    Grad-CAM是一种基于梯度的方法,用于生成视觉字幕。基于输出标题,该方法确定输入图像中的哪些区域是重要的。

    - 基于注意的方法通常与顺序数据(例如文本数据)一起使用。除了网络的正常权重之外,还训练注意力量作为“输入门”。这些注意力量决定了最终网络输出中每个不同元素的数量。除了可解释性之外,在例如基于文本的问答的背景下的关注也导致更好的结果,因为网络能够“集中”其注意力。

    在回答问题时,可以指出文本中哪些词最重要,以确定问题的答案。

     

    Lime

    Lime是一个更通用的框架,旨在使“任何”机器学习模型的预测更易于理解。

    为了保持与模型无关,LIME通过在本地修改模型的输入来工作。因此,不是试图同时理解整个模型,而是修改特定的输入实例,并监控对预测的影响。在文本分类的上下文中,这意味着例如替换了一些单词,以确定输入的哪些元素影响预测。

     

    原文:https://towardsdatascience.com/interpretability-in-machine-learning-70c30694a05f

    展开全文
  • 机器学习训练秘籍_学习笔记

    千次阅读 2018-12-12 17:47:34
    本文主要参考“吴恩达deeplearning.ai——机器学习训练秘籍”(https://accepteddoge.github.io/machine-learning-yearning-cn/)进行学习整理的笔记。 一、训练集、开发集、测试集 训练集(training set)用于...

    本文主要参考“吴恩达deeplearning.ai——机器学习训练秘籍”(https://accepteddoge.github.io/machine-learning-yearning-cn/)进行学习整理的笔记。

    一、训练集、开发集、测试集

    训练集(training set用于运行你的学习算法。

    开发集(development set用于调整参数,选择特征,以及对学习算法作出其它决定。有时也称为留出交叉验证集(hold-out cross validation set

    测试集(test set用于评估算法的性能,但不会据此决定使用什么学习算法或参数。

    机器学习中的,一种常见的启发式策略是将 30% 的数据用作测试集,这适用于数据量规模一般的情况(比如 100 至 10,000 个样本)。但是在大数据时代,实际上开发集和测试集的比例会远低30%。

    开发集和测试集应该服从同一分布

    举个例子,假设你的团队开发了一套能在开发集上运行性能良好,却在测试集上效果不佳的系统。如果开发集和测试集分布相同,那么你就会非常清楚地知道问题在哪:在开发集上过拟合了(overfit)。解决方案显然就是获得更多的开发集数据。但是如果开发集和测试集来自不同的分布,解决方案就不那么明确了。

    在处理第三方基准测试(benchmark)问题时,提供方可能已经指定了服从不同分布的开发集和测试集数据。与数据分布一致的情况相比,此时运气带来的性能影响将超过你所使用的技巧带来的影响。找到能够在某个分布上进行训练,并能够推广到另一个分布的学习算法,是一个重要的研究课题。但如果你想要在特定的机器学习应用上取得进展,而不是搞研究,我建议你尝试选择服从相同分布的开发集和测试集数据,这会让你的团队更有效率。

    特例:

    比如大型的神经网络,对于猫咪检测器的示例,我们不会将用户上传的所有 10000 个图像放到开发/测试集合中,而是将其中 5000 张放入。 这样的话,训练集中的 205000 个样本的分布将来自现有的开发/测试集,以及 200000 张网络图片。

    添加额外的 20000 张图片会产生以下影响:

    它给你的神经网络提供了更多关于猫咪外貌的样本。这是很有帮助的,因为互联网图片和用户上传的移动应用图片确实有一些相似之处。你的神经网络可以将从互联网图像中获得的一些知识应用到移动应用图像中。

    它迫使神经网络花费部分容量来学习网络图像的特定属性(比如更高的分辨率,不同画面结构图像的分布等等)。如果这些属性与移动应用图像有很大的不同,那么它将“耗尽”神经网络的一些表征能力,导致从移动应用图像的分布识别数据的能力就会降低,而这正是你真正关心的东西。从理论上讲,这可能会损害算法的性能。

    训练集:这是算法将学习的数据(例如,互联网图像+移动应用图像)。这并不需要我们从与真正关心的相同分布(开发/测试集分布)的数据中提取。

    训练开发集:这些数据来自与训练集相同的分布(例如,互联网图像+移动应用图像)。它通常比训练集要小;它只需要足够大到来评估和跟踪我们的学习算法的进展。

    开发集:这是从与测试集相同分布的数据中抽取出来的,它反映了我们最终关心的数据的分布(例如,移动应用图像) 。

    测试集:这是从与开发集相同分布的数据中抽取出来的(例如,移动应用图像)。

    有了这四个独立的数据集,你现在可以评估:

    训练误差,对训练集进行评估。

    该算法能够泛化到与训练集相同分布数据的能力,并对训练开发集进行评估。

    算法在你实际关心的任务上的性能,通过对开发集 / 测试集评估。

    开发集的规模应该大到足以区分出你所尝试的不同算法间的性能差异。例如,如果分类器 A 的准确率为 90.0% ,而分类器 B 的准确率为 90.1% ,那么仅有 100 个样本的开发集将无法检测出这 0.1% 的差异。相比我所遇到的机器学习问题,一个样本容量为 100 的开发集的规模是非常小的。通常来说,开发集的规模应该在 1,000 到 10,000 个样本数据之间,而当开发集样本容量为 10,000 时,你将很有可能检测到 0.1% 的性能提升。

    从理论上说,还可以检测算法的变化是否会在开发集上造成统计学意义上的显著差异。 然而在实践中,大多数团队并不会为此而烦恼(除非他们正在发表学术研究论文),而且我在检测过程中并没有发现多少有效的统计显著性检验。

    用于选择开发集大小的大多数指导原则也适用于训练开发集。

    拥有开发集、测试集和单值评估指标可以帮你快速评估一个算法,从而加速迭代过程。

    在不同的分布上训练集与开发/测试集的选择?

    1. 如果有足够的计算能力来构建一个足够大的神经网络,可以考虑对训练集额外加入不同于开发集/测试集的数据。相反,应该更加关注训练数据,需要与开发/测试集的分布相匹配
    2. 考虑对开发/测试集额外加入不同于训练集的数据。例如,假设你的开发/测试集主要包含一些内容是人员、地点、地标、动物的任意图片。同时假设集合里面有大量的历史文档扫描图片,这些文件不包含任何类似猫的东西,它们看起来和开发/测试集的分布完全不同,没有必要将这些数据作为负样本,你的神经网络几乎没有任何东西可以从这些数据中学习,加入它们将会浪费计算资源和神经网络的表征能力。但它们可以应用到开发/测试集中,

    二、单值评估指标、优化指标、满意度指标

    单值评估指标(single-number evaluation metric)有很多,分类准确率就是其中的一种。相比之下,查准率(Precision,又译作精度)和查全率(Recall,又译作召回率)均不是单值评估指标,可以使用二者的平均值,F1分数(F1 score),加权平均值等指标。

    当开发集和评估指标不再能给团队一个正确的导向时,就尽快修改它们:(i) 如果你在开发集上过拟合,则获取更多的开发集数据。(ii) 如果开发集和测试集的数据分布和实际关注的数据分布不同,则获取新的开发集和测试集。 (iii) 如果评估指标不能够对最重要的任务目标进行度量,则需要修改评估指标。

    三、误差分析

    误差分析(Error Analysis 指的是检查被算法误分类的开发集样本的过程,以便帮助你找到造成这些误差的原因。这将协助你确定各个项目的优先级并且获得探索新方向的灵感。

    假设你已检查了100 个开发集的误分类样本,可以得到下面的表格:

    图像                         大猫       模糊       备注

    1                                                            不常见的美国比特犬

    2                                                

    3                                                   狮子;雨天在动物园拍摄的图片

    4                                                     树木后的美洲豹

                         …         …         …

    占全体比例      8%       43%      61%

    查看误分类样本的这一过程称为误差分析。在上面的例子中,如果只有 5% 误分类的图像是狗,那么无论你在狗的问题上做多少的算法改进,最终都不会消除超过原有的 5% 误差 . 也即是说 5% 是该计划项目所能起到帮助的“上限”(最大可能值)。所以如果整个系统当前的精度为 90%(对应误差为 10%),那么这种改进最多能将精度提升到 90.5% (对应误差下降到 9.5% 改进了原有 10% 误差其中的 5%)。

    相反,如果你发现 50% 的误分类图像是狗,那就可以自信地说这个项目将效果明显,它可以将精度从 90% 提升到 95% (相对误差减少 50%,整体误差由 10% 下降到 5%)。

    “误标注”指的是图像在使用算法处理前,已经被负责标注的人员进行了错误的标注,也就是说,某个样本  的分类标签(label) 的值并不正确。例如,一些不是猫的图片被误标注为猫,反之亦然。如果你不确定这些被误标注的图片是否起着关键作用,可以添加一个类别来跟踪记录误标注样本的比例:

    图像                        大猫       模糊       误标注  备注

    89                                                                            标注者忽略了背景中的猫

    99                                

    100                                                                           猫的画像;非真猫

    占全体比例        8%           43%       61%         6%

    将开发集明确地分为 Eyeball 和 Blackbox 开发两个子集将很有帮助,它使你了解在人为的误差分析过程中 Eyeball 开发集何时开始发生过拟合。

    Eyeball Blackbox 开发集该设置多大?

    假设你的分类器有 5% 的错误率。为了确保在 Eyeball 开发集中有约 100 个误分类的样本,样本开发集应该有约 2000 个样本(因为 0.05 * 2000 = 100)。分类器的错误率越低,为了获得足够多的错误样本进行误差分析,需要的 Eyeball 开发集就越大。

    Blackbox 开发集有约 1000-10000 个样本是正常的 。完善一下该陈述,一个有 1000-10000 个样本的 Blackbox 开发集通常会为你提供足够的数据去调超参和选择模型,即使数据再多一些也无妨。而含有 100 个样本的 Blackbox 开发集虽然比较小,但仍然是有用的。

    在 Eyeball 和 Blackbox 开发集之间,我认为 Eyeball 开发集更加重要(假设你正在研究一个人类能够很好解决的问题,检查这些样本能使得你更有洞悉力)。如果你只有一个 Eyeball 开发集,你可以在这个开发集上进行误差分析、模型选择和超参数调整,缺点是过拟合开发集的风险更大。

    四、偏差和方差:误差的两大来源

    粗略地说,偏差指的是算法在大型训练集上的错误率;方差指的是算法在测试集上的表现低于训练集的程度。当你使用均方误差(MSE作为误差度量指标时,你可以写下偏差和方差对应的两个公式,并且证明总误差=偏差+方差。但在处理机器学习问题时,此处给出的偏差和方差的非正式定义已经足够。

    最优错误率(“不可避免偏差”):14%。假设我们决定,即使是世界上最好的语音系统,仍会有 14% 的误差。我们可以将其认为是学习算法的偏差“不可避免”的部分。最优错误率也被称为贝叶斯错误率(Bayes error rate),或贝叶斯率

    可避免偏差:1%。即训练错误率和最优误差率之间的差值。

    方差:15%。即开发错误和训练错误之间的差值。

    如果可避免偏差值是负的,即算法在训练集上的表现比最优错误率要好。这意味着你正在过拟合训练集,并且算法已经过度记忆(over-memorized)训练集。你应该专注于有效降低方差的方法,而不是选择进一步减少偏差的方法。

    偏差 = 最佳误差率(“不可避免偏差”)+ 可避免的偏差

    加大模型的规模通常可以减少偏差,但也可能会增加方差和过拟合的风险。然而,这种过拟合风险通常只在你不使用正则化技术的时候出现。如果你的算法含有一个精心设计的正则化方法,通常可以安全地加大模型的规模,而不用担心增加过拟合风险。

    如果具有较高的可避免偏差,那么加大模型的规模(例如通过添加层/神经元数量来增加神经网络的大小)。

    如果具有较高的方差,那么增加训练集的数据量。

    假设你正在应用深度学习方法,使用了 L2 正则化和 dropout 技术,并且设置了在开发集上表现最好的正则化参数。此时你加大模型规模,算法的表现往往会保持不变或提升;它不太可能明显地变差。这种情况下,不使用更大模型的唯一原因就是这将使得计算代价变大。

    减少可避免偏差的技术

    加大模型规模(例如神经元/层的数量):这项技术能够使算法更好地拟合训练集,从而减少偏差。当你发现这样做会增大方差时,通过加入正则化可以抵消方差的增加。

    根据误差分析结果修改输入特征:假设误差分析结果鼓励你增加额外的特征,从而帮助算法消除某个特定类别的误差。(我们会在接下来的章节深入讨论这个话题。)这些新的特征对处理偏差和方差都有所帮助。理论上,添加更多的特征将增大方差;当这种情况发生时,你可以加入正则化来抵消方差的增加。

    减少或者去除正则化(L2 正则化,L1 正则化,dropout):这将减少可避免偏差,但会增大方差。

    修改模型架构(比如神经网络架构)使之更适用于你的问题:这将同时影响偏差和方差。

    有一种方法并不能奏效:

    添加更多的训练数据:这项技术可以帮助解决方差问题,但它对于偏差通常没有明显的影响。

    减少方差的技术

    添加更多的训练数据:这是最简单最可靠的一种处理方差的策略,只要你有大量的数据和对应的计算能力来处理他们。

    加入正则化(L2 正则化,L1 正则化,dropout):这项技术可以降低方差,但却增大了偏差。

    加入提前终止(例如根据开发集误差提前终止梯度下降):这项技术可以降低方差但却增大了偏差。提前终止(Early stopping)有点像正则化理论,一些学者认为它是正则化技术之一。

    通过特征选择减少输入特征的数量和种类:这种技术或许有助于解决方差问题,但也可能增加偏差。稍微减少特征的数量(比如从 1000 个特征减少到 900 个)也许不会对偏差产生很大的影响,但显著地减少它们(比如从 1000 个特征减少到 100 个,10 倍地降低)则很有可能产生很大的影响,你也许排除了太多有用的特征。在现代深度学习研究过程中,当数据充足时,特征选择的比重需要做些调整,现在我们更可能将拥有的所有特征提供给算法,并让算法根据数据来确定哪些特征可以使用。而当你的训练集很小的时候,特征选择是非常有用的。

    减小模型规模(比如神经元/层的数量):谨慎使用。这种技术可以减少方差,同时可能增加偏差。然而我不推荐这种处理方差的方法,添加正则化通常能更好的提升分类性能。 减少模型规模的好处是降低了计算成本,从而加快了你训练模型的速度。如果加速模型训练是有用的,那么无论如何都要考虑减少模型的规模。但如果你的目标是减少方差,且不关心计算成本,那么考虑添加正则化会更好。

    下面是两种额外的策略,和解决偏差问题章节所提到的方法重复:

    根据误差分析结果修改输入特征:假设误差分析的结果鼓励你创建额外的特征,从而帮助算法消除某个特定类别的误差。这些新的特征对处理偏差和方差都有所帮助。理论上,添加更多的特征将增大方差;当这种情况发生时,加入正则化,这可以消除方差的增加。

    修改模型架构(比如神经网络架构)使之更适用于你的问题:这项策略将同时影响偏差和方差。

    五、绘制学习曲线

    存在训练集噪声致使难以正确理解曲线的变化时,有两种解决方案:

    与其只使用 10 个样本训练单个模型,不如从你原来的 100 个样本中进行随机有放回抽样,选择几批(比如 3-10 )不同的 10 个样本进行组合。在这些数据上训练不同的模型,并计算每个模型的训练和开发错误。最终,计算和绘制平均训练集误差和平均开发集误差

    如果你的训练集偏向于一个类,或者它有许多类,那么选择一个“平衡”子集,而不是从 100 个样本中随机抽取 10 个训练样本。例如,你可以确保这些样本中的 2/10是正样本,8/10 是负样本。更常见的做法是,确保每个类的样本比例尽可能地接近原始训练集的总体比例

    在实践中,用有放回抽样和无放回抽样的差异不大,但是前者更为常见。

    六、构建机器学习系统

    处理人类擅长的任务时:

    1、易于从人为标签中获取数据。

    2、基于人类直觉进行误差分析。

    3、使用人类表现水平来估计最优错误率,并设置可达到的“期望错误率”。

    处理人类不擅长的任务时:

    1、获取标签数据很难。​

    2、人类的直觉难以依靠。

    3、最优错误率和合理的期望错误率难以确定。

    同时,可以根据这三点对学习系统进行改良。

    七、优化验证测试

    可以判断出改进学习算法与改进得分函数哪个更重要。

    八、端到端的学习

    在数据量十分丰富的问题上,端到端系统往往很奏效,但它并不总是一个很好的选择。

    什么时候选择流水线?数据可用性,人物简单性。

    流水线例子:

    假设你正在构建一个暹罗猫检测器。下面是一个纯粹的端到端架构:

    与此相反,你可以分成两个步骤来形成流水线:

    与仅仅使用标签 0/1 来训练一个纯粹的端到端分类器相比,流水线中的两个组件——猫咪检测器和猫种类分类器——似乎更容易进行学习,而且需要更少的数据。(其中每个组件都是一个相对 “简单” 的功能,因此只需要从少量的数据中学习。)

    端到端例子:

    这体现了深度学习的高速变化趋势:当你有正确的(输入,输出)标签对的时候,有时可以进行端到端学习,即使输出是一个句子、图像、音频,或者其它的比一个数字更丰富的输出形式。

    九、根据组件进行误差分析

    非正式:查看每个组件的输出,并看看是否可以决定哪个部分出错了。

    正式:对每个组件提供“完美”输入,再判断误差。比如,猫检测器输出了边界框将猫咪切断,用手动标记的边界框替换猫检测器的输出,然后判断猫种类分类器。

    组件误差分析与人类水平对比

    1、在检测汽车时,汽车检测组件与人类水平表现相差多少?

    2、在检测行人时,行人检测组件与人类水平表现相差多少?

    3、整个系统的性能与人类表现相差多少?在这里,人类水平的表现假定:人类必须仅根据前两个流水线组件的输出(而不是访问摄像机图像)来规划汽车的路径。

    ML 流水线存在缺陷

    如果你认为,即使每个组件都具有人类级别的性能(请记住,你要与被给予与组件相同输入的人类进行比较),流水线整体上也不会达到人类水平的性能,则表明流水线有缺陷,应该重新设计。

    在前一章中,我们提出了这三个部分组件的表现是否达到人类水平的问题。假设所有三个问题的答案都是肯定的,也即是说:

    汽车检测部件(大概)是人类级别的性能,用于从摄像机图像中检测汽车。

    行人检测组件(大概)是人类级别的性能,用于从摄像机图像中检测行人。

    与仅根据前两个流水线组件的输出(而不是访问摄像机图像)规划汽车路径的人相比,路径规划组件的性能处于类似水平。

    然而,你的自动驾驶汽车的整体性能远远低于人类水平。即,能够访问摄像机图像的人可以为汽车规划出明显更好的路径。据此你能得出什么结论?唯一可能的结论是ML 流水线存在缺陷。

    十、小技巧_扩大训练集

    1、不同分布的训练集和开发/测试集,然后给不同的数据加上不同的权重

    例如,训练集包含了互联网图像+移动应用图像,而开发/测试集只包含移动应用图像。只有当你怀疑这些额外的数据(网络图像)与开发/测试集分布不一致,或者额外的数据规模比与相同分布的开发/测试集(手机图像)数据规模大得多时,这种类型的权重加权才需要。

    此时需要四个数据子集:

    训练集:这是算法将学习的数据(例如,互联网图像+移动应用图像)。这并不需要我们从与真正关心的相同分布(开发/测试集分布)的数据中提取。

    训练开发集:这些数据来自与训练集相同的分布(例如,互联网图像+移动应用图像)。它通常比训练集要小;它只需要足够大到来评估和跟踪我们的学习算法的进展。

    开发集:这是从与测试集相同分布的数据中抽取出来的,它反映了我们最终关心的数据的分布(例如,移动应用图像) 。

    测试集:这是从与开发集相同分布的数据中抽取出来的(例如,移动应用图像)。

    有了这四个独立的数据集,你现在可以评估:

    训练误差,对训练集进行评估。

    该算法能够泛化到与训练集相同分布数据的能力,并对训练开发集进行评估。

    算法在你实际关心的任务上的性能,通过对开发集/测试集评估。

    评估解读:

    假设在猫咪检测任务中,人类获得了近乎完美的性能(0%误差),因此最优错误率大约为 0%。

    1% 的训练集误差;5% 的训练开发集误差;5% 的开发集误差——>高方差

    10% 的训练集误差;11% 的训练开发集误差;12% 的开发集误差——>高偏差

    10% 的训练集误差;11% 的训练开发集误差;20% 的开发集误差——>高偏差、高方差

    2、人工合成数据

    当你在合成数据时,请考虑一下你是否真的在合成一组具有代表性的样本。尽量避免给出合成数据的属性,防止过拟合。

    附件1:中英文对照

    机器学习:machine learning

    神经网络:NN,neural network

    梯度下降:gradient descent

    层:layer

    隐藏元:hidden units

    参数:parameters

    标签:label

    线性回归:linear regression

    对数几率回归/逻辑回归:logistic regression

    数据可用性:data availability

    计算规模:computational scale

    性能表现:performance

    学习算法:learning algo

    小型:small

    中型:medium

    大型:large

    训练集:training set

    开发集:development set

    留出交叉验证集:hold-out cross validation set

    测试集:test set

    分类器:classifier

    泛化:generalize

    实际分布:actual distribution

    过拟合:overfit

    过拟合:overfitting

    欠拟合:underfitting

    基准测试:benchmark

    单值评估指标:single-number evaluation metric

    查准率/精确度:Precision

    查全率/召回率:Recall

    想法:idea

    代码:code

    实验:experiment

    误差分析:Error Analysis

    被误标注:mislabeled

    偏差:bias

    方差:variance

    学习曲线:Learning curves

    优化验证测试:Optimization Verification test

    附件2:定义及公式

    1、F分数

    https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D15/sign=567782a871f082022992953a4afb5ba9/500fd9f9d72a6059de1187912a34349b033bba3c.jpg 分数(https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D15/sign=567782a871f082022992953a4afb5ba9/500fd9f9d72a6059de1187912a34349b033bba3c.jpg  Score),又称平衡F分数(balanced F Score),它被定义为精确率和召回率调和平均数

    https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D182/sign=eed1ed8a5e6034a82de2bc89f91149d9/4610b912c8fcc3ceb409adb89045d688d53f206b.jpg

    更一般的,我们定义

     https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D19/sign=1bf123304510b912bbc1f2f7c1fd62d1/f3d3572c11dfa9ec5cf3329c60d0f703908fc158.jpg 分数为

    https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D265/sign=30335b98df54564ee165e33f86df9cde/c2cec3fdfc039245afef86848594a4c27c1e25e6.jpg

     https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D15/sign=567782a871f082022992953a4afb5ba9/500fd9f9d72a6059de1187912a34349b033bba3c.jpg https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D16/sign=6a125c080d2442a7aa0ef9a3d04342b1/6a63f6246b600c337307b843184c510fd9f9a13b.jpg https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D25/sign=e555f8a3952bd40746c7d4f87a89495c/9922720e0cf3d7ca97ba59fdf01fbe096a63a9e9.jpg 分数在统计学中也得到大量的应用

     https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D16/sign=6a125c080d2442a7aa0ef9a3d04342b1/6a63f6246b600c337307b843184c510fd9f9a13b.jpg 分数中,召回率的权重高于准确率

     https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D25/sign=e555f8a3952bd40746c7d4f87a89495c/9922720e0cf3d7ca97ba59fdf01fbe096a63a9e9.jpg分数中,准确率的权重高于召回率

    2、G分数

    F分数是准确率和召回率的调和平均数G分数被定义为准确率和召回率的几何平均数

    https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D162/sign=c20d5b523b01213fcb334ada66e636f8/d058ccbf6c81800a56c5e685b33533fa828b471c.jpg

    展开全文
  • 因此,我必须找到一个可以轻松地将我的机器学习模型与其他开发人员集成的解决方案,这些开发人员可以比我更好地构建强大的Web应用程序 通过为我的模型构建REST API,我可以将我的代码与其他开发人员分开。这里有一...

    作为Python开发人员和数据科学家,我希望构建Web应用程序来展示我的工作。尽管我喜欢设计和编写前端代码,但很快就会成为网络应用程序开发和机器学习的佼佼者。因此,我必须找到一个可以轻松地将我的机器学习模型与其他开发人员集成的解决方案,这些开发人员可以比我更好地构建强大的Web应用程序

    通过为我的模型构建REST API,我可以将我的代码与其他开发人员分开。这里有一个明确的分工,这对于定义职责很有帮助,并且阻止我直接阻止那些不参与项目机器学习方面的队友。另一个优点是我的模型可以由在不同平台上工作的多个开发人员使用。

    在本文中,我将构建一个简单的Scikit-Learn模型,并使用Flask RESTful将其部署为REST API 。本文特别适用于没有广泛计算机科学背景的数据科学家。

     

    关于模型

    在这个例子中,我整理了一个简单的Naives Bayes分类器来预测电影评论中发现的短语的情绪。

    这些数据来自Kaggle比赛,电影评论的情感分析。评论被分成单独的句子,句子进一步分成单独的短语。所有短语都具有情感分数,以便可以训练模型,其中哪些单词对句子具有积极,中立或消极的情绪。

    从Kaggle数据集中分配评级

    大多数短语都有中性评级。起初,我尝试使用多项式朴素贝叶斯分类器来预测5种可能类别中的一种。但是,由于大多数数据的评级为2,因此该模型的表现不佳。我决定保持简单,因为本练习的主要内容主要是关于部署为REST API。因此,我将数据限制在极端类别,并训练模型仅预测负面或正面情绪。

    事实证明,多项式朴素贝叶斯模型在预测正面和负面情绪方面非常有效。您可以在此Jupyter笔记本演练中快速了解模型培训过程。在Jupyter笔记本中训练模型后,我将代码转移到Python脚本中,并为NLP模型创建了一个类对象。您可以在此链接中找到我的Github仓库中的代码。您还需要挑选模型,以便快速将训练过的模型加载到API脚本中。

    现在我们有了模型,让我们将其部署为REST API。

     

    REST API指南

    为API的Flask应用程序启动一个新的Python脚本。

    导入库和加载Pickles

    下面的代码块包含很多Flask样板和加载分类器和矢量化器pickles的代码。

    from flask import Flask
    from flask_restful import reqparse, abort, Api, Resource
    import pickle
    import numpy as np
    from model import NLPModel
    app = Flask(__name__)
    api = Api(app)
    # create new model object
    model = NLPModel()
    # load trained classifier
    clf_path = 'lib/models/SentimentClassifier.pkl'
    with open(clf_path, 'rb') as f:
        model.clf = pickle.load(f)
    # load trained vectorizer
    vec_path = 'lib/models/TFIDFVectorizer.pkl'
    with open(vec_path, 'rb') as f:
        model.vectorizer = pickle.load(f)

     

    创建一个参数解析器

    解析器将查看用户发送给API的参数。参数将在Python字典或JSON对象中。对于这个例子,我们将专门寻找一个名为的密钥query。查询将是用户希望我们的模型预测短语是正面还是负面的短语。

    # argument parsing
    parser = reqparse.RequestParser()
    parser.add_argument('query')

     

    资源类对象

    资源是Flask RESTful API的主要构建块。每个类别可以具有对应于的REST API的主要行动,如方法:GETPUTPOST,和DELETEGET将是主要方法,因为我们的目标是提供预测。在get下面的方法中,我们提供了有关如何处理用户查询以及如何打包将返回给用户的JSON对象的说明。

    class PredictSentiment(Resource):
        def get(self):
            # use parser and find the user's query
            args = parser.parse_args()
            user_query = args['query']
            # vectorize the user's query and make a prediction
            uq_vectorized = model.vectorizer_transform(
                np.array([user_query]))
            prediction = model.predict(uq_vectorized)
            pred_proba = model.predict_proba(uq_vectorized)
            # Output 'Negative' or 'Positive' along with the score
            if prediction == 0:
                pred_text = 'Negative'
            else:
                pred_text = 'Positive'
                
            # round the predict proba value and set to new variable
            confidence = round(pred_proba[0], 3)
            # create JSON object
            output = {'prediction': pred_text, 'confidence': confidence}
            
            return output

     

    端点

    以下代码将基本URL设置为情绪预测器资源。您可以想象您可能有多个端点,每个端点指向可以进行不同预测的不同模型。一个示例可以是端点,'/ratings'其将指导用户到另一个模型,该模型可以预测给定类型,预算和生产成员的电影评级。您需要为第二个模型创建另一个资源对象。这些可以一个接一个地添加,如下所示。

    api.add_resource(PredictSentiment, '/')
      
    # example of another endpoint
    api.add_resource(PredictRatings, '/ratings')
    

     

    名称==主要区块

    这里不多说。如果要将此API部署到生产环境,请将debug设置为False。

    if __name__ == '__main__':
        app.run(debug=True)

     

    用户请求

    以下是用户如何访问您的API以便他们获得预测的一些示例。

    使用Jupyter笔记本中的Requests模块:

    url = 'http://127.0.0.1:5000/'
    params ={'query': 'that movie was boring'}
    response = requests.get(url, params)
    response.json()
    Output: {'confidence': 0.128, 'prediction': 'Negative'}

     

    使用curl:

    $ curl -X GET http://127.0.0.1:5000/ -d query='that movie was boring'
    {
        "prediction": "Negative",
        "confidence": 0.128
    }

     

    使用HTTPie:

    $ http http://127.0.0.1:5000/ query=='that movie was boring'
    HTTP/1.0 200 OK
    Content-Length: 58
    Content-Type: application/json
    Date: Fri, 31 Aug 2018 18:49:25 GMT
    Server: Werkzeug/0.14.1 Python/3.6.3
    {
        "confidence": 0.128,
        "prediction": "Negative"
    }

    现在,我的队友可以通过向这个API发出请求来为他们的应用添加情绪预测,而无需将Python和JavaScript混合在一起。

     

    完整app.py 代码

    有时在一个地方查看所有代码会很有帮助。

    from flask import Flask
    from flask_restful import reqparse, abort, Api, Resource
    import pickle
    import numpy as np
    from model import NLPModel
    
    app = Flask(__name__)
    api = Api(app)
    
    model = NLPModel()
    
    clf_path = 'lib/models/SentimentClassifier.pkl'
    with open(clf_path, 'rb') as f:
        model.clf = pickle.load(f)
    
    vec_path = 'lib/models/TFIDFVectorizer.pkl'
    with open(vec_path, 'rb') as f:
        model.vectorizer = pickle.load(f)
    
    # argument parsing
    parser = reqparse.RequestParser()
    parser.add_argument('query')
    
    
    class PredictSentiment(Resource):
        def get(self):
            # use parser and find the user's query
            args = parser.parse_args()
            user_query = args['query']
    
            # vectorize the user's query and make a prediction
            uq_vectorized = model.vectorizer_transform(np.array([user_query]))
            prediction = model.predict(uq_vectorized)
            pred_proba = model.predict_proba(uq_vectorized)
    
            # Output either 'Negative' or 'Positive' along with the score
            if prediction == 0:
                pred_text = 'Negative'
            else:
                pred_text = 'Positive'
                
            # round the predict proba value and set to new variable
            confidence = round(pred_proba[0], 3)
    
            # create JSON object
            output = {'prediction': pred_text, 'confidence': confidence}
            
            return output
    
    
    # Setup the Api resource routing here
    # Route the URL to the resource
    api.add_resource(PredictSentiment, '/')
    
    
    if __name__ == '__main__':
        app.run(debug=True)

     

    文件结构

    我想要包含的最后一件事是对这个简单API的文件结构的一点概述。

    <span style="color:rgba(0, 0, 0, 0.84)">情绪-CLF / 
    ├──README.md 
    ├──app.py   <strong>#瓶REST API脚本</strong>
     ├──build_model.py   <strong>#脚本来构建和酸洗分类</strong>
     ├──model.py   <strong>的分类类对象#脚本</strong>
     ├─ ─util.py   <strong>#辅助函数</strong>
     ├──requirements.txt 
    └──LIB / 
        ├──数据/   <strong>从Kaggle#数据</strong>
         │├──sampleSubmission.csv 
        │├──test.tsv 
        │└──train.tsv 
        └─ ─型号/   <strong>#腌制模型导入到API脚本</strong>
             ├──SentimentClassifier.pkl 
            └──TFIDFVectorizer.pkl</span>

     

    部署

    一旦您构建了模型和REST API并在本地完成测试,您就可以像将任何Flask应用程序部署到Web上的许多托管服务一样部署API。通过在Web上部署,各地的用户都可以向您的URL发出请求以获取预测。部署指南包含在Flask文档中。

     

     

    闭幕

    这只是为情绪分类器构建Flask REST API的一个非常简单的示例。一旦您训练并保存了相同的过程,就可以应用于其他机器学习或深度学习模型。

    除了将模型部署为REST API之外,我还使用REST API来管理数据库查询,以便通过从Web上抓取来收集数据。这使我可以与全栈开发人员协作,而无需管理其React应用程序的代码。如果移动开发人员想要构建应用程序,那么他们只需熟悉API端点即可。

     

    原文: https://towardsdatascience.com/deploying-a-machine-learning-model-as-a-rest-api-4a03b865c166

     

     

    展开全文
  • 机器学习模型评估指标

    千次阅读 2017-12-04 19:09:11
    本文主要解释一些关于机器学习模型评价的主要概念,与评价中可能会遇到的一些陷阱。如训练集-验证集二划分校验(Hold-out validation)、交叉校验(Cross-validation)、超参数调优(hyperparameter tuning)等。这三...

    原文章地址:http://blog.csdn.net/heyongluoyao8/article/details/49408319#

    机器学习模型评价(Evaluating Machine Learning Models)-主要概念与陷阱

    前言

      本文主要解释一些关于机器学习模型评价的主要概念,与评价中可能会遇到的一些陷阱。如训练集-验证集二划分校验(Hold-out validation)、交叉校验(Cross-validation)、超参数调优(hyperparameter tuning)等。这三个术语都是从不同的层次对机器学习模型进行校验。Hold-out validation与Cross-validation是将模型能够更好得对将来的数据(unseen data)进行拟合而采用的方法。Hyperparameter tuning是一种模型选择方法。
      机器学习是一门跨学科领域,涉及到统计学、计算机科学、最优化理论、信息理论、神经科学、理论物理以及其他领域。同时,机器学习也是一门非常年轻的学科。机器学习的大规模应用仅仅开始于过去二十年。当今,数据科学应用已成为一种职业。就像西部开发一样,拥有则无尽的机会,同时也有伴随着很多迷惑与问题。
      本文将从以下部分对机器学习模型的评价进行介绍:
    * 介绍模型离线与在线评价体系与知识;
    * 介绍一些不同类别下得机器学习模型评价指标,如分类回归、排序等。
    * 介绍训练目标、模型验证指标的区别
    * 介绍解决数据倾斜的一些方法以及模型参数调优的方法
    * 最后介绍一些工具,如GraphLab与Dato等。

    机器学习Workflow

      一般的,机器学习过程包括两个阶段,分别为:原型设计阶段(Prototyping)与应用阶段(Deployed),与软件开发类似的Debug与Release阶段。如下图所示:
    ![Alt text](./屏幕快照 2015-09-26 下午4.30.10.png)
    Prototyping阶段是使用历史数据训练一个适合解决目标任务的一个或多个机器学习模型,并对模型进行验证(Validation)与离线评估(Offline evalutation),然后通过评估指标选择一个较好的模型。如在分类任务中,选择一个适合自己问题的最好的分类算法。Deployed阶段是当模型达到设定的指标值时便将模型上线,投入生产,使用新生成的数据来对该模型进行在线评估(Online evalution),以及使用新数据更新模型。在对模型进行离线评估或者在线评估时,它们所用的评价指标往往不同。如在离线评估中,我们精彩使用的有准确率(accuracy)、精确率-召回率(precision-recall),而在在线评估中,一般使用一些商业评价指标,如用户生命周期值(customer lifetime value)、广告点击率(click through rate)、用户流失率(customer churn rate)等,这些指标才是模型使用者最终关心的一些指标。甚至在对模型进行训练和验证过程中使用的评价指标都不一样。
      同时我们注意到,在这两个阶段使用的数据集也不一样,分别是历史数据(historical data)与新数据(live data)。在机器学习中,很多模型都是假设数据的分布是一定的,不变的,即历史数据与将来的数据都服从相同的分布。但是,在现实生活中,这种假设往往是不成立的,即数据的分布会随着时间的移动而改变,有时甚至变化得很急剧,这种现象称为分布漂移(Distribution Drift)。例如,在文章推荐系统中,文章的主题集数目和主题的发生频率可能是每天改变的,甚至每个小时都在改变,昨天流行的主题在今天可能就不再流行了。如在新闻推荐中,新闻主题就变更得非常快。因此在进行模型构建之时,我们需要去扑捉分布漂移信息并使自己的模型能够应对这种情况。一个常用的方法便是使用一些验证指标对模型在不断新生的数据集上进行性能跟踪。如果指标值能够达到模型构建时的指标值,那么表示模型能够继续对当前数据进行拟合。当性能开始下降时,说明该模型已经无法拟合当前的数据了,因此需要对模型进行重新训练了。
      不同的机器学习任务有着不同的性能评价指标。例如,在垃圾邮件检测系统中,它本身是一个二分类问题(垃圾邮件vs正常邮件),可以使用准确率(Accuracy)、对数损失函数(log-loss)、AUC等评价方法。又如在股票预测中,它本身是一个实数序列数据预测问题,可以使用平方根误差(root mean square error, RMSE)等指标;又如在搜索引擎中进行与查询相关的项目排序中,可以使用精确率-召回率(precision-recall)、NDCG(normalized discounted cumulative gain)。
      正如前面所提到的那样,在原型阶段中最重要的任务便是选择一个正确的适合的模型对数据进行拟合。而当模型训练完毕后,我们需要使用一个与训练数据集独立的新的数据集去对模型进行验证。因为模型本身就是使用训练数据集训练出来的,因此它已经对训练集进行了很好的拟合,但是它在新的数据集上的效果则有待验证,因此需要使用新的与训练集独立的数据集对模型进行训练,确保该模型在新的数据集上也能够满足要求。模型能够对新的数据也能work称为模型的泛化能力。
      那么新的数据集如何得来呢?一般的解决方法是将已有的数据集随机划分成两个个部分,一个用来训练模型,另一个用来验证与评估模型。另一种方法是重采样,即对已有的数据集进行有放回的采样,然后将数据集随机划分成两个部分,一个用来训练,一个用来验证。至于具体的做法有hold-out validation、k-fold cross-validation、bootstrapping与jackknife resampling,后面会进行详细介绍。
      机器学习模型建立过程其实是一个参数学习与调优的过程。对模型进行训练,便是模型参数的学习更新过程。模型出了这些常规参数之外,还存在超参数(hyperparameters)。它们之间有何区别呢?简而言之,模型参数使指通过模型训练中的学习算法而进行调整的,而模型超参数不是通过学习算法而来的,但是同样也需要进行调优。举例,我们在对垃圾邮件检测进行建模时,假设使用logistic回归。那么该任务就是在特征空间中寻找能够将垃圾邮件与正常邮件分开的logistic函数位置,于是模型训练的学习算法便是得到各个特征的权值,从而决定函数的位置。但是该学习算法不会告诉我们对于该任务需要使用多少个特征来对一封邮件进行表征,特征的数目这个参数便是该模型的超参数。
      超参数的调优是一个相当复杂与繁琐的任务。在模型原型设计阶段,需要尝试不同的模型、不同的超参数意见不同的特征集,我们需要寻找一个最优的超参数,因此需要使用相关的搜索算法去寻找,如格搜索(grid search)、随机搜索(random search)以及启发式搜索(smart search)等。这些搜索算法是从超参数空间中寻找一个最优的值。本文后面会进行详细介绍。
      当模型使用离线数据训练好并满足要求后,就需要将模型使用新的在线数据进行上线测试,这就是所谓的在线测试。在线测试不同于离线测试,有着不同的测试方法以及评价指标。最常见的便是A/B testing,它是一种统计假设检验方法。不过,在进行A/B testing的时候,会遇到很多陷阱与挑战,具体会在本文后面进行详细介绍。另一个相对使用较小的在线测试方法是multiarmed bandits。在某些情况下,它比A/B testing的效果要好。后面会进行具体讲解。

    评价指标(Evaluation metrics)

      评价指标是机器学习任务中非常重要的一环。不同的机器学习任务有着不同的评价指标,同时同一种机器学习任务也有着不同的评价指标,每个指标的着重点不一样。如分类(classification)、回归(regression)、排序(ranking)、聚类(clustering)、热门主题模型(topic modeling)、推荐(recommendation)等。并且很多指标可以对多种不同的机器学习模型进行评价,如精确率-召回率(precision-recall),可以用在分类、推荐、排序等中。像分类、回归、排序都是监督式机器学习,本文的重点便是监督式机器学习的一些评价指标。

    分类评价指标

      分类是指对给定的数据记录预测该记录所属的类别。并且类别空间已知。它包括二分类与多分类,二分类便是指只有两种类别,如垃圾邮件分类中便是二分类问题,因为类别空间只有垃圾邮件和非垃圾邮件这两种,可以称为“负”(negative)与正(positive)两种类别,一般在实际计算中,将其映射到“0”-“1” class中;而多分类则指类别数超过两种。下面主要根据二分类的评价指标进行讲解,不过同时它们也可扩展到多分类任务中。下面对分类中一些常用的评价指标进行介绍。

    准确率(Accuracy)

      准确率是指在分类中,使用测试集对模型进行分类,分类正确的记录个数占总记录个数的比例:

    accuracy=ncorrectntotal

      准确率看起来非常简单。然而,准确率评价指标没有对不同类别进行区分,即其平等对待每个类别。但是这种评价有时是不够的,比如有时要看类别0与类别1下分类错误的各自个数,因为不同类别下分类错误的代价不同,即对不同类别的偏向不同,比如有句话为“宁可错杀一万,不可放过一千“就是这个道理,例如在病患诊断中,诊断患有癌症实际上却未患癌症(False Positive)与诊断未患有癌症的实际上却患有癌症(False Negative)的这两种情况的重要性不一样。。另一个原因是,可能数据分布不平衡,即有的类别下的样本过多,有的类别下的样本个数过少,两类个数相差较大。这样,样本占大部分的类别主导了准确率的计算,为了解决这个问题,对准确率进行改进,得到平均准确率。

    平均准确率(Average Per-class Accuracy)

      为了应对每个类别下样本的个数不一样的情况,对准确率进行变种,计算每个类别下的准确率,然后再计算它们的平均值。举例,类别0的准确率为80%,类别1下的准确率为97.5%,那么平均准确率为(80%+97.5%)/2=88.75%。因为每个类别下类别的样本个数不一样,即计算每个类别的准确率时,分母不一样,则平均准确率不等于准确率,如果每个类别下的样本个数一样,则平均准确率与准确率相等。
      平均准确率也有自己的缺点,比如,如果存在某个类别,类别的样本个数很少,那么使用测试集进行测试时(如k-fold cross validation),可能造成该类别准确率的方差过大,意味着该类别的准确率可靠性不强。

    对数损失函数(Log-loss)

      在分类输出中,若输出不再是0-1,而是实数值,即属于每个类别的概率,那么可以使用Log-loss对分类结果进行评价。这个输出概率表示该记录所属的其对应的类别的置信度。比如如果样本本属于类别0,但是分类器则输出其属于类别1的概率为0.51,那么这种情况认为分类器出错了。该概率接近了分类器的分类的边界概率0.5。Log-loss是一个软的分类准确率度量方法,使用概率来表示其所属的类别的置信度。Log-loss具体的数学表达式为:

    log_loss=1Ni=1Nyilogpi+(1yi)log(1pi)

    其中,yi是指第i个样本所属的真实类别0或者1,pi表示第i个样本属于类别1的概率,这样上式中的两个部分对于每个样本只会选择其一,因为有一个一定为0,当预测与实际类别完全匹配时,则两个部分都是0,其中假定0log0=0。
      其实,从数学上来看,Log-loss的表达式是非常漂亮的。我们仔细观察可以发现,其信息论中的交叉熵(Cross Entropy,即真实值与预测值的交叉熵),它与相对熵(Relative Entropy,也称为KL距离或KL散度, Kullback–Leibler divergence.)也非常像。信息熵是对事情的不确定性进行度量,不确定越大,熵越大。交叉熵包含了真实分布的熵加上假设与真实分布不同的分布的不确定性。因此,log-loss是对额外噪声(extra noise)的度量,这个噪声是由于预测值域实际值不同而产生的。因此最小化交叉熵,便是最大化分类器的准确率。

    精确率-召回率(Precision-Recall)

      精确率-召回率其实是两个评价指标。但是它们一般都是同时使用。精确率是指分类器分类正确的正样本的个数占该分类器所有分类为正样本个数的比例。召回率是指分类器分类正确的正样本个数占所有的正样本个数的比例。

    F1-score:

      F1-score为精确率与召回率的调和平均值,它的值更接近于Precision与Recall中较小的值。即:

    F1=2precisionrecallprecision+recall

    AUC(Area under the Curve(Receiver Operating Characteristic, ROC))

      AUC的全称是Area under the Curve,即曲线下的面积,这条曲线便是ROC曲线,全称为the Receiver Operating Characteristic曲线,它最开始使用是上世纪50年代的电信号分析中,在1978年的“Basic Principles of ROC Analysis ”开始流行起来。ROC曲线描述分类器的True Positive Rate(TPR,分类器分类正确的正样本个数占总正样本个数的比例)与False Positive Rate(FPR,分类器分类错误的负样本个数占总负样本个数的比例)之间的变化关系。如下图所示:

    如上图,ROC曲线描述FPR不断变化时,TPR的值,即FPR与TPR之间的关系曲线。显而易见,最好的分类器便是FPR=0%,TPR=100%,但是一般在实践中一个分类器很难会有这么好的效果,即一般TPR不等于1,FPR不等于0的。当使用ROC曲线对分类器进行评价时,如果对多个分类器进行比较时,如果直接使用ROC曲线很难去比较,只能通过将ROC分别画出来,然后进行肉眼比较,那么这种方法是非常不便的,因此我们需要一种定量的指标去比较,这个指标便是AUC了,即ROC曲线下的面积,面积越大,分类器的效果越好,AUC的值介于0.5到1.0之间。
      具体如何描绘ROC曲线,如在二分类中,我们需要设定一个阈值,大于阈值分类正类,否则分为负类。因此,我们可以变化阈值,根据不同的阈值进行分类,根据分类结果计算得到ROC空间中的一些点,连接这些点就形成ROC曲线。ROC曲线会经过(0,0)与(1,1)这两点,实际上这两点的连线形成的ROC代表一个随机分类器,一般情况下分类器的ROC曲线会在这条对角连线上方。
      在ROC曲线中,点(0,0)表示TPR=0,FPR=0,即分类器将每个实例都预测为负类;点(1,1)表示TPR=1,FPR=1,即分类器将每个实例都预测为正类;点(0,0)表示TPR=1,FPR=0,即分类器将每个正类实例都预测为正类,将每个负类实例都预测为负类,这是一个理想模型。
      ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中,经常会出现类别不平衡(class imbalance)现象,即负样本比正样本少很多(或者相反),而且测试数据集中的正负样本的分布也可能随时间发生变化。关于ROC与AUC更多的讲解,参见这里

    混淆矩阵(Confusion Matrix)

      混淆矩阵是对分类的结果进行详细描述的一个表,无论是分类正确还是错误,并且对不同的类别进行了区分,对于二分类则是一个2*2的矩阵,对于n分类则是n*n的矩阵。对于二分类,第一行是真实类别为“Positive”的记录个数(样本个数),第二行则是真实类别为“Negative”的记录个数,第一列是预测值为“Positive”的记录个数,第二列则是预测值为“Negative”的记录个数。如下表所示:

      Predicted as Positive Predicted as Negative
    Labeled as Positive True Positive(TP) False Negative(FN)
    Labeled as Negative False Positive(FP) True Negative(TN)

    如上表,可以将结果分为四类:
    * 真正(True Positive, TP):被模型分类正确的正样本;
    * 假负(False Negative, FN):被模型分类错误的正样本;
    * 假正(False Positive, FP):被模型分类的负样本;
    * 真负(True Negative, TN):被模型分类正确的负样本;

    进一步可以推出这些指标:
    * 真正率(True Positive Rate, TPR),又名灵敏度(Sensitivity):分类正确的正样本个数占整个正样本个数的比例,即:TPR=TPTP+FN
    * 假负率(False Negative Rate, FNR):分类错误的正样本的个数占正样本的个数的比例,即:FNR=FNTP+FN
    * 假正率(False Positive Rate, FPR):分类错误的负样本个数占整个负样本个数的比例,即:FPR=FPFP+TN
    * 真负率(True Negative Rate, TNR):分类正确的负样本的个数占负样本的个数的比例,即:TNR=TNFP+TN

    进一步,由混淆矩阵可以计算以下评价指标:
    * 准确率(Accuracy):分类正确的样本个数占所有样本个数的比例,即:

    accuracy=TP+TNTP+FN+FP+TN

    * 平均准确率(Average per-class accuracy):每个类别下的准确率的算术平均,即:
    average_accuracy=TPTP+FN+TNTN+FP2

    * 精确率(Precision):分类正确的正样本个数占分类器所有的正样本个数的比例,即:
    Precision=TPTP+FP

    * 召回率(Recall):分类正确的正样本个数占正样本个数的比例,即:
    Recall=TPTP+FN

    * F1-Score:精确率与召回率的调和平均值,它的值更接近于Precision与Recall中较小的值,即:
    F1=2precisionrecallprecision+recall

    * ROC曲线
    ROC曲线的x轴便是FPR,y轴便是TPR。

    回归评价指标

      与分类不同的是,回归是对连续的实数值进行预测,即输出值是连续的实数值,而分类中是离散值。例如,给你历史股票价格,公司与市场的一些信息,需要你去预测将来一段时间内股票的价格走势。那么这个任务便是回归任务。对于回归模型的评价指标主要有以下几种:
    * RMSE
      回归模型中最常用的评价模型便是RMSE(root mean square error,平方根误差),其又被称为RMSD(root mean square deviation),其定义如下:

    RMSE=ni=0(yiyi^)2n

    其中,yi是第i个样本的真实值,yi^是第i个样本的预测值,n是样本的个数。该评价指标使用的便是欧式距离。
      RMSE虽然广为使用,但是其存在一些缺点,因为它是使用平均误差,而平均值对异常点(outliers)较敏感,如果回归器对某个点的回归值很不理性,那么它的误差则较大,从而会对RMSE的值有较大影响,即平均值是非鲁棒的。
    * Quantiles of Errors
      为了改进RMSE的缺点,提高评价指标的鲁棒性,使用误差的分位数来代替,如中位数来代替平均数。假设100个数,最大的数再怎么改变,中位数也不会变,因此其对异常点具有鲁棒性。
      在现实数据中,往往会存在异常点,并且模型可能对异常点拟合得并不好,因此提高评价指标的鲁棒性至关重要,于是可以使用中位数来替代平均数,如MAPE:
    MAPE=median(|yiyi^|/yi)

      MAPE是一个相对误差的中位数,当然也可以使用别的分位数。
    * “Almost Crrect” Predictions
      有时我们可以使用相对误差不超过设定的值来计算平均误差,如当|yiyi^|/yi超过100%(具体的值要根据问题的实际情况)则认为其是一个异常点,,从而剔除这个异常点,将异常点剔除之后,再计算平均误差或者中位数误差来对模型进行评价。

    排序评价指标

      排序任务指对对象集按照与输入的相关性进行排序并返回排序结果的过程。举例,我们在使用搜索引擎(如google,baidu)的时候,我们输入一个关键词或多个关键词,那么系统将按照相关性得分返回检索结果的页面。此时搜索引擎便是一个排序器。其实,排序也可以说是一个二分类问题。即将对象池中的对象分为与查询词相关的正类与不相关的负类。并且每一个对象都有一个得分,即其属于正类的置信度,然后按照这个置信度将正类进行排序并返回。
      另一个与排序相关的例子便是个性化推荐引擎。个性化推荐引擎便是根据用户的历史行为信息或者元信息计算出每个用户当前有兴趣的项目,并为每个项目赋一个兴趣值,最好按照这个兴趣值进行排序,返回top n兴趣项目。
      对排序器进行评价的一下指标如下:
    * Precision-Recall精确率-召回率
      精确率-召回率已经在分类器的评价指标中介绍过。它们同样也可以用于对排序器进行评价。如下图所示:
    ![Alt text](./屏幕快照 2015-09-27 下午7.01.28.png)

    precision=happy correct answerstotal items returned by ranker

    recall=happy correct answerstotal relevant items

      一般的,排序器返回top k的items,如k=5, 10, 20, 100等。那么该评价指标改为“precision@k”和“recall@k”。
      在推荐系统中,它相当于一个多兴趣查询,即每个用户是一个查询词,然后返回每个查询词相关的top k项目,即返回每个用户感兴趣的top k项目,那么在计算评价指标值时,则需要对每个用户的精确率与召回率进行平均(average precision@k” and “average recall@k”),将平均值作为模型的精确率与召回率。
    * Precision-Recall Curve和F1 Score
      当我们改变top k中的k值时,便可以得到不同的精确率与召回率,那么我们可以通过改变k值而得到精确率曲线和召回率曲线。与ROC曲线一样,我们也需要一个定量的指标对其ROC曲线进行描述而来评价其对应的模型进行评价。可取多个k值,然后计算其评价的精确率与召回率。
      除了Precision-Recall曲线外,另一个便是F1 Score,在分类器评价指标中也有提及到,它将精确度与召回率两个指标结合起来,如下:
    F1=2precisionrecallprecision+recall

    F1-score是精确率与召回率的调和平均值,它的值更接近于Precision与Recall中较小的值。
    * NDCG
      在精确率与召回率中,返回集中每个项目的地位(权值)是一样,即位置k处的项目与位置1处的项目地位一样,但是实际情况应该是越排在前面的项目越相关,得分越高。NDCG(normalized discounted cumulative gain)指标便考虑了这种情况,在介绍NDCG之前,首先介绍一下CG(cumulative gain与DCG(discounted cumulative gain)。CG是对排序返回的top k个项目的相关性(即得分)求和,而DCG在每个项目的得分乘上一个权值,该权值与位置成反方向(如成反比),即位置越近,权值越大。而NDCG则对每项的带权值得分先进行归一化,然后再求和。
      在信息检索中或者那些对项目的返回位置关心的模型中经常使用DCG或NDCG。

    注意事项

    数据倾斜

      在对模型进行评价的时候,数据的好坏往往对评价指标有着很大的影响。其中数据倾斜便是一个常见的数据特征,具体指分类中每个类别的数据量不均衡,相差较大,存在一些异常点,这些异常点会对评价指标的计算产生较大的影响等。

    类别不均衡(Imbalanced Classes)

      在前面我们提到使用average per-class accuracy(平均类别准确率)来解决类别不均衡所带来的评价指标问题。举例:假设数据集中正类的数据记录数占总记录数的1%(现实世界中如广告系统中的点击率CTR、推荐系统中的发生行为的用户-项目对、恶意软件检测中的恶意软件),那么这种情况下,如果将所有对象都预测为负类,那么准确率则为99%,然而一个好的分类器准确率应该超过99%。在ROC曲线中,只有左上角的那个部分菜重要,如下图所示:
    ![Alt text](./屏幕快照 2015-09-27 下午10.10.00.png)
      如果评价指标对待每一个类别下的每一个实例都采用相等的权值,那么就很难处理类别不平衡问题。因为此时评价指标会被数据量大的类别占主导,起决定性作用。并且不止是影响模型评价阶段,而且会影响模型的训练阶段。如果数据的类别不平衡不做处理,那么就会影响到对小类别的数据记录的分类。
      例如在推荐系统中,真实的数据中,有行为的用户-项目对很少,即大部分用户有发生行为的项目量很少,以及大部分项目只有少量的用户在上面有行为。这两个问题会对推荐系统模型的训练与评价都会产生影响,但训练数据很少时,模型很难学习都用户的偏好,或者项目的兴趣相似项目量很少,导致在对模型进行评价时会得到一个很低的评价指标值,即会得到一个性能较差的推荐模型。

    异常点(Outliers)

      异常点是另一种数据倾斜问题。值大的异常点会对回归造成很大的影响与问题。例如,Million Song Dataset中,一个用户对一首歌曲的评分为该用户听这首歌曲的次数,回归模型的预测得分中最高得分竟然超过了16000分,这说明回归模型出现了一些问题,并且导致其它的误差相对于该误差都是极小的。我们可以使用误差的中位数来减少这个异常点所所带来的影响。从而增加鲁棒性。但是该方法不能解决在模型训练阶段的该问题。有效的解决方法是在数据预处理阶段对数据进行数据清洗从而剔除异常点,以及对人物进行重新定义与建模,使得其对异常低能不敏感。

    离线评价机制

      在模型的原型设计阶段包:特征选择、模型类型的选择、模型训练等。该部分内容仍然放在模型的原型设计阶段。

    模型训练(Training)、验证(Validation)与模型选择(Model Selection)

      我们在解决机器学习任务之时,需要选择一个合适正确的模型去拟合数据,模型的选择发生在模型的验证阶段而不是模型的训练阶段。即当我们训练出多个模型之时,需要选择一个较好的模型,具体而言,便是使用一个新的数据集(称为验证数据集)去对每个模型进行评价,选择一个最优的模型,最优不止是指效果,还有模型复杂度,模型可实践性等方面。如下图所示:
    ![Alt text](./屏幕快照 2015-09-27 下午10.56.23.png)
    在上图中,超参数调优(hyperparameter tuning )作为控制模型训练的一个元过程(“meta” process),即前奏过程,将会在后面详细介绍。图中将历史数据集划分成两个部分(一般是随机划分),一个作为模型的训练集,一个作为模型的验证数据集。模型训练阶段使用训练集来训练模型并输出之,然后使用验证集对该模型进行评价。并将验证结果反馈到超参数调优器中,对超参数进行调优后继续训练模型。
       为何要将历史数据划分为两个数据集呢?在统计模型世界中,任何事物的发生都假设是随机的,它们服从一个随机分布。模型便是从随机数据中学习而来的,因此模型也是随机的。并且这个学习的模型需要被一个随机的已观察到的数据集进行测试评估,因此测试结果也是随机的。为了确保准确性与公平性,需要使用一个与训练集独立的数据集对模型进行验证。必须使用与训练样本集不同的数据样本集进行测试,从而可以得到模型的泛化误差。那么如何产生一个新的数据集呢?
      在离线阶段,我们只有一个历史数据集合。那么如何去获得另一个独立的数据集呢?因此我们需要一种机制去产生另一个数据集。一种方式是留下一部分数据来作为验证集,如hold-out validation与cross-validation, 另一种方式是重采样技术,如bootstrapping与Jackknife。如下图所示:
    ![Alt text](./屏幕快照 2015-09-27 下午11.26.11.png)
      从上图可以看出,cross-validation与bootstrapping都是将数据集划分为多个较小的数据集,而hold-out validation只是将数据集划分为一大一小的两个部分,大的部分作为训练集,较小的部分作为验证集。

    Hold-out Validation

      Hold-out Validation较简单,它假设数据集中的每个数据点都是独立同分布的(i.i.d,independently and identically distributed)。因此我们只需要简单得将原数据集随机划分成两个部分,较大的部分作为训练集,用来训练数据,较小的部分作为验证集,用来对模型进行验证。
      从计算的角度来说,Hold-out Validation是简单的并运行时间快的。缺点便是它是强假设的,缺乏有效的统计特征,并且验证数据集较小,那么其验证的结果则可靠性较低,同时也很难在单个数据集上计算方差信息与置信区间。因此如果需要使用 hold-out validation方法,则需要足够的数据以确保验证集数据足够而确保可靠的统计估计。

    Cross-Validation

      Cross-Validation是另一种模型训练集与验证集的产生方法,即将数据集划分成多个小部分集合,如划分成k个部分,那么就变为了k-fold cross validation。依次使用其中的k-1个数据集对模型进行训练(每次使用k-1个不同的数据集),然后使用剩下的一个数据集对模型进行评价,计算评价指标值。接着重复前面的步骤,重复k次,得到k个评价指标值。最后计算这k个评价指标的平均值。其中k是一个超参数,我们可以尝试多个k,选择最好的平均评价指标值所对应的k为最终的k值。
      另一个Cross-Validation的变种便是leave-one-out。该方法与k-fold cross validation方法类似,只是k等于数据集中样本的总数目,即每次使用n-1个数据点对模型进行训练,使用最好一个数据点对模型进行训练。重复n次,计算每次的评价指标值,最后得到平均评价指标值。该方法又称为n-fold cross validation。
      当数据集较小时以致hold-out validation效果较差的时候,cross validation是一种非常有效的训练集-验证集产生方法。

    Bootstrapping和Jackknife

      Bootstrapping是一种重采样技术,翻译成自助法。它通过采样技术从原始的单个数据集上产生多个新的数据集,每个新的数据集称为一个bootstrapped dataset,并且每个新的数据集大小与原始数据集大小相等。这样,每个新的数据集都可以用来对模型进行评价,从而可以得到多个评价值,进一步可以得到评价方差与置信区间。
      Bootstrapping与Cross Validation交叉校验相关。Bootstrapping对原数据集进行采样生成一个新的数据集( bootstrapped dataset)。不同的是,Bootstrapping假设每个数据点都服从均匀分布。它采用的是一种有放回的采样,即将原始数据集通过采样生成一个新的数据集时,每次采样都是有放回得采样,那么这样在新生成的数据集中,可能存在重复的数据点,并且可能会重复多次。
      为什么使用有放回的采样?每一个样本都可以用一个真实的分布进行描述,但是该分布我们并不知道,我们只有一个数据集去推导该分布,因此我们只能用该数据集去估计得到一个经验分布。Bootstrap假设新的样本都是从该经验分布中得到的,即新的数据集服从该经验分布,并且分布一直不变。如果每次采样后不进行放回,那么这个经验分布会一直改变。因此需要进行有放回的采样。
      显然采样后得到的新数据集中会包含同样的样本多次。如果重复采样n次,那么原数据集中的样本出现在新的数据集中的概率为11/e63.2%,用另外一种讲法,原数据集中有约2/3的数据会在新数据集中出现,并且有的会重复多次。
      在对模型进行校验时,可以使用新生成的数据集( bootstrapped dataset)对模型进行训练,使用未被采样的样本集来对模型进行验证。这种方式类似交叉校验。
      Jackknife翻译成刀切法。Jackknife即从原始进行不放回采样m(m

    注意:模型验证与测试不同

      在前面一直都是使用“验证”这个词作为模型训练后需要进行的过程。而没有使用“测试”这个词。因为模型验证与模型测试不同。
      在原型设计阶段中,需要进行模型选择,即需要对多个候选模型在一个或多个验证集上进行性能评价。当在模型训练与验证确定了合适的模型类型(如分类中是采用决策树还是svm等)以及最优的超参数(如特征的个数)后,需要使用全部可利用的数据(包括前面对模型进行验证的验证集)对模型进行训练,训练出的模型便是最终的模型,即上线生产的模型。
      模型测试则发生在模型的原型设计之后,即包含在上线阶段又包含在离线监视(监测分布漂移 distribution drift)阶段。
      不要将训练数据、验证数据与测试数据相混淆。模型的训练、验证与测试应该使用不同的数据集,如果验证数据集、测试数据集与训练数据集有重叠部分,那么会导致模型的泛化能力差。
      就在前一段时间,某队在ImageNet(图像识别最大数据库)图像识别测试挑战赛竞赛宣称自己的效果击败了google和microsoft,图像识别错误率低至4.58%,而microsoft为4.94%,谷歌为4.8%。但是最后查出他们违规了,按照测试的官方规定,参与者每周只能向服务器提交2次测试结果,而他们却在5天内提交了40次结果。此外,ImageNet表示,他们还使用了30个不同的账号,在过去6个月中提交了约200次测试结果。从本质上讲,他们多次测试调优而得到了对测试数据集更好的拟合超参数和模型参数,因此模型的效果可能更好,但是可能会导致过拟合而使得模型的泛化能力差。

    总结

      本节主要对模型离线评估与模型离线验证进行讲解。
    * 在模型原型设计阶段,需要进行模型选择,包括超参数调优、模型训练、模型验证。
    * Cross validation是一种生成训练数据集与验证数据集的机制;该方式在数据集较小时特别有用。
    * Hyperparameter tuning是一种为模型选择最优的超参数机制,需要使用交叉校验来对超参数进行评估。
    * Hold-out validation是另一种训练数据集与验证集的产生方式,它较简单。当数据集较充分时使用。
    * Bootstrapping与Jackknife是两种不同的采样方式,用来产生训练集与验证集。该方法可以为模型提供评价指标值方差与置信区间。

    超参数调优(Hyperparameter Tuning)

      在机器学习领域,超参数调优是学习任务的先导步骤(meta),下面将对其进行介绍。

    模型参数与超参数

      什么是模型的超参数,它与模型正常的参数有什么不同。机器学习从本质上来说是一个数学模型,它代表着数据的各个方面的联系。
      例如:在线性回归模型中,使用一条线表示特征与目标之间的关系,用数学公式表示为 :

    y=wTx

    其中x是特征向量,每个样本使用一个特征向量进行表征,y是一个数值变量,代表目标,w则是每个特征的权值向量,代表着这条线的斜率。这个模型假设特征与目标之间是线性的。w表示模型的参数,需要在模型的训练阶段进行学习更新,也就是说,模型训练其实就是使用一种优化算法决定最优的模型参数来对数据进行拟合。
      另外一种被称为模型超参数。超参数的确定不是在模型的训练阶段。普通的线性回归是没有超参数的(除了特征的个数),而Ridge回归与Lasso回归都添加了正则项(Ridge岭回归加上L2正则项,Lasso回归加上L1正则项),这些正则项都需要一个正则参数(regularization parameter)。如决策树需要设置树的深度和叶子数、支持向量机(SVM)需要设置一个分类错误的惩罚因子、带核的SVM还需要设置核的参数(如RBF径向基函数的宽度)等。

    超参数的作用

       模型的超参数是用来干什么的呢?如正则化因子是来控制模型的能力,模型拟合数据的自由度(degrees of freedom)决定了模型的灵活度。合理的控制模型的能力能够有效得防止过拟合现象。因此为了防止过拟合的发生,需要牺牲一些精度。因此合理的设置模型的超参数则非常重要。
      另一种类型的模型超参数来自于模型的训练阶段。模型训练是一个使损失函数(或代价函数,训练阶段的评价指标)最小化的过程,这过程会用到很多最优化技术与方法,使用的最优化方法中需要用到一些参数。如SGD( stochastic gradient descent)中,需要一个学习速率因子、初始点以及收敛阈值等。又如,随机森林(Random Forests)和自助提升决策树(Boosted decision trees)需要设置树的个数的参数与正则化参数等等。这些超参数需要被合理地设置以找到一个好的模型。

    超参数调优机制

      超参数设置的好坏对模型的评价指标值产生较大的影响。不同的数据集上面创建模型会有不同的最优超参数,因此对于不同的数据集需要各自调优。
      如下图,超参数的设置过程为:首先设置一个初始的超参数值,然后进行模型训练,将模型的指标反馈都超参数调优机制中,调节超参数,继续训练模型,一直进行下去,若干次后得到一个目前最优的超参数值。最后使用该最优的超参数去训练模型,并进行模型验证。
    ![Alt text](./屏幕快照 2015-09-28 下午3.07.45.png)

    超参数调优算法

      从概念上讲,超参数调优是一个最优化任务过程,就像模型训练一样。然而,这两者之间相当的不同。在模型训练中,使用一个称为代价函数的数据公式为目标去进行对模型参数进行训练调优。而在超参数调优中,无法使用一个形式化的公式为目标去进行调优,它就像一个黑盒子,需要使用模型训练结束后的模型评价结果为指导去进行调优。这就是为什么超参数调优较为困难。下面是一些具体的超参数调优方法:

      顾名思义,格搜索便是将超参数的取值范围划分成一个个格子,然后对每一个格子所对应的值进行评估,选择评估结果最好的格子所对应的超参数值。例如,对于决策树叶子节点个数这一超参数,可以将值划分为这些格子:10, 20, 30, …, 100, …;又如正则化因子这一超参数,一般使用指数值,那么可以划分为:1e-5, 1e-4 1e-3, …, 1。有时可以进行猜测对格子进行搜索去获得最优的超参数。如,当从第一个开始,发现效果较差,第二个好了一点,那么可以第三个可以取最后一个。格搜索较为简单并且可以进行并行化。

      在论文 “Random Search for Hyper Parameter Optimization” (Bergstra and Bengio)中,已经验证了随机搜索是一个简单而有效的方法。它是格搜索的变种。相比于搜索整个格空间,随机搜索只对随机采样的那些格进行计算,然后在这中间选择一个最好的。因此随机搜索比格搜索的代价低。随机搜索有个缺点,即其可能找不到最优的点。但是前面的那篇论文已经证明,随机采样60个点的性能已经足够好了。从概率的角度来说,对于任何的分布的样本空间若存在最大值,那么随机采样60个点中的最大值位于整个样本空间top5%的值的集合中的概率达到95%。证明如下:
      对于top%5的值,我们每次随机采样,得到top5%的值的概率为5%,没有得到top5%的值的概率为(1-0.05),重复有放回地采样n次,那么至少有一次得到top5的值这件事发生的概率若要超过95%,则:

    1(10.05)n>=0.95n>=60

    这表示我们只需要从所有候选格中随机采样60个格,便可以以95%的概率得到至少一个的top5%最优的格。因此随机搜索60个格进行计算便可以以很高的概率得到top%5最优的格。当最优格以及近似最优格的集合较大,加上机器学习模型对超参数一个近似最优值与最优值不会太敏感,因此,随机搜索算法便是有效的。由于随机搜索简单并且有效,一般是超参数调优的首选搜索算法。并且其容易并行化。

      除了前面的两种搜索算法,还可以利用智能搜索算法,但是相对于前面的两种方法,智能搜索算法最大的缺点便是不能并行化。它的处理过程是一个序列,并只处理一部分候选点,然后对当前点进行评估,决定下一个点。智能搜索的目的是只对一部分点进行评估从而节省调优时间。
      可以看出,智能搜索需要时间去计算下一个评估的点,于是相对于前面的方法,可能需要更多的时间。因此只有在对点进行评估所用的时间大于决定下一个需要评估的点的时间时才有意义。当然智能搜索算法也需要自己的超参数,因此也需要调优。有时好的智能搜索算法超参数可以确保智能搜索快于随机搜索。
      文章前面提到,超参数调优是一个困难的过程,因为它不能想模型参数调优那样,给出一个形式化的数学函数,而对数学函数进行调优。因此很多优化算法,如牛顿优化算法、随机梯度下降算法都不能使用。目前有超参数三个智能调优算法:derivative-free optimization, Bayesian optimization和random forest smart tuning。derivative-free优化算法采用启发式来决定下一个计算的点;Bayesian和random forest优化算法都是创建一个响应函数曲面模型,由模型决定下一步需要计算的点。
      Jasper Snoek等使用高斯过程对响应函数进行建模。Frank Hutter等使用回归随机森林来近似这个响应曲面。Misha Bilenko等使用Nelder-Mead来进行超参数调优。

    嵌套交叉校验(Nested Cross-Validation)

      嵌套交叉校验又称为嵌套超参数调优。模型选择与超参数调优的不同之处在于:模型选择不仅包括对某个模型的参数进行调优(如决策树的深度),并且包括对不同模型的选择(如分类中,选择决策树还是SVM)。嵌套交叉校验即在进行某个模型训练后,需要对该模型进行交叉校验,然后将结果反馈到超参数调优机制中,对超参数调优,并使用更新后的超参数继续训练模型,一直迭代下去,知道满足一定的要求,同时对其它模型也需要如此进行训练,最后在所有训练好的模型选择一个综合各方面因素最优的模型。

    A/B测试的陷阱

       A/B测试(A/B Testing)是机器学习实践中广泛应用的一种方法。但是在应用该方法时,会遇到一些陷阱。下面便对相关问题进行讨论。
      在本文的前部分已经讲述到,机器学习模型的评价分为离线评价与在线评价两个阶段。离线评价阶段发生在模型原型设计阶段,对不同的超参数、不同的特征集、不同模型进行评价,它是一个迭代的过程,使用选定的评价指标对每个迭代过程中生成的模型进行评价。一旦达到指定的迭代次数,则选择所有迭代中最优的模型,作为最终模型并投入到生产环境中使用。而在线评价则是使用一些商业评价指标来对模型进行评价以及更新。而A/B测试则属于在线测试。

    什么是A/B测试

      A/B测试是目前在线测试中最主要的方法。该方法可以用来回答“新的模型比旧的模型更好吗(模型)?”、“这个按钮是使用黄色好一些还是蓝色好(设计)”等等问题。在A/B测试中,与两个部分:A和B,或控制/实验(control and experiment),A代表旧模型(设计)的评价,B代表新的模型(设计)的评价,然后将它们进行对比,得到是否新的模型比旧模型更好。当然是由具体的机制来进行衡量。
      该衡量方法便是统计假设检验(statistical hypothesis testing)。其用来回答“新的模型或设计是否对一些关键的评价指标有着大幅度的提升或者明显的提升”。它包括两个对立的假设:空假设(null hypothesis)与替代假设(alternate hypothesis)。前者表示“新的模型或设计没有明显的提升”,后者则表示“新的模型或设计有了明显的提升”,“提升”具体反映在关键评价指标的平均值(mean value)等上面。
      有很多书籍与网上资源对A/B测试有着详细的描述,这里不再累赘。如 www.evanmiller.org,它对A/B测试进行了详细的讲解以及列举了一些工具。简而言之,A/B测试包括以下几个步骤:
    * 随机划分成两组A与B
    * 使用一些方法分别观察两组中的行为
    * 计算一些统计指标
    * 计算p-value
    * 最后输出孰好孰坏
      举个最简单的例子,在网页设计中使用A/B测试。首先需要建立一个测试页面(experiment page),这个页面可能在标题字体,背景颜色,措辞等方面与原有页面(control page)有所不同,然后将这两个页面以随机的方式同时推送给所有浏览用户。接下来分别统计两个页面的用户转化率,即可清晰的了解到两种设计的优劣。
      A/B测试虽然通俗易懂,但是要想正确的使用它则较为棘手。下面将介绍一些在使用A/B测试时可能会遇到的一些陷阱与问题,这些问题包括理论层面的和实践层面的。

    A/B测试的一些陷阱

    实验完全分离

      在A/B测试中,需要将用户随机分为两组。一部分用户使用旧的模型或设计(如浏览原来的网页),另一部分用户使用新的模型或设计(如浏览新设计的网页)。那么需要保证experimentation组(使用新的模型或设计的组)的用户的纯净度,什么意思呢?
      A/B测试中,划分为完全独立的,干净的两组是非常重要的。设想一下,在对网页中的按钮新样式进行测试时,需要确保统一用户自始自终是使用同一个按钮设计,那么我们在对用户进行随机划分时,就需要使用能够唯一代表用户的来进行划分(即导流),如用户ID,用户sessions等。Kohavi等的KDD 2012论文表明一些使用旧设计的用户再使用新的设计时会带着某着偏见。

    使用什么评价指标

      另一个重要的问题便是,在A/B测试中使用什么评价指标。因为A/B测试是在在线评价阶段,因此使用的评价指标便是商业指标。但是商业指标有没有离线阶段那些评价指标那么容易计算。举个例子,在搜索引擎中,一般对用户的数目、用户在结果站点的逗留时间、以及市场份额。在现实中,统计比较并不是那么容易,因此我们需要对独立用户每天访问数、平均会话时间长度等这些能够反映市场份额的指标进行计算,以便能够对市场份额进行估计。并且一般短期指标并不与长期指标保持一致。
      在机器学习过程中,一般会用到四种类型的评价指标,分别是:训练评价指标(training metrics)、离线评价指标(验证评价指标,offline evaluation metrics or validation metrics)、新生数据评价指标(live metrics)、商业指标(business metrics)。训练评价指标是指模型优化的评价指标,即代价函数(目标函数或损失函数),如在线性回归中使用平方误差和、svm中分类平面几何间隔最大化等。离线评价指标是指模型训练完毕需要使用验证数据集来对模型进行评价,即前面所提到的那些指标,如分类模型评价指标、回归模型评价指标以及排序模型评价指标等。新生数据评价指标即使用模型上线后新生成的数据来评价模型,评价指标同离线评价指标,只是评价所用的数据不同。而商业指标即系统真正关心的最终指标,如转化率、点击率、PV访问量、UV访问量等。每个阶段使用的评价指标不一样,并且这些指标可能并不呈现线性相关,如在回归模型中,随着RMSE的下降,但是点击率(click-through rates.)并没有提高,详细可以参见Kohavi‘s paper

    多少改变才算是真正的改变?

      当确定了使用什么商业指标进行评价以及如何去计算这些指标时,接下来需要明确指标值提升了多少才算正在的提升,即多少的提升才可接受。这在某种程度上取决于实验的观察者数量。并且与问题2一样,它并不是一个数据科学范畴的问题,而是一个商业问题。因此需要根据经验挑选一个合适的值。

    单面测试还是双面测试(One-Sided or Two-Sided Test)?

      单面测试只能告诉你新的模型是否比基准的是否更好,而无法告诉你是否更糟。因此需要进行双面测试,其不仅会告诉你新的模型是否会更好并且会告诉你是否更糟。是否更好与是否更糟需要进行分开对待。

    多少的FP(False Positives)能够忍受?

      比基准模型更好,但是实际上确不是。FP的代价取决于实际应用。如在医药中,FP意味着病人使用无效药,这样便会对患者的健康造成很大的威胁。又如在机器学习中,FP意味着会使用一个认为会更有效的但却未更有效的模型来代替单前的模型。而FN意味着放弃了一个实际上会更有效的模型。
      统计假设检验可以通过设定显著性水平( the significance level)控制FP的概率,并通过测试的力(the power of the test.)度来控制FN的概率。
      

    需要多少观察者?

      观察者的数量由期望的统计功效(statistical power)部分决定。而统计功效在测试进行之前便需设定。一个常见的尝试时运行测试直到观察到一个重要的结果。这个方法是错误的。测试的力度是能够正确识别那些正样本。它能够使用显著性水平、A组的评价指标值与B组的评价指标值之差、观察者的个数这些去形式化地表示。选择合理的统计功效、显著水平等。然后选择每组中观察者的数量。StitchFixEvan Miller’s website详细地进行了介绍。
      

    评价指标是否满足高斯分布

      A/B测试中绝大部分是使用T检验,但是T检验的所做出的假设前提并不是所有的评价指标都满足的。一个好的方法便是去查看指标的分布与检查T检验所做的假设是否有效。T检验假设是满足高斯分布的,那么评价指标释放满足高斯分布呢?通常,使用中心极限定理可以得到任何独立同分布并且具有期望与方差的随机变量都收敛于高斯分布。不难得出,评价指标假设以下条件成立:
    * 指标值是采用平均值
    * 指标值的分布是同一分布
    * 指标值分布是对称的
    但是还是会有一些指标不满足的,如点击率是一个平均值,但是AUC却是一个积分值。并且可能不服从同一分布,如在A/B组中的用户种群不一样。同时,也有可能不是对称的。Kohavi等例举了一些例子说明评价指标不服从高斯分布,在这些例子中,标准误差不会随着测试的进行而降低。比如那些计数评价指标服从负二项式分布。当这些假设不成立时,分布遍不再收敛于高斯分布。
      

    方差是否相等

      

    p-value意味着什么

      

    多模型,多参数

      

    测试的时间需要多长

      

    分布漂移问题

    原文地址:http://www.oreilly.com/data/free/evaluating-machine-learning-models.csp

    展开全文
  • 机器学习9 -- 模型压缩和加速

    万次阅读 2020-09-09 19:32:06
    近年来深度学习模型在计算机视觉、自然语言处理、搜索推荐广告等各种领域,不断刷新传统模型性能,并得到了广泛应用。随着移动端设备计算能力的不断提升,移动端AI落地也成为了可能。相比于服务端,移动端模型的优势...
  • 使用Tensorflow做深度学习做深度学习的网络搭建和训练需要通过PYTHON代码才能使用,对于不太会写代码的同学还是有一定的使用门槛的。本文将介绍另一个深度学习框架Caffe,通过Caffe只需要填写一些配置
  • 机器学习模型的评价指标和方法

    万次阅读 多人点赞 2016-09-18 15:04:55
    二分类模型的评估 机器学习系统设计系统评估标准 Error Metrics for Skewed Classes有偏类的错误度量精确度召回率 PrecisionRecall精确度召回率 Trading Off Precision and Recall权衡精度和召回率F1值 A way to ...
  • 机器学习之GridSearchCV模型调参

    千次阅读 2018-06-11 14:46:39
    大部分机器学习模型都会有很多参数,不同的参数组合会产生不同的效果 ,如果模型数据量不是很大,也就是说运行时间不是很长,可以考虑使用GridSearchCV这个工具包自动选择输入参数中的最优组合。注意:在实际应用中...
  • python文本分析 __机器学习之LDA模型

    千次阅读 2018-10-27 14:20:13
    __机器学习之LDA模型项目背景项目需求项目流程爬取数据并导出数据分析及训练模型导入所需模块数据预处理情感分析分词训练模型项目结论差评 项目背景 现在大家在进行网购过程中,肯定会看商品的相关评论,然后再...
  • 机器学习模型工程化

    千次阅读 2018-08-28 17:56:49
    机器学习把 Python 的历史地位推向了一个小高峰,我们习惯于用 Python 去编写机器学习的代码,但是在实际工程中,业务方用 Java 的可能性会比较大,那么如何用 Java 调用 Python 写的已经训练好的机器学习模型呢。...
  • 机器学习模型可解释性的详尽介绍

    千次阅读 多人点赞 2019-11-26 12:22:00
    机器之心平台来源:腾讯技术工程模型可...本文对机器学习模型可解释性相关资料汇总survey。综述机器学习业务应用以输出决策判断为目标。可解释性是指人类能够理解决策原因的程度。机器学习模型的可解释性越高,人...
  • 提高机器学习模型性能的五个关键方法

    万次阅读 多人点赞 2018-09-08 11:52:10
    如何提高机器学习模型性能, 可从五个关键方面入手。 1. 数据预处理 2. 特征工程 3. 机器学习算法 4. 模型集成与融合 5. 数据增强 以下是各个方面的具体分析和方法: [ 说明:1、这里主要是各个关键方法的...
  • 基于树的机器学习模型的演化

    千次阅读 2020-09-13 08:48:48
    基于树的分类模型是一种监督机器学习算法,它使用一系列条件语句将训练数据划分为子集。每一次连续的分割都会给模型增加一些复杂性,这些复杂性可以用来进行预测。最终结果模型可以可视化为描述数据集的逻辑测试的...
  • Java解析pmml格式机器学习模型

    千次阅读 2020-03-24 16:18:30
    在实际工程项目中,我们训练和迭代模型一般使用Python,因此它提供了强大的算法包和非常方便的数据处理工具,所以能够快速试验。但是,算法模型部署成服务,Java语言和其相应的框架就显得优势明显了。为了更好地...
  • 机器学习模型导出为PMML的方法

    千次阅读 2019-06-06 10:06:16
    机器学习模型导出为PMML的方法背景系统准备以xgboost模型生成PMML文件举例演示 背景 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下...
  • 数据和背景: http://archive.ics.uci.edu/ml/datasets/Bank+Marketing 导入基本库和数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import os from ...
  • BAT机器学习面试1000题系列

    万次阅读 多人点赞 2017-12-14 15:19:15
    1、本文的内容全部来源于七月在线发布的BAT机器学习面试1000题系列; 2、文章中带斜体的文字代表是本人自己增加的内容,如有错误还请批评指正; 3、原文中有部分链接已经失效,故而本人重新加上了新的链接,如有...
  • 机器学习模型的评价

    千次阅读 2016-03-14 11:46:39
    机器学习是一门跨学科领域,涉及到统计学、计算机科学、最优化理论、信息理论、神经科学、理论物理以及其他...  本文将从以下部分对机器学习模型的评价进行介绍:  * 介绍模型离线与在线评价体系与知识;  * 介绍
  • 监督学习的任务就是学习一个模型(或者得到一个目标函数),应用这一模型,对给定的输入预测相应的输出。这一模型的一般形式为一个决策函数Y=f(X),或者条件概率分布P(Y|X)。 监督学习方法又可以分为生成方法...
  • 机器学习调参-模型选择

    千次阅读 2016-04-26 16:24:20
    本文主要介绍机器学习模型中超级参数(hyperparameter)的调优问题(下文简称为调参问题),主要的方法有手动调优、网格搜索、随机搜索以及基于贝叶斯的参数调优方法。因为模型通常由它的超级参数确定,所以从更高的...
  • 人工智能AI、机器学习模型理解

    万次阅读 多人点赞 2018-10-22 22:05:00
    机器学习是什么:就是算法模型; 算法模型是什么: 俗地说,模型就是机器学习采用的算法。“模型文件”一般说的是这个算法用到的各种输入、输出数据的值。 因为机器学习往往需要大量的运算,所以有必要将中间变量...
  • 机器学习模型评价(Evaluating Machine Learning Models)-主要概念与陷阱   本文主要解释一些关于机器学习模型评价的主要概念,与评价中可能会遇到的一些陷阱。如训练集-验证集二划分校验(Hold-out validation)、...
  • 机器学习已经成为我们生活中的一部分,对购买者、消费者或是希望进行研究和实践者都很重要!无论我们应用预测建模技术来进行我们的研究还是解决业务问题,我相信有一个共同点:我们要做“好”的预测!诚然,我们需要...
  • 机器学习与深度学习里生成模型和判别模型的理解

    万次阅读 多人点赞 2018-05-10 15:20:51
    这篇博客是自己在学习生成模型与判别模型过程中的一些记录,整理了相关的文章后写成,感谢前辈们的辛苦总结转载自:...
  • 三种机器学习方法和使用CNN训练FashionMNIST的性能比较,三种机器学习方法分别为:随机森林、KNN、朴素贝叶斯。 完整实验代码可在https://github.com/Ryanlzz/fashion-mnist-train查看 一、数据准备 1.数据...
  • 转载请标明出处: http://blog.csdn.net/djy1992/article/details/75257551 本文出自:【奥特曼超人的博客】机器学习简史:拍拍贷AI中心数据研发负责人:王春平一、机器学习简介谢谢!首先今天特别荣幸能够到兴业...
  • 机器学习已经成为我们生活中的一部分,对购买者、消费者或是希望进行研究和实践者都很重要!无论我们应用预测建模技术来进行我们的研究还是解决业务问题,我相信有一个共同点:我们要做“好”的预测!诚然,我们需要...
  • 如何提高机器学习模型的可解释性

    千次阅读 2019-03-22 16:57:15
    随着机器学习的发展,不同的算法纷纷涌现,特别是现在很热的深度学习,不同的神经网络模型在图像识别、语音识别、自然语言处理等方面都已经取得了一定的成果。但是模型的效果往往是以牺牲模型的可解释性为代价的,在...
  • 机器学习系列(7)_机器学习路线图(附资料)

    万次阅读 多人点赞 2016-02-28 11:55:21
    也许你和这个叫『机器学习』的家伙一点也不熟,但是你举起iphone手机拍照的时候,早已习惯它帮你框出人脸;也自然而言点开今日头条推给你的新闻;也习惯逛淘宝点了找相似之后货比三家;亦或喜闻乐见微软的年龄识别...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,576
精华内容 16,230
关键字:

机器学习训练背景模型