---
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: 190
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71?start=190&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=190&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=180&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=200&limit=10"
---

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

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

## PDF_PHYSICAL_PAGE_INDEX=190 | PRINTED_PAGE=174

线性回归之所以不适合解决分类问题，是因为因变量y的取值范围是全体实数，而我们需要的因变量是介于0和1之间的数。sigmoid函数的引入刚好解决了这个问题，从φ(z)的表达式可以看出， $\phi ( z )$ 这个函数将全体实数集映射到（0，1）这个区间。这样因变量y就被定在了(0,1）这个区间。虽然和我们想要的两点分布形式有差别，但（0,1）区间让我们想到什么?概率。

因变量y在这里表示样本属于类别1的概率。y越接近1，这一条样本属于类别1的可能性越高；y越接近0，则它属于类别0的可能性越高。因此，我们可以设定一个临界值，比如0.5，对于每一个x，在计算得到的y值大于0.5时，归为类别1，在y值小于等于0.5时，归为类别0。

逻辑回归还有另一种书写形式，该形式保留线性回归模型中等号右边的形式，并在左边对y加一个连接函数：

$$
{ \mathrm { l o g i t ( y ) } } = a 0 + { \mathrm { a l x l } } + a 2 { \mathrm { x } } 2 + \ldots + { \mathrm { a m x m } }
$$

这里 $\scriptstyle \log \mathrm { i t } ( \mathbf { y } ) = \log ( \mathbf { \mu } \mathbf { y } / ( 1 - \mathbf { y } ) )$ 。通过数学推导，可以证明两种形式是等价的。

这个模型具体是怎么运作的呢?同线性回归一样，上述公式描述了y与x之间的客观关系。x是自变量，而y是因变量。逻辑模型告诉我们y与x之间存在这样一种形式的约束关系，但模型中的参数未知，需要我们去估计。该模型中的参数与线性回归的参数相同，即$\mathrm { a 0 , a 1 , \ldots , a m }$ 。这个模型参数一般用极大似然估计来求解。

在进行预测时，我们可以使用（2）式。计算好参数之后，我们就可以按照（2）式的法则由给定的 x 计算出 y。若 $y \geqslant 0 . 5$ ，则分类为1；若 $y { < } 0 . 5 ,$ 则分类为0。这样我们的分类任务就完成了。

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

174

## PDF_PHYSICAL_PAGE_INDEX=191 | PRINTED_PAGE=175

6.4 KNN 算法

本节我们来看KNN算法。KNN算法通常用来做分类问题。这个算法的思想是用临近样本的标签值来估计待分类样本的标签值。具体来说，就是选取离待分类样本距离最近的k个样本点，如果这k个样本点大多数属于某一类别，那么该样本属于这个类别。

如图6-19所示，在平面中有两种标签的点—红色三角和蓝色方框。绿色圆圈标记（上面有问号标记）的点为待分类的点。首先我们需要预设k的值。k是我们想考察周围点的个数，假设k=3。离绿色圆圈最近的三个点有两个为红色三角，一个是蓝色方框。根据少数服从多数原则，将待分类的点标记为红色三角。

事实上，这样一来我们就完成了分类任务。是不是很简单？相比前几个小节介绍的分类算法，KNN算法执行起来非常简单，易于理解。而且值得注意的是，KNN算法中没有参数需要估计，这和我们之前介绍的算法有根本的不同，没有参数也就无须进行训练。KNN算法的全部过程都在预测阶段。KNN算法依然属于监督式学习，需要我们告知样本集数据的标签，但不要通过训练进行学习，这表示它在机器学习算法中有一定的特殊性。

6.4.1 超参数k

KNN算法虽然没有参数，但是存在超参数，那就是k。需要注意的是，当我们改变k的值时，目标值可能会发生改变。回到上面的例子，如果我们选择k=5（图中虚线圆圈），那么图5-18中这个待分类的点将被划分为蓝色，这是因为它周围最近的5个点红蓝比例为2:3。可见，KNN的分类结果非常依赖预设值k。k是KNN算法中唯一的超参数。如何选取k的值，是KNN算法中的一门学问。

另外要提到的是，关于“距离”的概念。距离最近要怎么定义？在上面这个例子中，我们使用的是平面中两点的几何距离。这个几何距离通常被称为“欧几里得距离（EuclideanDistance)”，这个概念可以被推广到高维空间中。所谓“欧几里得距离”，就是将两个点各个分量相减的平方和开根号，即：

