系列文章目录
第1章 专家系统
第2章 决策树
第3章 神经元和感知机
识别手写数字——感知机
第4章 线性回归
文章目录
- 系列文章目录
- 前言
- 一、分类问题的数学形式
- 二、最大似然估计
- 三、交叉熵损失函数
- 四、多类别分类
- 多类别逻辑斯蒂回归
- 归一化指数函数
- 交叉熵误差和均方误差的比较
- 五、分类器的决策边界
- 六、代码实践
- 使用逻辑斯蒂回归
- 观察分类边界
- 总结
前言
回归和分类是机器学习的核心问题,它们都可以描述自变量和因变量之间的关系,通过自变量的观测值取预测或估计对应的因变量。
当因变量是连续型数值时,模型解决的是回归问题。
当因变量是离散值时,模型解决的是分类问题。这些离散值就代表了不同的类别。
而逻辑斯蒂Logistic Regression就是一种特殊的线性回归模型,用于解决分类问题。它与感知机有着密切的联系。
一、分类问题的数学形式
例如在鸢尾花数据集中,用-1表示山鸢尾类别,1表示杂色鸢尾类别。类标签为1的称作“正样本”,类标签为-1的称作“负样本”。我们将类标签作为因变量,就会发现因变量不再连续,变成了离散值。那么当回归模型给出的预测值不是1或者-1时,我们如何解释这些值呢?
比较符合直觉的是,当预测值接近1的时候,属于正样本的概率较大;反之,预测值接近-1的时候,属于负样本的概率较大。
越大的正值表示属于正样本的可能性越大,越小的负值表示属于负样本的可能性越大。0则表示几乎无法区分是哪一种类别。也就是说,我们需要把负无穷到正无穷的实数值映射到属于某一类别的概率。
假设样本属于类别 1 1 1的概率为 p p p,则属于类别 − 1 -1 −1的概率为 1 − p 1-p 1−p。将回归模型的预测值记作 l l l,当 p p p趋近于1的时候, l l l趋向于正无穷;当 p p p趋向于0的时候, l l l趋向于负无穷;当 p p p等于0.5的时候, l l l则是0。
为了实现这样的映射关系,定义 l l l与 p p p的关系如下:
l = ln p 1 − p l = \ln{ \frac{p}{1-p}} l=ln1−pp
这个关系将[0,1]区间上的概率值和整个实数轴建立了对应关系。由于使用了对数函数, l l l也称作对数几率(log-odds)。
由于,逻辑斯蒂回归是线性模型,它假设对数几率 l l l和自变量 ( x 1 , x 2 , … ) (x_1,x_2,\dots) (x1,x2,…)呈线性关系。
即有
l = ln p 1 − p = b + ω 1 x 1 + ω 2 x 2 + … l = \ln{ \frac{p}{1-p}}=b+\omega_1 x_1+\omega_2x_2+\dots l=ln1−pp=b+ω1x1+ω2x2+…
这看起来与线性回归很相似,但是无法利用线性回归的最小二乘法来解决,因为每个数据对应的概率值 p p p是未知的。如果简单地根据类别标签设置为1 或者 0,那么它们对应的对数几率 l l l会成为正无穷或者负无穷,而无法作为回归的目标值进行有效的计算。
稍加变换,我们会发现概率 p p p与输入的线性和(即对数几率 l l l)是Sigmoid函数(用 σ \sigma σ表示)的关系,这就是感知机(人工神经元)的数学模型。
p = 1 1 + e − t = σ ( b + ω 1 x 1 + ω 2 x 2 + … ) p = \frac{1}{1+e^{-t}}=\sigma (b+\omega_1 x_1+\omega_2x_2+\dots) p=1+e−t1=σ(b+ω1x1+ω2x2+…)
注:
Sigmoid函数形式如下:
σ ( t ) = ( 1 + e − t ) − 1 \sigma(t)=(1+e^{-t})^{-1} σ(t)=(1+e−t)−1
那么,我们能不能用求解感知机(或者神经网络)的梯度下降法来解决这个问题呢?
与最小二乘法相似,我们仍然要设置训练样本的概率值 p p p作为感知机模型的学习目标。如果简单地把训练样本按照类别设置为 p = 0 p=0 p=0或者 p = 1 p=1 p=1,确实可以训练出能够分类的感知机模型,然而,模型输出却无法理解样本属于某一类别的对数几率。
后面会看到,这是因为我们使用了错误的方式度量感知机输出的误差,通过改变感知机的误差度量函数,可以使用感知机的梯度下降法来求解逻辑斯蒂回归问题。
二、最大似然估计
对于概率问题,应该用概率的方法来解决。这里用最大似然估计,即调整模型的参数,使得样本出现的概率最大。
将样本特征加权线性和记为向量内积的形式: ω T x \omega ^T x ωTx
仍然给特征维度加上一个常数1 的维度,将偏置作为权值处理。
例如, b + ω 1 x 1 + ω 2 x 2 b+\omega_1 x_1+\omega_2x_2 b+ω1x1+ω2x2就可以表示为列向量 ω = ( ω 1 , ω 2 , b ) T \omega={(\omega_1,\omega_2,b)}^T ω=(ω1,ω2,b)T和 x = ( x 1 , x 2 , 1 ) T x={(x_1,x_2,1)}^T x=(x1,x2,1)T的内积 ω T x \omega^T x ωTx。
鸢尾花数据集中, x 1 x_1 x1表示花萼的长度, x 2 x_2 x2表示花萼的宽度。用带括号的下标表示样本的编号。第 i i i个样本 x ( i ) x_{(i)} x(i)所属的类别记为 y ( i ) y_{(i)} y(i),这里只有两种类别:山鸢尾记为0,杂色鸢尾记为1 。
某个样本 i i i属于杂色鸢尾的概率为 p ( i ) = σ ( ω T x ( i ) ) p_{(i)}=\sigma{(\omega^Tx_{(i)})} p(i)=σ(ωTx(i)),则属于山鸢尾的概率为 1 − p ( i ) 1-p_{(i)} 1−p(i)
我们可以更一般化地把一个样本出现的概率表示为
y ( i ) p ( i ) + ( 1 − y ( i ) ) ( 1 − p ( i ) ) y_{(i)}p_{(i)}+(1-y_{(i)})(1-p_{(i)}) y(i)p(i)+(1−y(i))(1−p(i))
这是利用标记变量的常见技巧。
假设样本之间相互独立,它们的总概率就是所有样本概率的乘积。
∏ i ( y ( i ) p ( i ) + ( 1 − y ( i ) ) ( 1 − p ( i ) ) ) \prod_{i}^{} \left ( y_{(i)}p_{(i)}+(1-y_{(i)})(1-p_{(i)}) \right ) i∏(y(i)p(i)+(1−y(i))(1−p(i)))
由于概率都是[0,1]之间的值,大量概率的连乘积通常会变得很小,不利于进行数值计算,而且求解优化问题时常常要进行求导数运算,乘积会使求导数变得很复杂。因此,对上式进行取对数,这个对数值 L L L就是最大似然估计的优化目标,我们称之为似然函数。
p ( i ) = σ ( ω T x ( i ) ) p_{(i)}=\sigma{(\omega^Tx_{(i)})} p(i)=σ(ωTx(i))是 ω \omega ω的函数,所以, L L L也是模型参数 ω \omega ω的函数,我们要调整 ω \omega ω使得 L L L取得极大值。
L ( ω ) = ∑ i y ( i ) ln p ( i ) + ( 1 − y ( i ) ) ln ( 1 − p ( i ) ) L(\omega) = \sum_{i}^{} y_{(i)}\ln{p_{(i)}}+(1-y_{(i)})\ln{(1-p_{(i)})} L(ω)=i∑y(i)lnp(i)+(1−y(i))ln(1−p(i))
求解 ω \omega ω的过程很难用求导的方式直接取得 L L L的极值点。可以看到,导数的表达式不难得到,但是导数等于0的方程不容易表示为解析式。通常,求解的过程是用数值优化的方法进行的,神经元感知机模型(或者神经网络)的梯度下降法就是优化方法之一,可以用在这里。
(!!!这一段的没有看懂,希望有人看懂了能评论解读一下)
三、交叉熵损失函数
最小化样本误差的平方和,仅仅只是感知机或者神经网络模型众多训练目标中的一种。我们可以改变误差的度量方式,从而改变训练的目标。由于模型误差的度量值是模型参数的函数,所以也罢误差的度量函数叫做损失函数。
样本误差的平方和,叫作均方误差(Mean Squared Error ,MSE)损失函数。上面最大似然估计的目标似然函数的相反数就是另一种损失函数,叫作交叉熵损失函数(Cross Entropy Loss, CEL).
当感知机模型采用交叉熵损失函数的时候,它和逻辑斯蒂回归是等价的。当使用感知机模型求解分类问题(而不是单纯的回归问题)时,应该使用交叉熵损失函数。
交叉熵 H ( q , p ) H(q,p) H(q,p)可以用来描述两个概率分布 q q q和 p p p之间的差异。
H ( q , p ) = − ∑ t q ( t ) ln p ( t ) H(q,p)=-\sum_{t}^{} q(t)\ln{p(t)} H(q,p)=−t∑q(t)lnp(t)
作为分类问题的损失函数,可以这样理解上述公式。其中, t t t是样本的类别。对于二分类, t ∈ { 0 , 1 } t \in \left \{ 0,1 \right \} t∈{0,1}。概率 p p p描述样本的真实分布, q ( t ) q(t) q(t)就是样本属于类别 t t t的概率,即训练样本的真实类别标签。概率 p p p描述模型预测出的分布, p ( t ) p(t) p(t)表示模型任务样本属于类别 t t t的概率。由此可见,交叉熵函数就是逻辑斯蒂模型的最大似然概率的相反数,对于单个样本:
H ( q , p ) = − L ( ω ) H(q,p)=-L(\omega) H(q,p)=−L(ω)
接下来看,如何用交叉熵损失函数进行多类别分类,以及为什么均方误差不适用于分类问题。
四、多类别分类
实际分类问题种,通常包含多个类别。例如,鸢尾花数据集就包含了3种不同的鸢尾花,0表示山鸢尾,1表示杂色鸢尾,2表示弗吉尼亚鸢尾。
多类别逻辑斯蒂回归
假设共有 K K K个类别, k ∈ { 0 , 1 , ⋯ , K − 1 } k \in \left \{ 0,1, \cdots,K-1 \right \} k∈{0,1,⋯,K−1} 表示各个类别的编号。 i i i表示样本编号, y ( i ) ∈ { 0 , 1 , ⋯ , K − 1 } y_{(i)} \in \left\{ 0,1,\cdots ,K-1\right \} y(i)∈{0,1,⋯,K−1} 表示训练样本的真实类标签, y ^ ( i ) ∈ { 0 , 1 , ⋯ , K − 1 } \hat{y}_{(i) }\in \left\{ 0,1,\cdots ,K-1\right \} y^(i)∈{0,1,⋯,K−1} 表模型预测出样本 i i i的类别标签, P r ( y ^ ( i ) = k ) Pr(\hat{y}_{(i) }=k) Pr(y^(i)=k)表示模型预测出样本 i i i属于类别 k k k的概率。
先回顾一下两个类别的情况,当只有两个类别时, k ∈ { 0 , 1 } k \in \left\{ 0,1\right \} k∈{0,1},我们假设下面的对数几率和样本特征 x ( i ) x_{(i)} x(i)呈线性关系,线性关系的权值为向量 ω \omega ω,对数几率可以表示为样本特征向量和权值向量的内积。
即有
ln P r ( y ^ ( i ) = 1 ) P r ( y ^ ( i ) = 0 ) = ω T x ( i ) \ln{\frac{Pr(\hat{y}_{(i) }=1)}{Pr(\hat{y}_{(i) }=0)}}=\omega^Tx_{(i)} lnPr(y^(i)=0)Pr(y^(i)=1)=ωTx(i)
当有K个类别的时候,我们可以想象需要解K-1个独立的逻辑斯蒂回归,选取类别0作为计算其他类别对数几率的基准(这里假设各个类别是独立的,所以基准类别
可以任意选取而不失一般性)。
ln P r ( y ^ ( i ) = k ) P r ( y ^ ( i ) = 0 ) = ω k T x ( i ) \ln{\frac{Pr(\hat{y}_{(i) }=k)}{Pr(\hat{y}_{(i) }=0)}}=\omega_{k}^Tx_{(i)} lnPr(y^(i)=0)Pr(y^(i)=k)=ωkTx(i)
其中, k = 1 , ⋯ , K − 1 , P r ( y ^ ( i ) = k ) k=1,\cdots,K-1,Pr(\hat{y}_{(i) }=k) k=1,⋯,K−1,Pr(y^(i)=k)表示模型预测出样本 i i i属于类别 k k k的概率。
根据对数几率的定义,样本属于类别 k k k的概率与样本属于类别 0 0 0的概率之比的对数值与样本特征呈线性关系 。这个线性关系的权值是向量 ω k \omega_{k} ωk,也就是第 k k k个逻辑斯蒂回归的权值参数。这样,我们就构造了K-1个逻辑斯蒂回归模型。
这些模型建立了样本属于类别 k k k的概率与属于类别 0 0 0的概率之间的关系,于是,样本属于某个类别 k k k的概率可以用它属于类别 0 0 0的概率表示出来。
P r ( y ^ ( i ) = k ) = P r ( y ^ ( i ) = 0 ) e ω k T x ( i ) Pr(\hat{y}_{(i) }=k)=Pr(\hat{y}_{(i) }=0)e^{\omega_k^Tx_{(i)}} Pr(y^(i)=k)=Pr(y^(i)=0)eωkTx(i)
又因为一个样本属于各个不同类别的概率之和应该为1,所以我们有:
1 = ∑ K = 0 K − 1 P r ( y ^ ( i ) = k ) = P r ( y ^ ( i ) = 0 ) + ∑ K = 1 K − 1 P r ( y ^ ( i ) = k ) = P r ( y ^ ( i ) = 0 ) + ∑ K = 1 K − 1 P r ( y ^ ( i ) = 0 ) e ω k T x ( i ) = P r ( y ^ ( i ) = 0 ) ( 1 + ∑ k = 1 K − 1 e ω k T x ( i ) ) \begin{align} 1 & = \sum_{K=0}^{K-1} Pr(\hat{y}_{(i) }=k) \\ &=Pr(\hat{y}_{(i) }=0)+\sum_{K=1}^{K-1} Pr(\hat{y}_{(i) }=k) \\ &=Pr(\hat{y}_{(i) }=0)+\sum_{K=1}^{K-1} Pr(\hat{y}_{(i) }=0)e^{\omega_k^Tx_{(i)}} \\ &=Pr(\hat{y}_{(i)}=0)\left ( 1+\sum_{k=1}^{K-1}e^{\omega_k^T x_{(i)}} \right ) \end{align} 1=K=0∑K−1Pr(y^(i)=k)=Pr(y^(i)=0)+K=1∑K−1Pr(y^(i)=k)=Pr(y^(i)=0)+K=1∑K−1Pr(y^(i)=0)eωkTx(i)=Pr(y^(i)=0)(1+k=1∑K−1eωkTx(i))
这样,我们就能得到每个类别的概率。
P r ( y ^ ( i ) = 0 ) = 1 1 + ∑ k = 1 K − 1 e ω k T x ( i ) Pr(\hat{y}_{(i)}=0)=\frac{1}{ 1+\sum_{k=1}^{K-1}e^{\omega_k^T x_{(i)}}} Pr(y^(i)=0)=1+∑k=1K−1eωkTx(i)1
P r ( y ^ ( i ) = k ) = e ω k T x ( i ) 1 + ∑ k ′ = 1 K − 1 e ω k ′ T x ( i ) Pr(\hat{y}_{(i)}=k)=\frac{e^{{\omega_k^{T}}x_{(i)}}}{ 1+\sum_{k'=1}^{K-1}e^{\omega_k'^T x_{(i)}}} Pr(y^(i)=k)=1+∑k′=1K−1eωk′Tx(i)eωkTx(i)
归一化指数函数
为计算方便,我们为基准类别0增加一组冗余的逻辑斯蒂回归参数。于是,对于所有类别 k = 0 , 1 , ⋯ , K − 1 k=0,1,\cdots,K-1 k=0,1,⋯,K−1,概率都可以写成一致的形式。我们把这个计算形式称作SoftMax函数,也叫做归一化指数函数。
SoftMax函数表达式如下:
P r ( y ^ ( i ) = k ) = e ω k T x ( i ) ∑ k ′ = 0 K − 1 e ω k ′ T x ( i ) \begin{align} Pr(\hat{y}_{(i)}=k) &=\frac{e^{{\omega_k^{T}}x_{(i)}}}{\sum_{k'=0}^{K-1}e^{\omega_k'^T x_{(i)}}} \end{align} Pr(y^(i)=k)=∑k′=0K−1eωk′Tx(i)eωkTx(i)
它在把任意实数映射为[0,1]上的概率的同时,通过取指数的形式放大了不同 ω k T x ( i ) \omega_k^{T}x_{(i)} ωkTx(i)之间的差异,使得最大值映射到接近1,而其他值映射到接近0.
运用最大似然估计,或者直接使用交叉熵损失函数,我们都可以得到多类别逻辑斯蒂回归模型的优化目标。
引入标记变量 q ( i , k ) q_{(i,k)} q(i,k),表示样本 i i i的真实类标签是否为k。当样本 i i i的类标签 y ( i ) = k y_{(i)}=k y(i)=k时, q ( i , k ) = 1 q_{(i,k)}=1 q(i,k)=1,否则 q ( i , k ) = 0 q_{(i,k)}=0 q(i,k)=0
由交叉熵损失函数的定义可知,多类别逻辑斯蒂回归的优化目标是最小化下面的损失函数 。
− ∑ k = 0 K − 1 q ( i , k ) ln P r ( y ^ ( i ) = k ) -\sum_{k=0}^{K-1} q_{(i,k)}\ln{Pr\left ( \hat{y}_{(i)}=k \right ) } −k=0∑K−1q(i,k)lnPr(y^(i)=k)
由于,仅有 y ( i ) = k y_{(i)}=k y(i)=k时, q ( i , k ) = 1 q_{(i,k)}=1 q(i,k)=1,因此,上面损失函数所有求和项仅剩一项,其余项均为0 。
− ln P r ( y ^ ( i ) = y ( i ) ) -\ln{Pr\left ( \hat{y}_{(i)}=y_{(i)} \right ) } −lnPr(y^(i)=y(i))
运用最大似然估计可以得到相似的结果。最大似然估计要最大化所有样本属于其真实类别的似然概率。
L ( ω 0 , ⋯ , ω K − 1 ) = ln ∏ i P r ( y ^ ( i ) = y ( i ) ) = ∑ i ln P r ( y ^ ( i ) = y ( i ) ) = ∑ i ln ( e ω y ( i ) T x ( i ) ∑ k = 0 K − 1 e ω k T x ( i ) ) \begin{array}{c}L\left (\omega_0,\cdots,\omega_{K-1} \right ) &=\ln{ \prod_{i}^{}{Pr \left ( \hat{y}_{(i)}=y_{(i)} \right ) } } \\ &=\sum_{i}^{} \ln{ Pr \left ( \hat{y}_{(i)}=y_{(i)} \right ) } \\ &= \sum_{i}^{}{ \ln \left ( \frac{e^{\omega^T_{y_{(i)}} \\ x_{(i)}}}{\sum_{k=0}^{K-1}e^{\omega_k^T x_{(i)}}} \right ) } \end{array} L(ω0,⋯,ωK−1)=ln∏iPr(y^(i)=y(i))=∑ilnPr(y^(i)=y(i))=∑iln(∑k=0K−1eωkTx(i)eωy(i)Tx(i))
当逻辑斯蒂回归用于多类别分类时,优化问题的目标就是最大化上面的似然函数,也就是最小化它的相反数——交叉熵损失函数。
交叉熵误差和均方误差的比较
为什么对于多分类问题,我们应该采用交叉熵损失函数,而不是均方误差?
1. 均方误差可能会给类别间的关系带来错误提示。
考虑一个猫、豹、狗的三分类问题,某个样本类标签为猫,用一组标记变量可以记为 ( 1 , 0 , 0 ) (1,0,0) (1,0,0),在均方误差看来,预测 ( 0.8 , 0.1 , 0.1 ) (0.8,0.1,0.1) (0.8,0.1,0.1)要优于预测 ( 0.8 , 0.15 , 0.05 ) (0.8,0.15,0.05) (0.8,0.15,0.05)。这是因为,当我们用均方误差计算预测值与标记变量的距离时,前者误差为 ( 1 − 0.8 ) 2 + 0. 1 2 + 0. 1 2 = 0.06 (1-0.8)^2+0.1^2+0.1^2=0.06 (1−0.8)2+0.12+0.12=0.06,而后者误差是0.065。
而在这个实际问题中,类别“猫”和“豹”的距离确实小于类别“猫”和“狗”。也就是说,均方误差引导优化目标朝着平均化“豹”和“狗”两个类别的方向进行,这种引导是错误的。
而交叉熵只关注样本的真实类别,对于两种错误预测,误差都是 − ln 0.8 -\ln{0.8} −ln0.8,没有额外的倾向性。
2. 交叉熵损失函数可以避免梯度消失的问题。
均方误差应用于SoftMax或者Sigmoid函数输出时,当分类完全错误时与分类完全正确时一样梯度极小,不利于进行数值优化。
对于Sigmoid函数的情况,Sigmoid函数两端有着非常平坦的区域,一旦落入这些区域,训练过程就变得极其缓慢。而无论结果极端正确或者极端错误,都会落入两端平坦的区域,一旦陷入“极端错误”,误差函数就难以引导模型朝着正确的方向进行优化。
对于SoftMax的情况,假设第 k k k个类别的Soft Max输入为 z k = ω k T x ( i ) z_k=\omega_k^Tx_{(i)} zk=ωkTx(i),输出为 y k = e z k / ∑ k ′ e z k ′ y_k=e^{z_k}/\sum_{k'}{e^{z_{k'}}} yk=ezk/∑k′ezk′,那么,输出的导数如下:
∂ y k ∂ z k = e z k ∑ k ′ e z k ′ − ( e z k ) 2 ( ∑ k ′ e z k ′ ) 2 = y k ( 1 − y k ) \begin{align} \frac{\partial y_k}{\partial z_k} & = \frac{e^{z_k}\sum_{k'}^{}e^{z_{k'}} - (e^{z_k})^2 } {(\sum_{k'}^{}e^{z_{k'}})^2 }\\ & = y_k(1-y_k) \end{align} ∂zk∂yk=(∑k′ezk′)2ezk∑k′ezk′−(ezk)2=yk(1−yk)
当 k k k是样本的真实类别而 y k = 0 y_k=0 yk=0时,梯度会消失。交叉熵损失函数可以避免这个问题, y k y_k yk这一项在链式求导的过程中被约掉了。
下面时交叉熵误差的梯度,
∂ ( − ln y k ) ∂ z k = ∂ ( − ln y k ) ∂ y k ⋅ ∂ y k ∂ z k = − 1 y k ⋅ y k ( 1 − y k ) = y k − 1 \begin{align} \frac{\partial (-\ln{y_k})}{\partial z_{k}} & = \frac{\partial (-\ln{y_k})}{\partial y_{k}}\cdot \frac{\partial y_k}{\partial z_k } \\ & =- \frac{1}{y_k} \cdot y_k(1-y_k) \\ & =y_k-1 \end{align} ∂zk∂(−lnyk)=∂yk∂(−lnyk)⋅∂zk∂yk=−yk1⋅yk(1−yk)=yk−1
可见上式中, y k y_k yk越小,梯度绝对值越大,符合我们的期望。
而采用均方误差时,梯度消失的问题无法解决:
∂ [ ( 1 − y k ) 2 ] ∂ z k = ∂ [ ( 1 − y k ) 2 ] ∂ y k ⋅ ∂ y k ∂ z k = 2 ( y k − 1 ) ⋅ y k ( 1 − y k ) = − 2 y k ( y k − 1 ) 2 \begin{align} \frac{\partial [(1-y_k)^2]}{\partial z_k} & = \frac{\partial [(1-y_k)^2]}{\partial y_k} \cdot \frac{\partial y_k}{\partial z_k } \\ &=2(y_k-1) \cdot y_k(1-y_k) \\ &=-2y_k(y_k-1)^2 \end{align} ∂zk∂[(1−yk)2]=∂yk∂[(1−yk)2]⋅∂zk∂yk=2(yk−1)⋅yk(1−yk)=−2yk(yk−1)2
使用均方误差时,若真实类别对应的SoftMax输出接近于0,我们无法依赖梯度迅速提高该类别的输出值,只能寄希望于其他类别的输出在梯度的引导下减小,使得这是你hi类别的SoftMax输出能够相对提高。这导致训练的进度大大放缓。
因此,对于分类问题,应该采用逻辑斯蒂回归,使用交叉熵损失函数引导模型向正确的方向优化。
五、分类器的决策边界
我们分别用花萼长度和宽度单独预测花的类别,0表示山鸢尾,1表示杂色鸢尾,可以看出中间有一些模糊地带无法区分,概率曲线比较平滑。当同时使用两个特征进行分类的时候,预测出的是一个概率曲面。可以看到曲面更加陡峭一些,因为从两个特征维度同时来看,花的种类变得更加容易区分了。
一般来说,对每一个要预测其类别的样本,分类器需要给出一个类别作为输出。当采用逻辑斯蒂回归模型作为分类器的时候,对于二分类问题,可以把属于某一类别的概率等于0.5(即对数几率为0)作为分类的界限。由于对数几率与样本特征呈线性关系,所以概率为0.5的界面是样本特征构成的空间中的一个超平面。我们把这样的超平面称作逻辑斯蒂回归模型的决策边界。在鸢尾花分类这个问题上,特征只有两个维度,在特征平面上,决策边界表现为一条直线.
感知机模型和逻辑斯蒂回归在分类问题上是等效的。所以,感知机模型的决策边界也是线性的。这些决策边界是线性的分类模型都叫做线性分类器。
有一些模型的决策边界是非线性的,比如决策树。决策树每次取一个特征对样本的特征空间进行垂直于坐标轴的分割,然后对分割的两侧进一步做递归的分割,这样就形成了决策树特有的决策边界形式。
真实世界的数据分类经常需要非线性分类器。非线性分类器可以通过线性分类器组合得到。比如,决策树是对单个分支(决策树桩或者单层决策树)进行组合得到的。后面我们还会看到,把感知机进行级联得到神经网络,就可以实现非线性分类。另外一种实现非线性分类的方法是对样本空间进行变换。我们已经看到,当单独采用花萼长度或者宽度的时候,都不能用线性模型实现鸢尾花的分类,而同时使用这两个特征,就可以进行线性分类。一些样本在低维特征空间里是线性不可分的,而在高维特征空间里就是线性可分的。除了增加特征数量之外,还可以将低维特征通过变换映射到高维空间,支持向量机就是采用这一方法的代表。
六、代码实践
使用逻辑斯蒂回归
加载鸢尾花数据集,一共由3种鸢尾花,这里仅采用两种鸢尾花进行二分类。鸢尾花的特征也仅采用前两种特征,即花萼长度和花萼宽度。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :demo1
@File :LogisticRegresion.py
@IDE :PyCharm
@Author :Yue
@Date :2024-03-21 11:23
'''import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression# 加载鸢尾花数据集
iris = datasets.load_iris()# 只使用类别 0 和类别1
index = iris.target < 2
# 只使用花萼长度 和 花萼宽度这两个特征
X = iris.data[index,:2]
Y = iris.target[index]# 建立逻辑斯蒂回归模型
classifier = LogisticRegression()
classifier.fit(X,Y)# 计算分类正确率
y = classifier.predict(X)
error = np.mean(np.abs(y-Y))
print(error)
可见能够正确分类。
观察分类边界
# 输出权值向量
print(classifier.coef_)
# 输出偏置参数
print(classifier.intercept_)
接下来我们绘制出这个分类边界。
import matplotlib.pyplot as plt# 建立一个二维网格
# 计算所有网格点对应的预测值
xx,yy = np.meshgrid(np.arange(X[:,0].min()-0.5 ,X[:,0].max()+0.5 ,0.1),np.arange(X[:,1].min()-0.5 ,X[:,1].max()+0.5 ,0.1)
)# 将网格点组织为二维输入样本
input = np.concatenate((xx.reshape((-1,1)) ,yy.reshape((-1,1))), axis=1
)# 计算出模型的预测结果
# 然后重新组织为网格点对应的位置
z = classifier.predict(input)
z = z.reshape(xx.shape)# 将网格点的预测结果显示出来
# 这样就可以观察到分类边界
plt.figure(figsize=(4,3))
plt.pcolormesh(xx,yy,z,cmap=plt.cm.Paired)# 同时叠加显示两个类别的样本点
for i in range(2):index = Y == imark = 'kx' if i == 0 else 'k+'plt.plot(X[index,0], X[index,1],mark)
plt.show()
这里解释一下上面的绘图代码:
这部分代码的目的是使用matplotlib
库来可视化逻辑斯蒂回归模型的决策边界。以下是详细步骤的解释:
-
建立二维网格:首先,代码使用
np.meshgrid
函数创建了一个二维网格。这个函数接受两个一维数组作为输入,这两个数组分别代表x轴和y轴上的所有点。在这个例子中,np.arange
函数用于生成x轴和y轴上的点,这些点的范围是从X
特征的最小值减去0.5到最大值加上0.5,步长为0.1。这样,我们就得到了一个覆盖了特征空间的网格,每个网格点都有一个对应的(x, y)坐标。 -
组织二维输入样本:接下来,代码将二维网格点的x和y坐标合并成一个二维数组
input
,这个数组的形状是网格点数量乘以2。这是通过np.concatenate
函数实现的,它将xx
和yy
两个数组沿着第二个维度(axis=1)拼接起来。这样,每一行代表一个网格点的(x, y)坐标。 -
计算模型预测结果:然后,使用训练好的逻辑斯蒂回归模型
classifier
对input
数组中的每个点进行预测。由于predict
方法接受的是二维数组,所以需要将input
数组重新调整为二维形状,这通过reshape
方法完成。预测结果存储在变量z
中,它是一个一维数组,包含了每个网格点的预测类别。 -
重新组织预测结果:为了将预测结果可视化,需要将一维的
z
数组重新组织成与网格点对应的二维形状。这通过z.reshape(xx.shape)
实现,它将z
数组重塑成与xx
和yy
数组相同的形状。 -
可视化决策边界:使用
plt.figure
创建一个新的图形窗口,并设置大小为4x3英寸。然后,使用plt.pcolormesh
函数将网格点的预测结果绘制成颜色图(pcolormesh)。这个函数接受x轴和y轴的坐标数组以及颜色值数组作为输入,并将这些信息绘制到图形上。cmap=plt.cm.Paired
指定了使用的颜色映射,这里使用的是Paired颜色映射,它提供了一组搭配良好的颜色。 -
叠加样本点:最后,代码遍历两个类别,使用
plt.plot
函数将原始数据点叠加到图形上。对于每个类别,它找到对应的索引,然后根据类别选择不同的标记样式('kx’表示黑色的叉号,'k+'表示黑色的加号)来绘制这些点。 -
显示图形:最后,调用
plt.show()
函数来显示最终的图形,这样用户就可以看到模型的决策边界以及数据点在特征空间中的分布情况。
总结
这一章学习了逻辑斯蒂回归的两个重要改进:SoftMax函数和交叉熵的损失函数。数学推导过程需要反复理解,交叉熵函数就是逻辑斯蒂模型的最大似然概率的相反数,需要多理解一下两者的关系。