---
schema_version: "library-reader-v1"
source_type: "original_book"
title: "人工智能与大数据技术导论"
author: null
edition: null
publisher: null
year: null
isbn: "9787302517986"
library_document_id: "cd4f7678-cd9b-4971-bde0-e9ad46a6cc71"
source_sha256: "5011cdcf83cd5e047c93a1ce7465f970fc88be69c93b94be3d7fa5fbddbb43f0"
pdf_physical_page_count: 490
pdf_physical_page_index_base: 0
range_start: 290
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71?start=290&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=290&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=280&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=300&limit=10"
---

# 人工智能与大数据技术导论

> 页码规则：PDF_PHYSICAL_PAGE_INDEX 是从 0 开始的权威文件物理页索引；PRINTED_PAGE 是页面中识别出的印刷页码，可能为空，二者不得混用。

## PDF_PHYSICAL_PAGE_INDEX=290 | PRINTED_PAGE=274

9.2 L2 正则化

正则化在机器学习领域很重要，主要是针对模型过拟合问题而提出来的。在前面的章节中，我们一直在探讨如何让训练误差降至最低。对于正则化，简单来说，就是不要过于信赖训练样本。如图9-9所示，从过拟合曲线可以看出：随着进行越来越多次迭代，训练误差会减少，越来越少，并一直减少。

训练数据（TrainingData）曲线会不断下降，最终它会在某种程度上收敛于底端。但实际上验证数据（ValidationData）曲线开始上升。验证数据是我们真正要关注的。尽管我们在对训练样本进行训练，但想要泛化到新的样本，也就是测试样本。我们希望将样本的损失控制在较低的范围。那么如何抑制验证数据曲线上升呢？这表示什么情况呢？首先说明出现了过拟合。我们在处理训练数据样本方面做得很好，开始在某种程度上过拟合训练数据样本的一些独

人工智能与大数据技术导论

274

## PDF_PHYSICAL_PAGE_INDEX=291 | PRINTED_PAGE=275

特数据。

那么该如何处理过拟合呢？我们可以通过正则化来避免过拟合。正则化有很多不同的策略。其中一种策略是“早停法”，也就是在训练数据的效果实际收敛前停止训练。尽量抵达验证数据曲线的底端，这是一种常用策略，但实际操作起来可能有些困难。其他正则化策略包括尝试添加模型复杂度惩罚项。我们可以在模型训练期间添加模型复杂度惩罚项。

在这之前，我们的训练仅专注于一个重要方面，也就是获取正确的训练样本，最大程度地减少经验风险，即经验风险最小化：

$$
\mathrm { m i n i m i z e ( L o s s ( D a t a | M o d e l ) ) }
$$

现在引入第二项以对模型复杂度进行惩罚：

$$
\mathrm { m i n i m i z e ( L o s s ( D a t a | M o d e l ) + c o m p l e x i t y ( M o d e l ) ) }
$$

这称为结构风险最小化（structural risk minimization）。我们要平衡这两个关键因素（误差和复杂度），确保获取正确的训练数据，但又不过度信赖训练数据以免使模型过于复杂。那么，如何定义模型复杂度呢？我们可以采用多种方法。一种常见的策略是定义一个基于所有特征权重的函数。这个方法是尽量选择较小的权重，也就是使参数尽可能小，同时仍能获取正确的训练样本。换句话说，权重越高，复杂度越高。

我们使用L2正则化公式来量化模型的复杂度：

$$
L _ { 2 } \mathrm { \ r e g u l a r i z a t i o n \ t e r m } = | | \pmb { w } | | _ { 2 } ^ { 2 } = w _ { 1 } ^ { 2 } + w _ { 2 } ^ { 2 } + . . . + w _ { n } ^ { 2 }
$$

上面定义了一个正则项（regularizationterm），它是所有权重的平方和，用于衡量模型复杂度。在上面的公式中，如果权重非常小（比如趋近于0），那么对复杂度的影响很小。离群值（outlier）的权重一般对复杂度影响大。假定我们有以下权重的线性模型：

