斯坦福大学《Machine Learning》第6周学习笔记
Advice for Applying Machine Learning应用机器学习的建议
Evaluating a Learning Algorithm评估学习算法
Deciding What to Try Next 决定接下来要做什么
你应该如何决定是去构建一个新的机器学习系统还是尝试优化现有的现有机器学习系统?
使用一个预测房价的学习例子。假设你已经完成了一个带有正则化的线性回归模型,并且这相当于最小化了目标函数J。如果在获得学习参数之后,将假设函数应用于一组新的、未见过的数据集,并发现对新数据的预测存在显著偏差。

方法一:使用更多的训练样本
方法二:尝试选用更少的特征集
方法三:……
我们列出了上述一系列优化方案。每一个尝试都有可能占用你大量时间和精力。通常人们选择这些方法的标准往往只是凭借直觉。但最终的结果往往不尽如人意。因此我们希望能够提前预判这些工作的效果以便于更有效地进行后续安排。

值得庆幸的是,在你的日常工作中存在一些简便策略:通过运用这些方法可以让你事倍功半之外还有一种特别简便的方式
在机器学习领域中,这类方法被称为"机器学习诊断技术"。所谓"机器学习诊断技术"的核心在于,它是一种用于评估和优化算法性能的方法。通过实施这一评估机制,我们可以深入理解某种算法的有效性。此外,这也为我们提供了关键的指导原则:在优化算法时应采取哪些策略才能取得最佳效果?实施这些评估机制往往需要投入大量时间和资源,但总体而言,这些工作投入产出比很高。
Evaluating a Hypothesis 评估一个假设
下面将介绍如何运用你学过的算法来评估假设函数,并进而基于此展开讨论过拟合问题及欠拟合情况。
当我们设定学习算法的参数时,在设定过程中我们关注的是选择参数 以使训练误差最小化。然而过度拟合模型并不一定是坏事;那么如何判断一个模型结构是否出现了过度拟合呢?
当单一特征变量存在时 我们可以通过绘制假设函数h(x)的图像来直观分析其行为变化 进而了解其变化规律 而在面对拥有大量特征变量的情况 下述方法则显得力不从心 以至于难以有效进行分析 因此 有必要引入一种更为有效的评估标准 如下将介绍一种用于评估假设函数性能的标准方法
我们假设有一组数据集,并且希望便于检验我们的假设函数的性能。为此目的我们需要将这些数据划分为两个部分:训练集与测试集。通常采用的比例分割策略是7:3。为了避免引入偏差 我们需要确保这种划分过程具有随机性。



你通过以下步骤训练与测试你的学习算法:首先利用70%的训练集进行学习并获得参数θ;同时使训练误差J(θ)达到最小值;然后利用30%的测试集计算测试误差以评估你的学习算法的效果。值得注意的是,在线性回归问题中我们采用损失函数作为评估标准,在逻辑回归问题中则采用误分类比例(也被称为0/1错分率)作为评价指标。这种差异主要体现在误分类比例这一指标上:它不仅考虑了预测结果是否正确(反映模型对正负类样本的分类效果),而且量化了模型预测结果与真实结果之间的差异程度
模型选择及训练集合、验证集合与测试集合的划分
在讨论模型选择问题时 我们会探讨如何将数据划分为三部分 即训练集、验证集和测试集 而不仅仅是在传统方法中使用的两组数据。确定一组数据适合的多项式次数或合理选取正则化参数λ等问题都属于模型选择范畴。这些决策过程对构建有效的学习算法至关重要