第6章 机器学习算法

175

## PDF_PHYSICAL_PAGE_INDEX=192 | PRINTED_PAGE=176

$$
d _ { 1 2 } = \sqrt { \sum _ { k = 1 } ^ { n } ( x _ { 1 k } - x _ { 2 k } ) ^ { 2 } }
$$

除了欧几里得距离之外，KNN用到的常见距离还有曼哈顿距离（ManhattanDistance）和切比雪夫距离（ChebyshevDistance）。这三种距离统称为闵可夫斯基距离，可用下面这个通式来表示：

$$
d _ { 1 2 } = \left( \sum _ { i = 1 } ^ { n } | x _ { 1 i } - x _ { 2 i } | ^ { p } \right) ^ { 1 / p }
$$

当 $\mathrm { p } = \mathrm { 1 }$ 时为曼哈顿距离。

当 $\mathrm { p } = 2$ 时为欧几里得距离。

当 $\mathrm { p } = \infty$ （正无穷）时为切比雪夫距离。

$$
\operatorname* { l i m } _ { p \to \infty } \left( \sum _ { i = 1 } ^ { n } | x _ { i } - y _ { i } | ^ { p } \right) ^ { \frac { 1 } { p } } \operatorname* { m a x } _ { i = 1 } ^ { n } | x _ { i } - y _ { i } |
$$

1. 基于距离倒数的权重KNN

KNN算法的一个可以改进的地方是将“临近点取平均值”改为“临近点按距离权重取平均值”。对离测试点更近的点赋予更高的权重，离测试点较远的点赋予较低的权重。比如 ${ \bf k } =$ 5时，如果做回归，预测结果由最近的5个点分别乘1/5相加得到，如图6-20所示。在使用距离权重系数后，预测结果改为由最近5个点分别乘以w1、w2、w3、w4、w5得到，其中wi和测试点到邻近样本点i的距离di成反比。

2. KNN的参数调节

虽然KNN没有训练的过程，但KNN也会出现过拟合现象。回顾一下过拟合的定义，过拟合指的是训练集和测试集表现相差较大的现象。KNN模型如果使用不当，这种情况也是会发生的。发生过拟合时，训练集本身的样本点几乎都被正确分类，但训练集之外的点分类不够准确。

当发生过拟合时，我们需要适当增大参数k。试想当k=1时，所有训练集内部的点绝对会被正确分类（如果不考虑有重合样本点且标签不同的情况），这是因为每个点离它最近的点就是自己。这样训练集的准确率可以达到100%。但测试集中一旦有和训练集不同的点，预测效果就难以保证了。随着k的增大，模型更不容易收到离群值的影响，预测效果更加稳定。

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

176

## PDF_PHYSICAL_PAGE_INDEX=193 | PRINTED_PAGE=177

6.4.2 KNN实例：波士顿房价预测

下面我们使用KNN来预测波士顿房价。首先从sklearn案例库中读取数据集，并进行训练集和测试集的分离：

先简单了解一下这个数据集。该数据集包括13个特征，1个连续目标变量。数据集共有506个观测值，没有缺失值。下面我们载入KNeighborsRegressor程序包，拟合模型：

考察模型在训练集和测试集的预测效果：

我们再来看测试集预测值与真实值的散点图情况（见图6-21）：

第6章 机器学习算法

177

## PDF_PHYSICAL_PAGE_INDEX=194 | PRINTED_PAGE=178

可以看到模型在训练集上表现得还不错，但在测试集上表现得比较糟糕，R2score只有0.24。下面我们将k的值改为5，重新拟合模型，重复上述过程：