$$
\{ w _ { 1 } = 0 . 2 , w _ { 2 } = 0 . 5 , w _ { 3 } = 5 , w _ { 4 } = 1 , w _ { 5 } = 0 . 2 5 , w _ { 6 } = 0 . 7 5 \}
$$

那么：

$$
\begin{array} { r l } & { \omega _ { 1 } ^ { 2 } + \omega _ { 2 } ^ { 2 } + \omega _ { 3 } ^ { 2 } + \omega _ { 4 } ^ { 2 } + \omega _ { 5 } ^ { 2 } + \omega _ { 6 } ^ { 2 } } \\ & { = 0 . 2 ^ { 2 } + 0 . 5 ^ { 2 } + 5 ^ { 2 } + 1 ^ { 2 } + 0 . 2 5 ^ { 2 } + 0 . 7 5 ^ { 2 } } \\ & { = 0 . 0 4 + 0 . 2 5 + 2 5 + 1 + 0 . 0 6 2 5 + 0 . 5 6 2 5 } \\ & { = 2 6 . 9 1 5 } \end{array}
$$

所以，L2正则化项为26.915。在上面的贡献度上，我们发现 ${ \bf W } _ { 3 }$ 是25，基本上贡献了最多的复杂度。目前，我们在训练优化方面添加了两项：第一项是训练误差，取决于训练数据；第二项是模型复杂度。第二项与数据无关，只是要简化模型。在实际使用中，我们把这两项通过lambda实现了平衡，公式如下：

$$
\mathrm { m i n i m i z e ( L o s s ( D a t a \vert M o d e l ) } + \lambda \mathrm { c o m p l e x i t y ( M o d e l ) } )
$$

第9章 TensorFlow 高级知识

275

## PDF_PHYSICAL_PAGE_INDEX=292 | PRINTED_PAGE=276

lambda是一个系数，也叫regularizationrate（正则率）。这代表我们对获取正确样本（越正确，训练误差越小，越拟合）与简化模型的关注程度之比，增加lambda值则会加强正则化效果。一般而言，如果我们有大量的训练数据，训练数据和测试数据看起来一致，并且统计情况呈现独立同分布，那么可能不需要进行多少正则化。如果训练数据不多，或者训练数据与测试数据有所不同，那么可能需要进行大量正则化。我们可能需要利用交叉验证，或使用单独的测试集进行调整。

如果lambda过高，那么模型相对简单，这时会发生欠拟合数据的风险。如果lambda过低，那么模型可能变得过于复杂，这时会发生过拟合数据的风险。这时，模型过于拟合训练数据，但不能泛化到新的数据上。最理想的lambda的值是使得模型能够良好地泛化到新数据上。当然，理想值是依赖于数据的，需要多次调试来获得。总之，正则化主要是用来降低过拟合的，减少过拟合的其他方法有增加训练集数量等。对于数据集有限的情况，防止过拟合就是降低模型的复杂度，这就是正则化。

9.3 逻辑回归

逻辑回归（LogisticRegression，LR）模型其实仅在线性回归的基础上套用了一个逻辑函数，但也由于这个逻辑函数，使得逻辑回归模型成为机器学习领域一颗耀眼的明星。在回归模型中，y是一个定性变量，比如y=0或1，逻辑回归主要应用于研究某些事件发生的概率。比如，如何预测硬币抛出后硬币正面朝上的概率？概率为0到1之间的值。这就是逻辑回归。这是一种非常实用的预测方法，我们经常将这种方法映射到分类任务上，比如想确定某封电子邮件是否是垃圾邮件。总的来说，逻辑回归的用途如下。

●预测：根据模型，预测在不同自变量的情况下，发生某种疾病或某种情况的概率有多大。

判别：实际上跟预测有些类似，也是根据模型，判断某人属于某种疾病或属于某种情况的概率有多大，也就是看一下这个人有多大的可能性属于某种疾病或某种情况。