首先, 我们需要解决模型选择的问题. 假设我们现在需要确定一个能够最好地拟合数据的多项式次数. 换句话说, 应该决定是采用一次、二次还是三次等(直到十次)多项式来拟合数据. 在这里, 我们用变量d来表示所选多项式的次数. 除了主要需要确定的参数θ之外, 还需要确定另一个参数d. 第一个选项就是d=1时的情况,这对应于线性(一次)方程. 当然可以选择更高阶如2、3甚至一直到10次方程. 我们的目标就是找出最适合的数据的那个度数.
例如,在进行模型选择时,请从提供的10个模型中挑选一个最合适的多项式次数,并通过该模型进行估计与预测工作。这样你就可以评估其在新样本上的推广能力了。具体操作如下:首先选择第一个模型,在求取其训练误差的最小值的过程中得到参数向量θ¹;接着选择第n个模型(即n次函数模型),同样经过这一过程得到另一个参数向量θ²(以此类推)。这里所指的上标(n)表示在调整第n个模型(即n次函数)与训练数据拟合过程中所获得的参数向量θⁿ
为了针对所有这些模型 计算出每个模型在测试集上的表现指标 即求取各次迭代中的Jtest值 如Jtest(θ^ (1)) Jtest(θ^ (2)) Jtest(θ^ (3)) 等等 接下来 为了选择表现最佳的模型 我们需要找出具有最小测试集误差的那个特定假设 在这个例子中 我们假设选择了五次多项式作为最终的最优模型
在当前情况下,我们遇到的一个困境是通过这种做法难以公平地推断假设在一般情况下的适用性。这一困境的原因在于使用了测试集来确定多项式次数d的过程与假设拟合的目标存在不一致。因此,在这种情况下我们选择了能够使多项式次数d最佳匹配测试集特征的那个值。这意味着所选参数向量θ(5)在训练过程中过于关注测试集的表现而可能忽略了在真实数据上的泛化能力。
同样通过训练集进行拟合得到的参数d 也无法较为公平地预判假设函数在面对新样本时的表现 为了缓解这一问题 在模型选择过程中 如果我们旨在评估某个假设的有效性 则通常会采取以下措施
将该数据集划分为三个部分 第一部分我们仍然称之为训练集(training set) 第二部分我们将其命名为交叉验证集(cross-validation set)并使用缩写CV来代表它 在某些情况下也可以简单地将其称为验证集合而不使用交叉验证这一术语 最后一部分与传统方式相同即测试集合(test set)。通常情况下我们会采用60%的数据作为训练集合、20%的数据作为交叉验证集合以及20%的数据作为测试集合 这种划分比例并非固定且可以在实际应用中根据需求进行适当调整
我们还有一定数量的测试集样本。然而,在这种情况下我们的模型选择问题就呈现为这样一种情况:即我们需要采用基于验证集的选择方法 而不再是依赖于单纯地利用测试集来进行参数优化。具体而言 假设当拟合四次函数模型时 达到了最小的交叉验证误差 这意味着最佳系数d被确定为4 并且这一过程正是通过交叉验证实现的。因此 可以看出 参数d 以及多项式的次数并未与测试集进行拟合 从而避免了利用测试数据的可能性 因此 我们得以放心地利用独立于训练数据的新测试集 来评估所选模型的表现。
Bias vs. Variance偏差与方差
Diagnosing Bias vs. Variance诊断偏差与方差
本节重点内容在于辨别过拟合(即模型具有高方差)与欠拟合(即模型存在较高偏差),进而帮助我们优化学习算法的多项式阶数
当运行一个学习算法时 如果该算法的效果不佳 那么通常会遇到两种情况 可能是由于偏差较大 或者由于方差较大导致 具体来说 这两种问题通常表现为欠拟合(即存在较大的偏差)或过拟合(即存在较高的方差) 因此 需要弄清楚这两种问题分别与偏差还是方差相关 甚至两者是否兼有这一特性 判断这一点至关重要 因为它有助于确定问题的根本原因 并且能够指示出改进算法的 最有效的方法和途径

在绘制该示意图的过程中 我们首先在横轴上标示了多项式的次数 并将训练集误差J_{train}和交叉验证集误差J_{cv}绘制在该坐标系中。观察发现 当d=1时会出现欠拟合现象 且此时的交叉验证误差J_{cv}相对较大;而当d=6时则会出现过拟合现象 并且此时的交叉验证误差J_{cv}同样较大;然而 当d=2时 模型能够达到较好的拟合效果 同时此时的交叉验证误差J_{cv}达到了最小值。通过绘制测试集损失函数L_{test}(\theta) 我们可以观察到它呈现出与交叉验证损失曲线相似的趋势。

这样一幅图也辅助我们更好地理解偏差与方差的概念。具体而言,在假设我们获得了一个学习算法时,在实际应用中发现该算法的表现没有达到预期效果,则交叉验证误差或测试集误差都会显著较大。此时我们需要判断该学习算法是处于高偏差还是高方差的问题中:左边这一端对应的是高偏差问题(即所使用的模型过于简单),而右边这一端则对应着高方差问题(即模型过于复杂)。具体来说,在左边这一端的情况下(例如d=1),所采用的模型过于简单;而在右边的情况下,则表示模型过于复杂(例如d过大)。这幅图也提醒我们在如何区分这两种情况
结论总结
高偏差 - 欠拟合 - 交叉验证误差和训练误差都会很大 - 多项式次数太低
高方差 - 过拟合 - 训练误差会很小 - 交叉验证误差》训练误差 - 多项式次数太高
Regularization and Bias/Variance****正则化和偏差/方差
已知该方法具有显著的效果用于防止过拟合。然而,该方法与其所涉及的算法偏差与方差间的关联又如何?下面将更加深入地探讨偏差与方差的问题及其间的关联又如何,并分析其与正则化之间的相互关系。
为了对给定的一个高阶多项式进行有效的拟合 为了避免模型出现过拟合现象 我们引入了一个正则化项 从而通过这一特定的正则化手段 来约束模型参数的大小 这一正则化项通常取值范围是从j=1开始至j=m 而不包括j=0的情况 这种设定有助于防止模型复杂度过高 进而提出相应的解决方案以确保模型具有良好的泛化能力

