PDF 物理页索引 190
文件中的第 191 页 · 印刷页码: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 物理页索引 191
文件中的第 192 页 · 印刷页码: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 物理页索引 192
文件中的第 193 页 · 印刷页码: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 } |
$$
- 基于距离倒数的权重KNN
KNN算法的一个可以改进的地方是将“临近点取平均值”改为“临近点按距离权重取平均值”。对离测试点更近的点赋予更高的权重,离测试点较远的点赋予较低的权重。比如 ${ \bf k } =$ 5时,如果做回归,预测结果由最近的5个点分别乘1/5相加得到,如图6-20所示。在使用距离权重系数后,预测结果改为由最近5个点分别乘以w1、w2、w3、w4、w5得到,其中wi和测试点到邻近样本点i的距离di成反比。
- KNN的参数调节
虽然KNN没有训练的过程,但KNN也会出现过拟合现象。回顾一下过拟合的定义,过拟合指的是训练集和测试集表现相差较大的现象。KNN模型如果使用不当,这种情况也是会发生的。发生过拟合时,训练集本身的样本点几乎都被正确分类,但训练集之外的点分类不够准确。
当发生过拟合时,我们需要适当增大参数k。试想当k=1时,所有训练集内部的点绝对会被正确分类(如果不考虑有重合样本点且标签不同的情况),这是因为每个点离它最近的点就是自己。这样训练集的准确率可以达到100%。但测试集中一旦有和训练集不同的点,预测效果就难以保证了。随着k的增大,模型更不容易收到离群值的影响,预测效果更加稳定。
人工智能与大数据技术导论
176
PDF 物理页索引 193
文件中的第 194 页 · 印刷页码:177
6.4.2 KNN实例:波士顿房价预测
下面我们使用KNN来预测波士顿房价。首先从sklearn案例库中读取数据集,并进行训练集和测试集的分离:
先简单了解一下这个数据集。该数据集包括13个特征,1个连续目标变量。数据集共有506个观测值,没有缺失值。下面我们载入KNeighborsRegressor程序包,拟合模型:
考察模型在训练集和测试集的预测效果:
我们再来看测试集预测值与真实值的散点图情况(见图6-21):
第6章 机器学习算法
177
PDF 物理页索引 194
文件中的第 195 页 · 印刷页码:178
可以看到模型在训练集上表现得还不错,但在测试集上表现得比较糟糕,R2score只有0.24。下面我们将k的值改为5,重新拟合模型,重复上述过程:
将k从2改为5之后,训练集表现下降,测试集表现提升,但训练集与测试集之间的差距依然很大。现在我们来尝试对原始数据做标准化处理,加载sklearn中的scale函数,对数据X进行标准化:
人工智能与大数据技术导论
178
PDF 物理页索引 195
文件中的第 196 页 · 印刷页码: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 物理页索引 196
文件中的第 197 页 · 印刷页码:180
- 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 物理页索引 197
文件中的第 198 页 · 印刷页码:181
接下来回到代码界面,读取并使用这个程序包,可以得到如图6-26所示的决策树:
图6-26中,橙色、绿色和紫色三种颜色的叶子节点分别对应 setosa、versicolor和virginica三种鸢尾花类别,也就是我们的决策结果。现在了解了模型的决策路线,下面调用predict指令来进行预测。
在训练集上的预测:
第6章 机器学习算法
181
PDF 物理页索引 198
文件中的第 199 页 · 印刷页码:182
结果如下:
可以看到准确率达到了100%。
在测试集上的预测:
结果如下:
在测试集上的准确率为96.7%,30个测试样本有29个预测正确。
- 模型总结
决策树很容易出现过拟合。因为只要树的深度足够大(叶子节点足够多),我们总是能完美地拟合训练集的数据,只要我们把训练集每一个样例作为一个单独的叶子节点即可。决策树的优点是具有极高的可解释性。
6.6 集成算法
前面我们了解了如何使用决策树进行分类和回归。决策树很少会直接拿来使用,这是因为随着树的深度增大很容易发生过拟合。本节介绍的基于树的集成算法很好地解决了这一问题。集成算法是机器学习中最重要的思想之一。绝大多数集成算法都是基于树的集成算法,反过来几乎所有用到树的模型都是通过集成算法进行封装而实现的。集成算法既可以用于分类,也可以用于回归。在讲解概念时,为了方便,在没有特别说明时,我们默认讨论分类集成算法。回归问题的思路与分类问题相似。
6.6.1 集成算法简述
集成算法是将多个分类器结合而成的新的分类算法。集成算法由一系列的弱分类器(weakclassifiers)组成,这些弱分类器通常是非常简单的分类器,比如决策树。通过将这些弱分类器组合在一起,形成一个性能更强的分类器,作为最终预测的输出结果。最常见的集成学习手段有两种:Bagging和Boosting。前者的代表算法是随机森林,后者的代表算法包括Adaboost、GBDT 和 Xgboost。
Bagging和Boosting都采取了上述集成学习的思想,将若干个弱分类器进行组合。假设弱分类器有T个,那么一共就需要T轮训练。不同的是,在Bagging中,各个弱分类器的训练是并行进行的,而Boosting中的T轮训练需要依次进行。
182
PDF 物理页索引 199
文件中的第 200 页 · 印刷页码: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