逻辑回归分析非常有用。以胃癌病情分析为例，选择两组人群，一组是胃癌组，另一组是非胃癌组，两组人群必定具有不同的体征与生活方式等。因此，因变量就为是否患有胃癌，值为“是”或“否”，自变量就可以包括很多了，如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的，也可以是分类的。然后通过逻辑回归分析，可以得到自变量的权重，从而可以大致了解到底哪些因素是导致胃癌的危险因素。同时，通过该权值可以根据危险因素预测一个人患癌症的可能性。

逻辑回归中的逻辑函数（或称为Sigmoid函数）的形式为：

$$
y = { \frac { 1 } { 1 + e ^ { - z } } }
$$

它对应的图形如图9-10所示。

人工智能与大数据技术导论

276

## PDF_PHYSICAL_PAGE_INDEX=293 | PRINTED_PAGE=277

上述函数可以提供0\~1的有界值，两边有渐近线。其中， $\mathrm { z } { = } \mathrm { b } { + } \mathrm { w } _ { 1 } \mathrm { x } _ { 1 } { + } \mathrm { w } _ { 2 } \mathrm { x } _ { 2 } { + } . . . { + } \mathrm { w } _ { \mathrm { N } } \mathrm { x } _ { \mathrm { N } }$ 。w是模型权重，b是偏差，x是特征变量。所以，图9-10也可以描述为如图9-11所示的曲线。

从数学的角度，我们还可以得出如下公式：

$$
z = l o g ( \frac { y } { 1 - y } )
$$

下面我们来看一个例子。假定有一个逻辑回归模型，它有三个特征变量，权重和偏差是b=1, $\mathrm { w } _ { 1 } = 2 , ~ \mathrm { w } _ { 2 } = - 1 , ~ \mathrm { w } _ { 3 } = 5$ 。假定我们有一个样本数据进来： $x _ { 1 } = 0 , ~ x _ { 2 } = 1 0 , ~ x _ { 3 } = 2$ 。那么，我们可以计算出 $z = ( 1 ) + ( 2 ) ( 0 ) + ( - 1 ) ( 1 0 ) + ( 5 ) ( 2 ) = 1$ o

$$
y ^ { \prime } = { \frac { 1 } { 1 + e ^ { - ( 1 ) } } } = 0 . 7 3 1
$$

所以，概率为73.1%，如图9-12所示。

第9章 TensorFlow 高级知识

277

## PDF_PHYSICAL_PAGE_INDEX=294 | PRINTED_PAGE=278

在训练时，我们使用的是不同的误差函数。线性回归用的是平方损失。而逻辑回归使用的是对数误差函数：

$$
\operatorname { L o g } \operatorname { L o s s } = \sum _ { ( x , y ) \in D } - y \log ( y ^ { \prime } ) - ( 1 - y ) \log ( 1 - y ^ { \prime } )
$$

其中， $( \mathbf { \boldsymbol { x } } , \mathbf { \boldsymbol { y } } )$ 属于数据集，包含很多已经标签了的样本数据，y是标签，0或1。对于给定的x, $y ^ { \prime }$ 是预测值，在0和1之间。如果你仔细看这个公式就会发现，它看起来很像Shannon信息论中的熵测量。上述对数误差函数的图形如图9-13所示（如果不好理解这个数学公式，看懂图就行了）。

图9-13表示，越接近其中一个条线，误差就会变得越大，而且变化速度也非常惊人。我们看到了渐近线的作用。由于这些渐近线的存在，我们需要将正则化纳入机器学习中。否则，在指定的数据集上，模型可能会尽量更紧密地拟合数据，努力让这些误差接近0。L2正则化在这里会非常有用，它可以确保权重不会严重失衡。