第一种情形下,在正则化参数λ设定为较大的数值(例如10000甚至更大的数值)的情况下,在这种情况下,
所有这些参数(θ₁, θ₂, θ₃等)将受到严重的惩罚,
其结果导致这些参数的值趋近于零,
并且模型h(x)的输出将大致等于或趋近于θ₀。
因此我们所得出的假设函数大致呈现这样的形态:
其表现形式接近一条平滑曲线。
这一状态表明模型在训练过程中缺乏足够的复杂性来捕捉数据中的模式(underfitting),从而导致预测效果不佳。
在这种情况下,
我们可以预期这样的简单线性模型无法有效适应复杂的非线性关系,
因而对于这类问题来说,
简单的线性回归方法显然不是一个理想的选择。
与之对应的另一种情况是λ值非常小,在该情况下例如λ取值为0时,在这种情况下如果我们拟合一个高阶多项式,则这将导致过拟合问题
当且仅当取一个适中大小的λ值时 我们才能获得一组合理的结果 适合于数据精确拟合的θ参数值 那么如何自动生成最合适的正则化参数λ呢?

这里具体来说我们的模型以及所涉及的学习参数 最优化目标都是这样的构建方式 在训练过程中 我们特别关注Jtrain Jcv Jtest这几个指标的表现 同样值得注意的是 模型在训练阶段与测试阶段的表现指标与非正则化版本(即Jθ)保持一致 这一点在后续选择最优λ值的过程中并不会影响我们的计算 因为在这种情况下 我们始终只关注最小化代价函数Jθ的同时也考虑到了引入正则化项的影响
为此 ,我们采用了λ参数自动选择的方法 。一般情况下 ,我会尝试多个λ值 。为了探索最优解 ,我会先不施加正则化,并考虑逐步增加λ的可能性 。如从较小的数值开始 ,逐步增加步长直至达到某个较大的阈值 。在本例中以两倍步长递增的情况下 ,最终计算得到λ=10.24 。但实际上我们取的是整数值10 ,因为小数点后的第24位对最终结果的影响微乎其微 。这样我就得到了12个不同的正则化参数λ对应的训练模型也共有12个 。通过这一策略 ,我可以获得多种不同表现下的模型供选择 。
我们得到了12个模型集合之后,接下来的任务就是依次选择每个模型进行参数优化。具体来说,在第一个阶段(λ=0)时,我们需要通过最小化代价函数J(θ)来确定参数向量θ,并记第一个模型对应的参数向量为θ(1)。接着选择第二个模型时(λ=0.01),同样地通过最小化J(θ),我们获得第二个模型的参数向量θ(2)。以此类推,在最后一个阶段(λ=10或λ=10.24),对应的参数向量是θ^(12)。
基于此逻辑,我将依次构建第一个至第十二个线性回归模型,并针对每个正则化强度λ进行训练。随后运用相同的交叉验证集来评估这些假设以及参数θ的值。具体而言,在每一折线划分中计算每个θ在各次测试中的均方误差,并求取其平均值作为衡量标准。在此基础上挑选上述12个模型中均方误差最低的那个作为最终候选方案。
在本例中 假如说
当调整正则化参数λ值时,交叉验证误差与训练误差会如何变化?

我们将训练误差和交叉验证集误差均设定为其不包含正则化项,并观察不同λ值下的模型行为:当λ的值较小时 我们几乎未施加任何正则化 因此很可能出现过拟合-高方差:训练误差小而验证误差大;反之 当λ的值较大时 我们会陷入高偏差-欠拟合:训练与验证均呈现较高错误率
对于真实的数据, 检测到的曲线可能比预期更加复杂, 包含大量噪声; 在实际应用场景中, 对于某个特定数据集, 我们大致能观察到类似的趋势; 被绘制出这条曲线后, 随着交叉验证集误差的变化趋势分析, 我们可以选择自定义程序或者编写代码来自动确定能够使交叉验证集误差最小的那个点, 然后找到对应的参数λ值
Learning Curves学习曲线
学习曲线作为一种有效的工具,则用于识别某个学习算法可能存在的偏差、方差问题或两者兼有
绘制学习曲线通常需要先确定基准数据集,并将其构建为一个关于训练集样本总数m的函数。然而,在实际操作中我决定选择特定数量的样本数量,并对这些值施加一定的约束条件例如我可以选择10至40个不同规模的训练集样本,并分别计算对应的训练误差和交叉验证误差。

接下来让我们分析这条曲线的形状。
就交叉验证集误差的情况而言 当训练集规模较小时模型的泛化能力较差 这意味着基于小规模训练数据的模型在面对新样本时会出现较大的偏差和方差。因此 当我采用更大规模的训练集后 可以获得更优的模型性能 通过更多的数据进行训练 可以显著提升模型对新样本的适应能力 Jcv和Jtest值随之减小


