【机器学习入门 】逻辑斯蒂回归和分类

系列文章目录

第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 1p。将回归模型的预测值记作 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=ln1pp
这个关系将[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=ln1pp=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+et1=σ(b+ω1x1+ω2x2+)
注:
Sigmoid函数形式如下:
σ ( t ) = ( 1 + e − t ) − 1 \sigma(t)=(1+e^{-t})^{-1} σ(t)=(1+et)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)} 1p(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)+(1y(i))(1p(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)+(1y(i))(1p(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(ω)=iy(i)lnp(i)+(1y(i))ln(1p(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)=tq(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,,K1} 表示各个类别的编号。 i i i表示样本编号, y ( i ) ∈ { 0 , 1 , ⋯   , K − 1 } y_{(i)} \in \left\{ 0,1,\cdots ,K-1\right \} y(i){0,1,,K1} 表示训练样本的真实类标签, y ^ ( i ) ∈ { 0 , 1 , ⋯   , K − 1 } \hat{y}_{(i) }\in \left\{ 0,1,\cdots ,K-1\right \} y^(i){0,1,,K1} 表模型预测出样本 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,,K1,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=0K1Pr(y^(i)=k)=Pr(y^(i)=0)+K=1K1Pr(y^(i)=k)=Pr(y^(i)=0)+K=1K1Pr(y^(i)=0)eωkTx(i)=Pr(y^(i)=0)(1+k=1K1eω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=1K1eω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=1K1eωkTx(i)eωkTx(i)

归一化指数函数

为计算方便,我们为基准类别0增加一组冗余的逻辑斯蒂回归参数。于是,对于所有类别 k = 0 , 1 , ⋯   , K − 1 k=0,1,\cdots,K-1 k=0,1,,K1,概率都可以写成一致的形式。我们把这个计算形式称作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=0K1eωkTx(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=0K1q(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,,ωK1)=lniPr(y^(i)=y(i))=ilnPr(y^(i)=y(i))=iln(k=0K1eω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 (10.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/kezk,那么,输出的导数如下:
∂ 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} zkyk=(kezk)2ezkkezk(ezk)2=yk(1yk)
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)zkyk=yk1yk(1yk)=yk1
可见上式中, 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[(1yk)2]=yk[(1yk)2]zkyk=2(yk1)yk(1yk)=2yk(yk1)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 == i
    mark = 'kx' if i == 0 else 'k+'
    plt.plot(X[index,0], X[index,1],mark)
plt.show()

在这里插入图片描述
这里解释一下上面的绘图代码:
这部分代码的目的是使用matplotlib库来可视化逻辑斯蒂回归模型的决策边界。以下是详细步骤的解释:

  1. 建立二维网格:首先,代码使用np.meshgrid函数创建了一个二维网格。这个函数接受两个一维数组作为输入,这两个数组分别代表x轴和y轴上的所有点。在这个例子中,np.arange函数用于生成x轴和y轴上的点,这些点的范围是从X特征的最小值减去0.5到最大值加上0.5,步长为0.1。这样,我们就得到了一个覆盖了特征空间的网格,每个网格点都有一个对应的(x, y)坐标。

  2. 组织二维输入样本:接下来,代码将二维网格点的x和y坐标合并成一个二维数组input,这个数组的形状是网格点数量乘以2。这是通过np.concatenate函数实现的,它将xxyy两个数组沿着第二个维度(axis=1)拼接起来。这样,每一行代表一个网格点的(x, y)坐标。

  3. 计算模型预测结果:然后,使用训练好的逻辑斯蒂回归模型classifierinput数组中的每个点进行预测。由于predict方法接受的是二维数组,所以需要将input数组重新调整为二维形状,这通过reshape方法完成。预测结果存储在变量z中,它是一个一维数组,包含了每个网格点的预测类别。

  4. 重新组织预测结果:为了将预测结果可视化,需要将一维的z数组重新组织成与网格点对应的二维形状。这通过z.reshape(xx.shape)实现,它将z数组重塑成与xxyy数组相同的形状。

  5. 可视化决策边界:使用plt.figure创建一个新的图形窗口,并设置大小为4x3英寸。然后,使用plt.pcolormesh函数将网格点的预测结果绘制成颜色图(pcolormesh)。这个函数接受x轴和y轴的坐标数组以及颜色值数组作为输入,并将这些信息绘制到图形上。cmap=plt.cm.Paired指定了使用的颜色映射,这里使用的是Paired颜色映射,它提供了一组搭配良好的颜色。

  6. 叠加样本点:最后,代码遍历两个类别,使用plt.plot函数将原始数据点叠加到图形上。对于每个类别,它找到对应的索引,然后根据类别选择不同的标记样式('kx’表示黑色的叉号,'k+'表示黑色的加号)来绘制这些点。

  7. 显示图形:最后,调用plt.show()函数来显示最终的图形,这样用户就可以看到模型的决策边界以及数据点在特征空间中的分布情况。

总结

这一章学习了逻辑斯蒂回归的两个重要改进:SoftMax函数和交叉熵的损失函数。数学推导过程需要反复理解,交叉熵函数就是逻辑斯蒂模型的最大似然概率的相反数,需要多理解一下两者的关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/481592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker (一)

1&#xff0c;什么是docker 首先我们可以好好的看看docker的那个可能的图标&#xff0c;你想象到了什么&#xff1f; ... docker是一个开源的应用容器引擎&#xff0c;有Docker公司&#xff08;前dotCloud公司&#xff09;开发&#xff0c;基于Apache2.0开源授权协议发行。该…

网络工程师笔记15(OSPF协议-2)

OSPF协议 OSPF是典型的链路状态路由协议&#xff0c;是目前业内使用非常广泛的 IGP 协议之一。 Router-ID(Router ldentifier&#xff0c;路由器标识符)&#xff0c;用于在一个 OSPF 域中唯一地标识一台路由器。Router-ID 的设定可以通过手工配置的方式&#xff0c;或使用系统自…

吴恩达机器学习笔记 二十七 决策树中连续值特征的选择 回归树

还是猫狗分类的案例&#xff0c;假如再增加一个特征weight&#xff0c;该值是一个连续的值&#xff0c;如何在决策树中使用该特征&#xff1f; 如下图所示&#xff0c;尝试不同的阈值&#xff0c;如 weight<9 , 此时左边有四个样本&#xff0c;都为猫&#xff0c;右边有六个…

c语言--内存函数的使用(memcpy、memcmp、memset、memmove)

目录 一、memcpy()1.1声明1.2参数1.3返回值1.4memcpy的使用1.5memcpy模拟使用1.6注意 二、memmove()2.1声明2.2参数2.3返回值2.4使用2.5memmove&#xff08;&#xff09;模拟实现 三、memset3.1声明3.2参数3.3返回值3.4使用 四、memcmp()4.1声明4.2参数4.3返回值4.4使用 五、注…

Android视角看鸿蒙第八课(module.json5中的各字段含义之abilities)下

Android视角看鸿蒙第八课(module.json5中的各字段含义之abilities&#xff09;下 导读 上篇文章开始学习abilities下的各字段含义&#xff0c;因为篇幅原因只学习了name、srcEntry、description、icon和label字段的含义和用法&#xff0c; 这篇文章继续学习和了解其他字段。 …

二叉树|106.从中序与后序遍历序列构造二叉树

力扣题目链接 class Solution { private:TreeNode* traversal (vector<int>& inorder, vector<int>& postorder) {if (postorder.size() 0) return NULL;// 后序遍历数组最后一个元素&#xff0c;就是当前的中间节点int rootValue postorder[postorder.…

二分查找法总结

目录 1、思路讲解&#xff08;LC704&#xff09;2、代码思路讲解&#xff08;循环不变量&#xff09;&#xff08;1&#xff09; 左闭右闭&#xff08;2&#xff09;左闭右开&#xff08;3&#xff09;总结&#xff1a;左开右闭和左闭右开&#xff08;4&#xff09;复杂度分析 …

TCP和UDP 传输层协议的区别

TCP协议 当一台计算机想要与另一台计算机通讯时&#xff0c;两台计算机之间的通信需要畅通且可靠&#xff0c;这样才能保证正确收发数据。例如&#xff0c;当你想查看网页或查看电子邮件时&#xff0c;希望完整且按顺序查看网页&#xff0c;而不丢失任何内容。当你下载文件时&…

Docker学习笔记 - 基本概念

一. 什么是“容器”&#xff08;container&#xff09;和“镜像”&#xff08;Image&#xff09; 所谓“容器”可以理解为一个模拟操作系统的虚拟层&#xff0c;大部分是基于Linux的&#xff0c;应用程序及其配置信息&#xff0c;依赖库可以打包成一个Image独立运行在这个虚拟…

nvidia显卡如何安装cuda驱动

目录 查看显卡对应的cuda版本下载与你显卡匹配的CUDA Toolkit 查看显卡对应的cuda版本 按 微软 R 键&#xff0c;输入cmd 然后输入 nvidia-smi &#xff0c;回车显示下面信息&#xff1a; 看到 CUDA Version 为 12.2 下载与你显卡匹配的CUDA Toolkit 打开网页&#xff1a…

【竞技宝】DOTA2:梦幻联赛预spirit惨遭淹死 LGD不敌KEV

北京时间2024年3月23日,近期各大赛区的一线战队参加的比赛暂时告一段落,目前关注度最高的比赛是正在进行的梦幻联赛S23预选赛,本以为各大战队能够在实力差距明显的预选赛中轻松突围,没想到本次预选赛目前为止却是冷门频出。 近日,梦幻联赛S23的东欧区预选赛已经全部结束,最终NA…

C语言----动态内存

学到这里了&#xff0c;大家应该对C语言的了解跟深一层了吧。我们C语言写代码不能只局限于直接写代码。我们要了解C语言的内存分布&#xff0c;我们都知道C语言的内存是有堆区&#xff0c;栈区&#xff0c;静态区的。然后栈区是我们平常创建临时变量存储的地方&#xff0c;静态…

3.23项目:聊天室

1、 基于UDP的网络聊天室 项目需求&#xff1a; 如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息如果有人下线&#xff0c;其他用户可以收到这个人的下线信息服务器可以发送系统信息 服务器 #inc…

四年蓄势,TikTok决定硬刚

在X平台&#xff08;原推特&#xff09;上线的一则视频里&#xff0c;周受资看起来又焦急&#xff0c;又强硬。他的眉毛扭到了一起&#xff0c;完全不像去年那个在美国国会听证会上&#xff0c;接受了5小时高压问询&#xff0c;仍风度翩翩的跨国公司CEO。 “过去几年来&#x…

js数据流详细讲解

文章目录 单向数据流单向数据流示例: 双向数据流双向数据流示例: 延伸和扩展状态管理Redux 示例&#xff1a; 异步数据流异步操作示例&#xff08;使用 async/await&#xff09;&#xff1a; 数据转换和处理数据处理示例&#xff08;使用 lodash&#xff09;&#xff1a; 实时数…

解决大型多模态模型的幻觉问题,新方法AITuning助力AI更可靠

引言&#xff1a;多模态对话幻觉的挑战 在人工智能领域&#xff0c;开发能够通过视觉和语言等多种渠道与人类互动的通用助手是一个重要问题。受到大型语言模型&#xff08;LLMs&#xff09;如ChatGPT的显著成功的启发&#xff0c;研究社区对开发能够支持视觉-语言指令的多模态助…

力扣热门算法题 75. 颜色分类,76. 最小覆盖子串,77. 组合

75. 颜色分类&#xff0c;76. 最小覆盖子串&#xff0c;77. 组合&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.21 可通过leetcode所有测试用例。 目录 75. 颜色分类 解题思路 完整代码 Python Java 76. 最小覆盖子串 解…

六.排序nb三人组(快速排序)

目录 17-快速排序原理介绍 思路: 18-快速排序代码实现 19-快速排序代码实现2 缺点: 递归的限度: 17-快速排序原理介绍 思路: --先找一个变量把 5(第一个数) 存起来, (两个箭头分别是left , right) --左边有一个空位, 发现左边的位置是给比5小的值准备的. --找比5小的值…

校招应聘流程讲解

在整个应聘流程中&#xff0c;记得保持积极的态度、认真准备面试&#xff0c;同时也要对自己的能力和经验有清晰的认识&#xff0c;这样才能在竞争激烈的校园招聘中脱颖而出&#xff0c;成功获得心仪的工作机会. 1. 校招资源获取 想要参加校招&#xff0c;首先需要获取校招资…

ROS2从入门到精通0-3:VSCode 搭建 ROS2 工程环境

目录 0 专栏介绍1 Ubuntu下安装VSCode1.1 基本安装1.2 将VSCode添加到侧边栏 2 VSCode集成相关插件3 VSCode运行ROS2环境步骤3.1 安装编译依赖项3.2 创建工作空间和源码空间3.3 启动VSCode与配置 4 测试工程环境4.1 C版本4.2 Python版本 0 专栏介绍 本专栏旨在通过对ROS2的系统…