线性逻辑回归很流行，它的速度非常快，能够非常高效地进行训练和预测。因此，如果我们需要一种方法来很好地扩展到海量的数据，或者需要将某种方法用于延迟时间极短的预测，那么线性逻辑回归可谓是理想之选。如果我们需要使用非线性逻辑回归，则可以通过添加特征交叉乘积来实现。

人工智能与大数据技术导论

278

## PDF_PHYSICAL_PAGE_INDEX=295 | PRINTED_PAGE=279

9.4 分类

分类（Classification）是一种重要的数据挖掘算法。分类的目的是构造一个分类函数或分类模型（即分类器），通过分类器将数据对象映射到某一个给定的类别中。分类器的主要评价指标有精确率（Precision）、召回率（Recall）、准确率（Accuracy）、ROC、AOC等。

我们想利用机器学习模型进行分类，比如邮件是不是垃圾邮件。在9.3节中，我们可以将逻辑回归用作分类的基础。例如，邮件为垃圾邮件的概率超过0.8，我们可能就会将其标记为垃圾邮件。0.8就是分类阈值（classificationthreshold）。那么，选定分类阈值之后，如何评估相应模型的质量呢?

评估分类效果的一种传统方式是使用准确率，它指的是正确结果数除以总数，就是正确结果所占的百分比。值得注意的是，虽然准确率是一种非常直观且广泛使用的指标，但它也有一些重大缺陷。如果问题中存在类别不平衡的情况，那么准确率指标的效果就会大打折扣。假设有一个用于展示广告的广告点击率的预测模型，我们要尝试使用准确率指标来评估此模型的质量。对于展示广告，点击率通常为千分之一、万分之一，甚至更低。因此，可能存在这样一个模型，这个模型只有一个始终预测“假”的偏差特征。这个始终预测“假”的模型预测的准确率为99.999%，但这毫无意义。显然，准确率并不适用于这种情况。

我们再看一个例子，虽然准确率确实是一个很好、很直观的评价指标，但是有时候准确率高并不能代表一个算法就好。比如某个地区某天地震的预测，假设有一堆的特征作为地震分类的属性，类别只有两个，即0；：不发生地震；1：发生地震。一个不加思考的分类器，对每一个测试用例都将类别划分为0，那么它就可能达到99%的准确率，但真的地震来临时，这个分类器毫无察觉，这个分类带来的损失是巨大的。为什么99%准确率的分类器却不是我们想要的，因为这里数据的分布不均衡，类别1的数据太少，完全错分类别1依然可以达到很高的准确率，却忽视了我们关注的东西。接下来详细介绍一下分类算法的评价指标。

9.4.1 评价指标—准确率

我们首先介绍几个常见的模型评价术语。假设我们的分类目标只有两类，即正例(Positive)和负例（Negative），分别如下。

TruePositives(TP)：被正确地划分为正例的个数，即实际为正例且被分类器划分为正例的实例数（样本数）。