上图左边是高偏差时的学习曲线,结论:
即使你不断提升m值 你基本上还是会获得一条与之前差不多的直线 当训练集样本容量达到或超过某个特定阈值时 交叉验证集误差和测试集误差会趋于稳定 这样你会从而获得对数据最佳拟合的那条直线 高偏差的情况表明 当交叉验证集和训练集之间的误差都很大时 这种情形反映出你的模型可能过于简单或欠拟合 单纯增加更多的训练集数据并不能改善算法性能 这种观点提醒你要避免将大量时间浪费在试图收集更多训练样本上 因为额外的数据在此情况下并无价值
右边是高方差时的学习曲线
假设我们采用一个很小的lambda值(接近于零但又不完全为零),那么显然对于这组数据而言,我们可以获得一个非常出色的结果。如果训练集的样本容量较小,在这种情况下训练集误差Jtrain将会很小。随着训练集样本容量的增加(即样本容量增大),Jtrain 的值会随之增大。然而总体而言,在这种情况下Jtrain仍然保持较小水平。交叉验证集误差Jcv则会一直维持在一个较大的数值范围内(即无论选择怎样的训练集大小)。即使我们选择一个较为合适(恰当)的数量级,在这种情况下(即当考虑同时观察训练集误差和交叉验证误差时),两者之间的差距将会变得相当显著——也就是说,在这种情形下两条学习曲线(蓝色和红色曲线)正在相互靠近:当进一步增加 training set size 时,training error可能会逐渐增大;而 cross-validation error 则会持续下降。值得特别关注的是cross-validation error 或者 test error——因此在这种情况下(即当我们考虑扩大 training set 的规模时),通过观察这两条学习曲线的变化趋势实际上可以帮助我们判断是否有必要投入更多资源来获取更多的 training data.
结论总结:欠拟合时,增加样本无意义;过拟合时,增加样本可能有帮助
Deciding What to Do Next Revisited决定下一步该做什么
采用带正则化的线性回归模型进行拟合后发现所采用的算法未能达到预期的效果。在提及可供选择的方案时 我们需探讨哪些策略可能更具有效性
第一种方法 依赖于获取更多训练数据 这种策略在应对高度可变性时表现出色 当模型面临高度偏差时 该方法的效果不明显 因此 我建议您首先绘制学习曲线 来评估您的模型是否存在至少一点方差问题 如果交叉验证集的误差确实高于训练集误差 那么这表明模型可能具有一定程度的不可减少误差
第二种方法涉及选择较少的关键特征。这一策略同样适用于数据高度可变性的情况。对于那些面临高估计偏差的问题而言,在模型中减少使用的特征并不会带来任何改进。
第三种策略是 采用更多的特征 通常有助于缓解高偏差问题。因此,在需要增加更多特征时,通常是由于现有的假设函数过于简单。因此我们选择增加一些其他特征来使假设函数更好地适应训练集的情况;类似地
第四种方法实际上是通过引入更多高阶多项式项来提升模型的表现。这种方法不仅增加了模型的复杂度 而且也用于缓解模型过拟合的问题。
第四种方法是 增大和减小λ 减小λ可以修正高偏差 而增大λ的值解决高方差
若你旨在进行神经网络的拟合,则可考虑采用一个相对简单的架构设计。例如可以选择仅包含一层隐藏层或隐藏单元数量相对较少的设计方案。这样的简洁结构通常会面临欠拟合的问题。然而其显著优点在于计算资源消耗较低。相比之下较为复杂的架构通常包含较多的隐藏层或每个层中的单元数量较多。较大的复杂性往往会导致模型过拟合的现象更加明显。值得注意的是较大的模型在性能提升方面表现更为突出可以通过引入正则化方法等技术手段来改善这一问题的表现效果
Machine Learning System Design机器学习系统设计
Building a Spam Classifier构建垃圾邮件分类器
Prioritizing What to Work On 确定工作内容的优先级
**

**
举例说明一种具体的垃圾邮件分类器的工作原理。假设你希望构建一个具备自动识别能力的垃圾邮件过滤系统。假设我们已经准备好了带标记的训练数据集,其中将标记为垃圾邮件的数据标记为y=1,并将正常邮件标记为y=0。那么我们如何通过监督学习方法构建这样一个分类器来区分并识别出不同的类型呢?
在进行监督学习时 首先需要确定的是 如何基于邮件的特征 构造向量x 在训练集中 包含特征x以及对应的标签y 从而能够训练出一种分类器 例如 通过逻辑回归方法实现
在判别邮电类型时, 我们常采用一些特征变量的方法。例如, 在区分垃圾邮电与普通邮电时, 我们会关注一些特定的单词。举个例子来说, 在一封含有 '交易'、'购买'、'折扣' 等词的邮电中…… 再者, 在一封包含名字 'Andrew' 的邮电中…… 注意到的是, 在 '现在' 这个词出现时……
我们可以通过筛选大量关键词来撰写一封这样的邮件,并将其转化为特征向量的形式进行分析;具体方法如图所示
我挑选了100个单词用于标记垃圾邮件的可能性 因此该特征向量x具有100维 并且当某个特定单词j出现在这封邮件中时 对应的特征变量x_j被赋值为1;否则则赋值为0"
这一过程是我在处理数据时 自行定义的 100个关键词 在实际应用中 我们通常会采用以下步骤:首先 遍历整个训练数据集 确定其中出现频率最高的n个词汇 其中n通常在1万到5万之间 这些词汇将被用作特征的基础 这种方法与人工筛选不同 因为自动选择的词汇能更好地反映数据中的模式。
当你试图构建一个用于识别垃圾邮件的分类器时
在垃圾邮件分类领域中存在一个名为"Honey Pot"的项目,在这个项目的框架下可以创建一个虚假的电子邮件地址,并有意地将其发送给发送垃圾邮件的人。这样一来,就会产生大量用于训练学习算法的垃圾邮件样本。观察到这一点后,我们就可以收集成百上千份这样的垃圾邮件来进行训练和算法优化。然而,在之前的课程中我们了解到,大量数据可能有助于提升模型性能,但也可能带来负面影响。
**