将k从2改为5之后，训练集表现下降，测试集表现提升，但训练集与测试集之间的差距依然很大。现在我们来尝试对原始数据做标准化处理，加载sklearn中的scale函数，对数据X进行标准化：

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

178

## PDF_PHYSICAL_PAGE_INDEX=195 | PRINTED_PAGE=179

可以发现模型的效果显著提升，特别是测试集的R2score比原来好了很多。同时，我们可以看到测试集的散点图中的点更加集中在45度线上，说明预测值与真实值普遍变得更加接近。经过后续探究我们发现，此时再改变k的值并不会给测试集得分带来改善。因此，这里我们选用k=2作为最终模型。

6.4.3算法评价

KNN算法无须训练带来的直接好处是模型简洁易懂，易于通过代码实现。整个预测过程看似只有“一步”，就是选择离目标点最近的k个点。但模型简单并不意味着计算简单。这也是KNN算法最遗憾的一点。要选出离目标点最近的k个点，我们在图中可以一目了然地找到。但计算机需要遍历整个样本集才能找出这k个点。加入预测集有200条样本需要预测，那么对于这200个点中的每一个点，都需要计算和训练集中所有样本点之间的距离，以便选出其中最近的k个点，这个计算量是巨大的。

6.5 决策树算法

决策树是使用树形结构进行决策的模型。决策树很适合用于工业界的机器学习建模，因为树的一个最大优点就是过程简单，易于理解，你可以很清晰地将其决策的依据讲给一个不懂机器学习的局外人。比如我们可以展示如图6-24所示的树形图，让客户或行业外的人直观地看到决策路径，使模型的结果具备较强的说服力。

在决策树上，叶子节点是决策树末端的节点，代表分类结果。图6-24中的蓝色节点（矩形表示的节点）均为叶子节点。那么问题来了，我们从最上面的节点出发，对于每个节点，应该如何选择决策条件呢?要用X1、X2、X3中的哪个变量进行区分？假设我们定下来要用X1进行区分，又该选择什么数值作为分界点呢?

这些分界点是要通过训练得到的。上述各个节点所选择的特征和数值就是决策树要训练的参数。但我们要告诉决策树选择的原则，这里介绍的是CART决策树算法。除此之外，还有ID3、C4.5算法。它们的差异是节点选择参数的标准不同。下面我们介绍CART算法。

第6章 机器学习算法

179

## PDF_PHYSICAL_PAGE_INDEX=196 | PRINTED_PAGE=180

1. CART 决策树模型

每个节点可以选择的分界条件很多，比如 $^ { 4 \prime } \mathrm { X } 1 > 5 0 ^ { 9 \cdot 3 } \phantom { ^ { 4 } \mathrm { X } 2 > 3 } ^ { 4 } \mathrm { X } 3 = \mathrm { F a l s e } ^ { 9 }$ 等。我们需要从所有分界点中选择给我们带来信息收益增量最大的一个。下面通过一个应用案例（鸢尾花种类识别）来说明CART算法。

首先，读取iris数据，这里读取的是本地的CSV文件：

回顾一下，这个数据集包括花瓣长度（PetalLenthCm）、花茎长度（SepalLenthCm）、花瓣宽度（PetalWidthCm）和花茎宽度（SepalWidthCm）四个连续型特征，一个包括3种分类类别的目标变量（Species），如图6-25所示。

原始数据包括150个样本，我们将120个样本用于训练集，其余当作测试集：

构建决策树：

tree.DecisionTreeClassifier()是这个算法的核心模块。这里我们并没有在括号里向模型传递参数，所有参数均为默认值。DecisionTreeClassifier()可以接受以下arguments:

树的最大优点在于可视化的直观性。我们可以用graphviz程序包进行树模型的可视化。要使用这个工具，就要在控制台中安装 graphviz。以Anaconda prompt为例，打开Anaconda prompt,输入如下指令：

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

180

## PDF_PHYSICAL_PAGE_INDEX=197 | PRINTED_PAGE=181

接下来回到代码界面，读取并使用这个程序包，可以得到如图6-26所示的决策树：