●FalsePositives(FP）:被错误地划分为正例的个数，即实际为负例但被分类器划分为正例的实例数。

第9章 TensorFlow 高级知识

279

## PDF_PHYSICAL_PAGE_INDEX=296 | PRINTED_PAGE=280

人工智能与大数据技术导论

●FalseNegatives（FN）：被错误地划分为负例的个数，即实际为正例但被分类器划分为负例的实例数。

TrueNegatives（TN）：被正确地划分为负例的个数，即实际为负例且被分类器划分为负例的实例数。

这里只要记住True、False描述的是分类器是否判断正确，Positive、Negative是分类器的分类结果。为了帮助大家理解，我们使用“狼来了”这则故事。假定“狼来了”是正类(PositiveClass)，那么“狼没来”就是负类（NegativeClass）。小男孩是一个牧童，狼来到镇上，如果他正确地指出来，就是真正例。他看到了狼并说“狼来了”。真正例对应的结果是小镇的羊得救，这很好。假正例则是小男孩说“狼来了”，但其实并没有狼。这就是假正例，这会令所有人非常恼火。假负例的后果可能更严重。假负例对应的情形是，狼来了而小男孩睡着了或没看到，狼进入镇子并吃掉了所有的羊。这可真的太惨了。真负例对应的情形是小男孩没喊“狼来了”，狼也确实没出现，一切安好。以上可以总结为如图9-14所示的4种情况。

我们可以将这些预期情况组合成几个不同的指标。准确率（Accuracy）是我们最常见的评价指标，Accuracy=（TP+TN）/所有样本数，这个很容易理解，就是被分对的样本数除以所有的样本数。通常来说，准确率越高，分类器越好。所有样本数=TP+FP+FN+TN。下面试着计算一下图9-15中模型的准确率，该模型将100个肿瘤分为恶性（正类别）或良性（负类别）。

$$
\mathrm { A c c u r a c y } = { \frac { T P + T N } { T P + T N + F P + F N } } = { \frac { 1 + 9 0 } { 1 + 9 0 + 1 + 8 } } = 0 . 9 1
$$

280

## PDF_PHYSICAL_PAGE_INDEX=297 | PRINTED_PAGE=281

准确率为0.91，即91%（总共100个样本中有91个预测正确）。这表示肿瘤分类器在识别恶性肿瘤方面表现得非常出色，对吗？实际上，只要我们仔细分析一下正类别和负类别，就可以更好地了解模型的效果。在100个肿瘤样本中，91个为良性（90个TN和1个FP），9个为恶性（1个TP和8个FN）。在91个良性肿瘤中，该模型将90个正确识别为良性。这很好。不过，在9个恶性肿瘤中，该模型仅将1个正确识别为恶性。这是多么可怕的结果！9个恶性肿瘤中有8个未被诊断出来！

虽然91%的准确率可能乍一看还不错，但如果另一个肿瘤分类器模型总是预测良性，那么这个模型使用我们的样本进行预测也会实现相同的准确率（100个中有91个预测正确）。换言之，我们的模型与那些没有预测能力来区分恶性肿瘤和良性肿瘤的模型差不多。

当你使用分类不平衡的数据集（比如正类别标签和负类别标签的数量之间存在明显差异）时，单单准确率一项并不能反映全面情况。所以，我们需要两个能够更好地评估分类不平衡问题的指标：精确率和召回率。

9.4.2 评价指标——精确率

精确率（precision）指标尝试回答以下问题：在被识别为正类别的样本中，确实为正类别的比例是多少？以前面的狼来了例子为例，这个参数的意思是我们是否说“狼来了“太多了。在小男孩说“狼来了”的情况中，有多少次是对的？他说“狼来了”的精确率如何？

精确率的定义如下：

$$
\mathrm { P r e c i s i o n } = { \frac { T P } { T P + F P } }
$$

从上面公式看出，如果模型的预测结果中没有假正例，则模型的精确率为1.0。让我们来计算一下上一部分中用于分析肿瘤的机器学习模型的精确率：

$$
\sharp \sharp \sharp \sharp \sharp = { \frac { T P } { T P + F P } } = { \frac { 1 } { 1 + 1 } } = 0 . 5
$$

该模型的精确率为0.5，也就是说，该模型在预测恶性肿瘤方面的精确率是50%。

9.4.3 指标—召回率

回答问题：在所有正类别样本中，被正确识别为正类别的比例是多少？以前面的“狼来了”为例，这个参数的意思是我们错过了多少“狼来了”。召回率指标则是指在所有试图进入村庄的狼中，我们发现了多少头？从数学上讲，召回率的定义如下：

$$
\mathop { \mathbb { Z } } ^ { } [ \flat ] \mathop { \mathbb { Z } } ^ { } = \frac { T P } { T P + F N }
$$

从上面的公式看出，如果模型的预测结果中没有假负例，则模型的召回率为1.0。让我们计算一下肿瘤分类器的召回率：

第9章TensorFlow 高级知识

281

## PDF_PHYSICAL_PAGE_INDEX=298 | PRINTED_PAGE=282

$$
\mathcal { \frac { T ^ { n } } { H } } [ \bar { u } ] \bar { \neq } = \frac { T P } { T P + F N } = \frac { 1 } { 1 + 8 } = 0 . 1 1
$$

该模型的召回率是0.11，也就是说，该模型能够正确识别出所有恶性肿瘤的百分比是11%。

比如前面讲的地震预测，没有谁能准确预测地震的发生，但我们能容忍一定程度的误报，假设1000次预测中，有5次预测为发现地震，其中一次真的发生了地震，而其他4次为误报，那么准确率从原来的 $9 9 9 / 1 0 0 0 \times 1 0 0 \% = 9 9 . 9 \%$ 下降到 $9 9 6 / 1 0 0 0 \times 1 0 0 \% { = } 9 9 . 6 \%$ ，但召回率从$0 / 1 \times 1 0 0 \% { = } 0 \%$ 上升为 $1 / 1 \times 1 0 0 \% { = } 1 0 0 \%$ ，这样虽然谎报了几次地震，但真的地震来临时，我们没有错过，这样的分类器才是我们想要的，在一定准确率的前提下，我们要求分类器的召回率尽可能高。

9.4.4 评价指标之综合考虑

要全面评估模型的有效性，必须同时检查精确率和召回率。遗憾的是，精确率和召回率往往是此消彼长的情况。也就是说，提高精确率通常会降低召回率。这是因为，如果我们希望在召回率方面做得更好，那么即使只是听到灌木丛中传出一点点声响，小孩也说“狼来了”。但是，如果我们希望非常精确，那么正确的做法是只在完全确定时才说“狼来了”。前一种做法会降低分类阈值，后一种做法会提高分类阈值。怎么在这两个方面都做好非常重要。这也意味着，每当有人告诉你精确率是多少时，还需要问召回率是多少，然后才能评价模型的优劣。我们再来看几个例子。图9-16显示了电子邮件分类模型做出的30项预测。分类阈值右侧的被归类为“垃圾邮件”，左侧的则被归类为“非垃圾邮件”。我们选择特定的分类阈值后，精确率和召回率值便都可以确定。

根据图9-16所示的结果来计算精确率和召回率，4种情况如图9-17所示。

精确率指的是被标记为垃圾邮件的电子邮件中正确分类的电子邮件所占的百分比，即图中阈值线右侧的绿点所占的百分比：

$$
{ \mathrm { P r e c i s i o n } } = { \frac { T P } { T P + F P } } = { \frac { 8 } { 8 + 2 } } = 0 . 8
$$

人工智能与大数据技术导论

282

## PDF_PHYSICAL_PAGE_INDEX=299 | PRINTED_PAGE=283

召回率指的是实际垃圾邮件中正确分类的电子邮件所占的百分比，即图中阈值线右侧的绿点所占的百分比：

$$
{ \mathrm { R e c a l l } } = { \frac { T P } { T P + F N } } = { \frac { 8 } { 8 + 3 } } = 0 . 7 3
$$

下面我们提高分类阈值，看看产生什么样的效果，如图9-18所示。

假正例数量会减少，但假负例数量会相应地增加。结果，精确率有所提高，而召回率则有所降低，4种情况如图9-19所示。

$$
\mathrm { P r e c i s i o n } = { \frac { T P } { T P + F P } } = { \frac { 7 } { 7 + 1 } } = 0 . 8 8
$$

$$
\mathrm { R e c a l l } = { \frac { T P } { T P + F N } } = { \frac { 7 } { 7 + 4 } } = 0 . 6 4
$$

如果我们降低分类阈值（从最初始位置开始），那么产生的效果是什么样的呢？如图9-20所示。

假正例数量会增加，而假负例数量会减少。结果这一次，精确率有所降低，而召回率则有所提高，4种情况如图9-21所示。

第9章 TensorFlow 高级知识

283

下一段：[继续读取](https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=300&limit=10)