**
在大多数机器学习问题中,存在多种方法可以显著提高模型的效果。例如,在处理垃圾邮件时,或许我们会考虑引入更为复杂的特征变量来辅助分类任务。例如,在分析电子邮件路径信息这一数据时(该数据通常会出现在邮箱标题字段),我们可以推测发送方可能试图通过隐藏来源地址或其他手段来规避检测机制。因此,在这种情况下,请注意区分不同类型的发件人行为模式:他们可能会选择使用虚假账户(false email addresses)或访问非典型服务器(non-standard servers),同时也会尝试绕过常见的反垃圾措施(anti-spam mechanisms)。此外,请记住这些路径记录也可能包含在邮箱标题字段中(因为它们经常出现在这里)。基于此观察结果,请思考我们是否可以通过分析邮箱标题字段提取出更多的复杂特征,并据此推断是否存在某种异常行为(anomalous behavior)?
除此之外,你还可以考虑采用其他方法。你可以从邮件正文的角度进行分析,并探索一些较为复杂的特征。举个例子,“discount”这个词是否与“discounts”完全相同?类似地,“deal(交易)”和“dealer(交易商)”这两个术语是否可以被视为相同的含义?此外,在某些情况下,同一个单词可能以大小写的不同形式出现。“比如说,在不同的语境下,“deal”可能被写作“DEAL”。或者我们是否应该通过标点符号的变化来提取更丰富的特征?因为垃圾邮件通常会大量使用感叹号等clamation marks来吸引注意。这些都不一定能够直接帮助你识别出垃圾邮件。”
同样地, 我们也可以开发出更为高难度的算法, 用于检测并纠正那些故意造成的拼写错误。例如, 对于像 "m0rtgage", "med1cine" 和 "w4tches" 这样的字符串, 实际上垃圾邮件发送方确实采用了这种方法。因为如果将数字4插入到"w4tches"中, 那么如同我们之前所述的简单方法无法识别"w4tches"与"watches"之间的细微差别, 因此这类故意拼错的垃圾邮件就难以被轻易识别出来。然而, 发送垃圾邮件的人非常精明, 他们正是利用了这一点来规避过滤系统。当我们采用机器学习时, 则能够通过多角度思考探索多种解决方案。
顺便一提 我有一段些时候 研究过垃圾邮件分类的问题 实际上我投入了大量的时间来研究这个 尽管我对垃圾邮件分类问题的理解不言而喻 我确实掌握了一些相关知识 但是 我还是难以向你具体说明 在这四种方法中 你该如何选择应用哪一种 最常见的情况是 研究团队可能会随机地选择其中一个方法 但有时这种方法未必是最优的选择 此外 每天早上苏醒时分 可能会因为某些原因 会发生突然灵光一闪 "让我们来试试 搭配Honey Pot项目 收集大量数据" 这样的想法 不管出于何种奇怪的想法 或者是某个 morning 的灵感 经常会导致团队随机选择一个方案 然后投入大半年的时光进行实施 然而 我认为我们有更好的解决办法
在本节中, 我们将基于误差分析向您介绍如何挑选出最合适的一个更为系统化的途径, 从一系列不同的方法中进行筛选。
Error Analysis误差分析
如果你进行机器学习研究或者开发相关应用的最佳实践建议不是构建一个极其复杂且包含大量变量的系统而是设计并搭建一个简单的算法这样你可以在短时间内迅速完成实现工作即使结果不尽如人意但也能通过快速测试得到初步结论随后利用交叉验证方法评估模型性能并绘制学习曲线分析偏差与方差问题从而决定是否需要增加数据量或引入更多特征变量
如果你进行机器学习研究或者开发相关应用的最佳实践建议不是构建一个极其复杂且包含大量变量的系统而是设计并搭建一个简单的算法这样你可以在短时间内迅速完成实现工作即使结果不尽如人意但也能通过快速测试得到初步结论随后利用交叉验证方法评估模型性能并绘制学习曲线分析偏差与方差问题从而决定是否需要增加数据量或引入更多特征变量
其原因在于,在刚接触机器学习问题时,这是一个很好的方法。然而,在这种情况下进行操作之前,请注意以下几点:首先,请问您是否应该引入复杂的特征变量或是是否需要更多的数据?这些决定往往非常棘手,并非易事。这是因为缺乏足够的证据和学习曲线作为参考而造成的困难。因此,在不清楚这些关键点的情况下选择如何有效利用时间以提升算法性能是一个值得探讨的问题。但请记住,在实践中选择一个简单而有效的策略(即使它并不完美),然后通过绘制学习曲线的方法可以更好地进行下一步决策
这一理念要求我们在决策过程中依赖证据的引导,并非随意为之。我们需要合理分配时间以优化算法而非仅凭直觉,在此基础之上单纯依靠直觉得出的结果往往不可靠。值得注意的是,在构建模型时除了观察学习曲线之外 误差分析确实是一项非常有价值的工具。举个例子 比如在构建垃圾邮件分类器时 我会仔细查看我的交叉验证数据集 并直接观察哪些邮件被算法错误分类。通过分析这些被错误分类的垃圾邮件与正常邮件之间的差异以及特定类型邮件常被误判的现象 这个过程能够帮助我们识别系统的不足并启发改进策略。
具体来说,请考虑一个垃圾邮件分类器的例子:假设你正在构建一个垃圾邮件分类器,并拥有500个实例,在交叉验证集中进行测试。在这个案例中,请注意该算法表现出很高的误差率,在100个交叉验证实例中出现了误分情况。因此,请我进行人工核查这100个误分案例,并根据具体情况对其进行分类。例如,请确定这些邮件属于哪种类型;哪些变量能够帮助算法实现准确分类?明确地说,请通过识别这些邮件属于哪种类型来鉴定它们。通过分析这100封误分案例中的每封邮件,请找出其中最容易被误分的类型:通常与药品相关的邮件居多(如售药或假货推销),例如假表或其他欺骗性信息;此外还包括钓鱼邮件等类型。在核查这些误分案例时,请逐一查看每封邮件,并统计数量:在这100封误分案例中发现有12封与药品推销相关、4封涉及假货推销(如假表)、53封是钓鱼邮件等欺骗性信息,并剩余31封为其他类型。通过计算不同类别中的具体数量分布情况,请观察该算法在区分钓鱼邮件方面的表现如何:结果表明该算法在这方面表现欠佳。因此建议应着重研究此类别相关特征变量,并探索是否能构造出更具区分力的特征以提高分类准确性
我们假设 能帮助我们提高 邮件分类表现 的方法是 检查有意的拼写错误 不寻常的邮件路由来源 以及垃圾邮件特有的标点符号方式 比如很多感叹号 与之前一样 我会手动地浏览这些邮件 假设有5封这种类型的邮件 16封这种类型的 32封这种类型的 以及一些别的类型的 如果 这就是你从交叉验证中得到的结果 那么 这可能说明 有意地拼写错误出现频率较少 这可能并不值得 你花费时间 去编写算法来检测这种类型的邮件 但是如果你发现 很多的垃圾邮件 都有不一般的标点符号规律 那么这是一个很强的特征 说明你应该 花费你的时间 去构造基于标点符号的 更加复杂的特征变量 因此 这种类型的误差分析 是一种手动检测的过程 检测算法可能会犯的错误 这经常能够帮助你 找到更为有效的手段 这也解释了为什么 我总是推荐先实践一种 快速即便不完美的算法 我们真正想要的是 找出什么类型的邮件 是这种算法最难分类出来的 对于不同的算法 不同的机器学习算法 它们 所遇到的问题一般总是相同的 通过实践一些快速 即便不完美的算法 你能够更快地 找到错误的所在 并且快速找出算法难以处理的例子 这样你就能集中精力在这些真正的问题上
在构建机器学习模型的过程中,在搭建起一个完整的算法体系时,请记住一个实用的技巧:那就是确保自己具备运用数值计算方法来评估模型效果的能力
先看看这个例子 假设我们打算 决定是否应该 将像"discount""discounts""discounter""discountring" 这样的单词视为同一概念 一种方法是 检查这些单词的 开头几个字母 比如 当你在考察这些单词开头几个字母的时候 你会发现 这些单词 大致可能有着相同的意思 在自然语言处理领域 这种方法 是基于一种称为词干提取的软件实现的 如果你想尝试一下 可以 在网上搜索一下 "Porter Stemmer(波特词干提取法)" 这是在词干提取方面 一个比较流行的软件 这个软件会 将单词"discount""discounts"以及等等 视为同一个词 但这种词干提取软件 只会检查 单词的头几个字母 这有其便利性 但也可能造成一些问题 因为 比如说 它会把单词"universe(宇宙)" 和"university(大学)" 也视为同一个词 因为这两个单词开头的字母是一样的 因此 当你要决定 是否应该使用词干提取软件来分类时 难以得出明确结论 特别地 通过错误率分析也无法确定 词干提取是否是一个好的方法 相对于而言 最好的方法 是迅速动手试验一下 来观察它实际效果 如何评估你的算法 可以通过数值来进行 具体来说 自然地 你应该通过交叉验证 来比较不用词干提取与用词干提取算法的错误率 因此 如果你的算法中不使用词干提取得到的是5%的分类错误率 而加入词干提取后得到的是3%的错误率 那么这种改进是有意义的 因此你决定采用词干提取作为解决方案 对于这个问题而言 交差验证错误率 是一个重要的评估指标 我们以后会发现 这个例子中的评估指标还需要进一步处理 但在未来的课程中 我们会了解到 如何利用这个指标 更加高效地做出决策 比如 是否采用词干提取
每当你要实践一个新的想法时,
每次当你实践新想法时,
你都需要手动检查这些实例,
观察结果表现是否优秀,
这样很难让你确定
是否应该采用词干提取方法,
或者是否需要区分大小写。
然而,
通过一个量化数值评估指标可以看出,
误差幅度是上升还是下降,
这一评估指标能够迅速验证新方法的有效性;
直观来看,
如果这种方法能提升准确率或降低计算开销,
则值得尝试;
这样一来就能显著提高算法优化的速度。
因此,在交叉验证集上进行误差分析是一个更为合理的选择;
尽管如此,在测试集上进行评估仍然常见;
不过出于准确性考虑仍需推荐采用交叉验证集上的评估方式。
总结经验的话,在探索一个新的机器学习问题时我会建议你可以优先开发一个相对简单且高效的方法尽管可能不够完善但这种做法很少见大家普遍的做法是在构建算法上投入大量时间设计那些看似简单的策略因此无需过分在意你的方法是否过于简化或不够完善而是应该尽快开始开发你的方法当有了初步成果后这个工具将帮助你在下一步骤中做出决策你可以通过分析现有方法导致的错误来了解其局限性并据此制定改进计划另外一种情况是如果你已经拥有了一个高效但不太完美的解决方案并且还有相应的评估数据集那么这可以帮助你在尝试新的改进方向时迅速验证其有效性从而你可以迅速决定在哪些方面进行舍弃和采用
Handling Skewed Data处理偏斜数据
Error Metrics for Skewed Classes偏斜类的错误度量
为了对算法进行评估 和引入误差度量值 ... 的重要性,请注意以下几点:首先需要选择适当的误差度量值 ... 这一选择会对你的学习算法 ... 产生显著影响 ... 这一关键问题就是 偏斜类(skewed classes) 的处理方法 ... 比如在癌症分类问题中 ... 我们通常会收集患者的特征数据 ... 假设 y=1 表示患有癌症 ... 假设 y=0 表示没有患病 ... 在训练逻辑回归模型后 ... 使用测试集检验该模型时发现其误报率为 1% ... 因此在 99% 的情况下我们的诊断是正确的;然而这一结果在实际情况中可能并不理想;因为在测试集中仅有 0.5% 的患者实际患有癌症;因此这个 1% 的误报率实际上可能远高于预期。
举例而言,在机器学习模型开发中偏斜类的问题较为常见。比如其中一行代码就实现了这一功能:它总使变量y的值设为0,并因此导致模型始终预测结果为"没有癌症"的情况。这种设定下模型的整体准确率为99.5%,即其总体错误率为仅0.5%,这一结果远优于我们之前得到的1%的错误率(但需注意的是,在这种特定案例中正类别样本数量与负类别样本数量之比极为悬殊)。在这个案例中正类别样本数量与负类别样本数量之比极为悬殊的情况下我们将其定义为高度不平衡分类问题在这种情况下通过总是预测y=0或者总是预测y=1的方式可能会表现出色
因此使用分类误差 或者分类精确度 来作为评估度量可能会产生如下问题 假如说你有一个算法 它的精确度是99.2% 因此它只有0.8%的误差 假设 你对你的算法做出了一点改动 现在你得到了 99.5%的精确度 只有0.5%的误差 这到底是不是算法的一个提升呢 用某个实数来 作为评估度量值 的一个好处就是 它可以帮助我们迅速决定 我们是否需要对算法做出一些改进 将精确度从99.2%提高到99.5% 但是我们的改进到底是有用的 还是说 我们只是把代码替换成了 例如总是预测y=0 这样的东西 因此如果你有一个偏斜类 用分类精确度 并不能很好地衡量算法 因为你可能会获得一个很高的精确度 非常低的错误率 但是我们并不知道 我们是否真的提升了 分类模型的质量 因为总是预测y=0 并不是一个 好的分类模型 但是总是预测y=0 会将你的误差降低至 比如 降低至0.5%
当我们处理一个偏斜类时
我们需要计算两个指标:准确率和召回率。准确率意味着当我们预测某人患有癌症时,在这些被预测为阳性的病例中实际患病的比例有多大;召回率则表示当所有真实患病的人被纳入考虑时,在这些病例中被正确识别的比例是多少。准确率为真阳性占总预测阳性的比例(即真阳性/(真阳性+假阳性)),召回率为真阳性占真实阳性的比例(即真阳性/(真阳性+假阴性))。通过综合这两个指标的结果评估分类模型的整体性能会更加直观可靠
Trading Off Precision and Recall
癌症分类问题的一个案例:在我们有充分信心的情况下,在特定条件下预测一个病人患有癌症的一种策略是优化算法策略,并非简单地将判别阈值固定为0.5。相反,在h(x)的值达到或超过0.7时才预测y=1。这样一来,在这种情况下建立起来的回归模型将呈现较高的精确率与较低的召回率特征
当我们设定临界值P(y=1|x) \geq 0.9时 为了测试其准确性 我们仅限于少数病例标记为y=1 这些病例中绝大多数病例确实患有癌症 因此该模型具有较高的精确度 然而其召回率会有所降低的原因在于我们的设定旨在尽可能减少误诊。
让我们考虑一个不同的案例 假设我们希望防止漏诊 而期望尽量减少假阴性情况的发生 具体来说 在这种情况下(如果一名病人实际上患有癌症但我们的检测系统未能告知这一点),可能会导致严重的后果 因此 在这个例子中 我们将临界值设定为较低的水平 例如0.3 这样一来 我们的模型将具有较高的召回率和较低的精确率
因此 总的来说 对于大多数的回归模型 你得权衡查准率和召回率