图6-26中，橙色、绿色和紫色三种颜色的叶子节点分别对应 setosa、versicolor和virginica三种鸢尾花类别，也就是我们的决策结果。现在了解了模型的决策路线，下面调用predict指令来进行预测。

在训练集上的预测：

第6章 机器学习算法

181

## PDF_PHYSICAL_PAGE_INDEX=198 | PRINTED_PAGE=182

结果如下：

可以看到准确率达到了100%。

在测试集上的预测：

结果如下：

在测试集上的准确率为96.7%，30个测试样本有29个预测正确。

2. 模型总结

决策树很容易出现过拟合。因为只要树的深度足够大（叶子节点足够多），我们总是能完美地拟合训练集的数据，只要我们把训练集每一个样例作为一个单独的叶子节点即可。决策树的优点是具有极高的可解释性。

6.6 集成算法

前面我们了解了如何使用决策树进行分类和回归。决策树很少会直接拿来使用，这是因为随着树的深度增大很容易发生过拟合。本节介绍的基于树的集成算法很好地解决了这一问题。集成算法是机器学习中最重要的思想之一。绝大多数集成算法都是基于树的集成算法，反过来几乎所有用到树的模型都是通过集成算法进行封装而实现的。集成算法既可以用于分类，也可以用于回归。在讲解概念时，为了方便，在没有特别说明时，我们默认讨论分类集成算法。回归问题的思路与分类问题相似。

6.6.1 集成算法简述

集成算法是将多个分类器结合而成的新的分类算法。集成算法由一系列的弱分类器(weakclassifiers）组成，这些弱分类器通常是非常简单的分类器，比如决策树。通过将这些弱分类器组合在一起，形成一个性能更强的分类器，作为最终预测的输出结果。最常见的集成学习手段有两种：Bagging和Boosting。前者的代表算法是随机森林，后者的代表算法包括Adaboost、GBDT 和 Xgboost。

Bagging和Boosting都采取了上述集成学习的思想，将若干个弱分类器进行组合。假设弱分类器有T个，那么一共就需要T轮训练。不同的是，在Bagging中，各个弱分类器的训练是并行进行的，而Boosting中的T轮训练需要依次进行。

182

## PDF_PHYSICAL_PAGE_INDEX=199 | PRINTED_PAGE=183

6.6.2 集成算法之 Bagging

Bagging 是将一系列弱分类器 F1(x),F2(x),...,Fb(x)并行进行训练，然后对结果取平均值(Regression），或者投票（Classification）而产生最终预测结果，其基本流程如图6-27所示。Bagging整个过程一共进行了T轮训练，每一轮使用的弱分类器都是二叉树，但读取的训练数据集不同。在每个弱分类器训练中，从样本中随机有放回地抽取N个样本，N是样本集样本的个数。在这个过程中，某一个特定的样本X(i)可能被使用多次，也可能未被使用。各个弱分类器抽取样本的过程是独立的。

RandomForest（随机森林）是最著名也是最实用的Bagging算法之一。正如其名字一般，“随机森林”由多棵树组成，单独一棵树是一个弱分类器，将很多树组合在一起，就形成了具有强大预测能力的“森林”。这个组合的过程就是通过Bagging完成的。每一棵树是一个弱分类器，在样本集的一个Bootstrap上训练完成。最终将T棵树的结果汇总（投票或取平均值），生成最终的输出。

但随机森林不止如此。在上述介绍Bagging的基础上，对于每一个弱分类器，在训练前除了随机选择样本（Bagging的基本定义）外，还要从特征集中随机选出一个特征子集来训练。这样做是为了让每棵树学习得不要太相似—如果有几个特征和目标变量是强相关的，那么这些特征在所有树中都会被挑选出来。随机森林算法从n个特征中随机选出其中的p个用于训练，可以有效防止这种情况发生，每棵树在受限的p个变量中进行训练，可以让不同的树“长得更不一样”。

下面我们给出随机森林的具体算法：

第6章 机器学习算法

183

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