当调整临界值时

具体而言,在假设存在三种不同的学习曲线时(这些曲线实际上是同一学习算法的表现),但由于其临界值的不同特性而表现出差异性特征的情况下
你可能会尝试进行一项计算工作以评估查准率与召回率的平均表现该方法将通过计算P与R这两个指标的具体数值来观察不同模型之间的性能差异在这一过程中需要注意避免简单化的处理方式因为单一模型往往难以在多个关键指标上取得理想平衡例如当回归模型总是预测y=1时 这种策略可能导致较高的召回率同时伴随较低的查准率反之若模型倾向于预测y=0并设定一个较高的临界值则可能获得较高的查准率但伴随着较低的召回率这种极端情况下的表现均无法被视为理想的模型评估标准
与之不同的是,有一种结合查准率与召回率的不同方式,被称为F值,其具体数值是这样的.在这个例子中,F值的具体数值也是这样的.我们可以通过这一指标来判断各个算法的表现:其中,算法1具有最高的F值,紧随其后的是算法2,最低的是算法3.因此,基于F值的评估结果可知,在这几个算法中表现最佳的是算法1(即F1值),其次为算法2(即F值),而算法3则表现最差.F值也被称为F1分数,通常写作F1分数.但是一般情况下人们只称其为F分数.它的定义会综合考虑查准率与召回率这两个指标的平均值.然而,F分数会对较低的查准率或召回率情况赋予更高的重视.因此,F分数的分子实际上是查准率与召回率的乘积.由此可见,如果查准率为0或者召回率为0,F分数也会等于0.这表明,F分数完美地结合了这两个关键指标.值得注意的是,虽然有多种公式能够同时衡量查准率与召回率,F分数只是其中之一.然而由于历史原因及惯用习惯,在机器学习领域仍广泛采用这一术语.F分数本身并无特别意义,因此无需过分担忧它命名的原因(如为什么叫作F分数或者F1分数).但它是评估系统性能的有效工具:因为无论是查准率为0还是召回率为0,F分数都会给出一个很低的结果.F分数越高表明系统性能越佳:只有当两者均接近于1时才能得到最高的得分(如P=0或R=0的情况下,F分数同样等于0).对于达到完美状态的情况,P=1且R=1时将获得最高的评分(即(1×1)/(2×( (1/2)+(1/2) )) = 1).通常情况下,F分数会在回归模型等场景中取得介于0到之间的常见数值
在本次视频中, 我们探讨了如何平衡准确率与召回率, 并介绍了一种通过设定不同的临界点来调节查准率与召回率之间平衡的方法. 比如说, 我们可以选择70%或90%作为置信标准. 此外, 当目标是自动选择临界值以确定是否预测y=1还是y=0时, 最佳方法是在验证集上寻找最高F分数.
Using Large Data Sets使用大型数据集
Data For Machine Learning机器学习数据
研究表明,在特定条件下收集了大量数据,并通过某种学习算法进行训练,是一种有效的方法来生成具有良好性能的学习模型。而这种情况通常发生在这些条件适用于你的具体问题,并且你能够收集到充足的数据。这也是一种非常有效的途径来构建高绩效学习系统。
很久以前

他们采用了四种分类方法,并未关注这一部分的具体细节;然而他们的主要做法是调整了训练样本的数量,并试图将这种方法应用于不同数量的数据样本上;这就是他们的研究结果;可以看出这一现象相当明显;初步观察到大多数方法表现出类似的效果;进一步观察到随着训练样本数量增加的方法性能得到了改善。
实际上,如果你选择了"劣质"算法,即使提供给它大量数据,也有可能超越"优秀"算法.像这样的结果,在机器学习领域引发了普遍共识:普遍共识认为:'成功者并非拥有最佳算法的人而是拥有充足数据的人'.那么这个说法在什么情况下成立,在什么情况下不成立呢?
如果你拥有丰富的数据,并且正在训练一种具有复杂参数的学习算法,那么这种方法可能会生成一个高性能的学习算法。我认为关键测试的关键在于:我经常思考的是:一个人类专家在看到特征值x时能否有充分的信心预测出y值?因为这将有助于证明y能否根据特征值x被准确预测出来。其次,我们是否能够获得一组庞大且在此基础上训练一个具有复杂参数的学习算法?如果不能满足以上两点要求,则可能难以构建性能卓越的学习模型。
参考资料
