02-12 Logistic(逻辑)回归

*爱你&永不变心* 提交于 2020-02-26 23:29:50

逻辑回归

  虽然逻辑回归的名字里有“回归”两个字,但是它并不是一个回归算法,事实上它是一个分类算法。

在这里插入图片描述

逻辑回归学习目标

  1. 二元逻辑回归的目标函数
  2. 最小化二元逻辑回归目标函数
  3. 二元逻辑回归的正则化
  4. 多元逻辑回归
  5. 逻辑回归的流程
  6. 逻辑回归的优缺点

逻辑回归引入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1O9UxwXA-1582719512430)(…/新配图/恶搞图/06-09-操场2.jpg)]

  曾经在感知机引入时我们讲过,操场上男生和女生由于受传统思想的影响,男生和女生分开站着,并且因为男生和女生散乱在操场上呈线性可分的状态,因此我们总可以通过感知机算法找到一条直线把男生和女生分开,并且最终可以得到感知机模型为
f(x)=sign((w)Tx) f(x)=sign((w^*)^Tx)
  如果你细心点会发现,由于感知模型使用的是sign函数,如果当计算一个样本点wTx=0.001w^Tx=0.001的时候,sign(wTx)=1sign(w^Tx)=1,即该函数会把该样本归为11,但是为什么他不能是00类呢?并且由于sign函数在x=0x=0处有一个阶跃,即函数不连续,该函数在数学上也是不方便处理的。

  由此逻辑函数使用sigmoid函数对wTxw^Tx做处理,并且把sigmoid函数得到的值y^\hat{y}当成概率进行下一步处理,这也正是逻辑回归对感知机的改进。

  上述整个过程其实就是逻辑回归一步一步被假想出来的的一个过程,接下来将从理论层面抽象的讲解逻辑回归。

# 感知机引入图例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

np.random.seed(1)
x1 = np.random.random(20)+1.5
y1 = np.random.random(20)+0.5
x2 = np.random.random(20)+3
y2 = np.random.random(20)+0.5

# 一行二列第一个
plt.subplot(121)
plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')
plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')
plt.vlines(2.8, 0, 2, colors="r", linestyles="-", label='$wx+b=0$')
plt.title('线性可分', fontproperties=font, fontsize=20)
plt.xlabel('x')
plt.legend(prop=font)

# 一行二列第二个
plt.subplot(122)
plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')
plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')
plt.scatter(3.5, 1, s=50, color='b')
plt.title('线性不可分', fontproperties=font, fontsize=20)
plt.xlabel('x')
plt.legend(prop=font)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VcOykQOh-1582719512430)(02-12%20Logistic%28%E9%80%BB%E8%BE%91%29%E5%9B%9E%E5%BD%92_files/02-12%20Logistic%28%E9%80%BB%E8%BE%91%29%E5%9B%9E%E5%BD%92_6_0.png)]

在这里插入图片描述

逻辑回归详解

线性回归与逻辑回归

  线性回归的假设函数为
y^=ωTx \hat{y} = \omega^Tx
此时的y^\hat{y}是连续值,所以它是一个回归模型,如果y^\hat{y}是离散值呢?

  可能你已经想到了,对假设函数得到的连续值再做一次转换,即g(y^)g(\hat{y}),并且令g(y^)g(\hat{y})函数值在y^\hat{y}属于某个区间时为c1c_1类;y^\hat{y}属于另一个区间时为c2c_2类,这样就能得到一个二元分类模型。

在这里插入图片描述

二元逻辑回归的假设函数

  上一节讲到对线性回归的结果通过函数gg做一次转换即可得逻辑回归。在逻辑回归当中函数gg通常使用Sigmoid函数替代,即函数gg
g(z)=11+ez g(z) = {\frac{1}{1+e^{-z}}}

让步比

在这里插入图片描述

  让步比可以理解成有利于某一特定事件的概率,可以定义为
p1p {\frac{p}{1-p}}
  在已知二分类问题的情况下每个分类的概率分别为yi^\hat{y_i}1yi^1-\hat{y_i},可以定义logit函数,即让步比的对数形式(log-odds)为
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \log{it}(\hat{…
其中logit(p)\log{it}(p)函数等于事件发生的概率除以不发生的概率取对数,即表示特征值和对数概率之间的线性关系。

  然而特征值和对数概率之间的线性关系并不重要,重要的是预测值与它发生的概率的关系,即让步比的逆形式,也就是上述说到的Sigmoid函数。
wTx=logp1pewTx=p1pp=11+ewTx w^Tx = \log{\frac{p}{1-p}} \\ e^{w^Tx} = {\frac{p}{1-p}} \\ p = {\frac{1}{1+e^{-w^Tx}}} \\

Sigmoid函数图像

# Sigmoid函数图像图例
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline


def sigmoid(z):
    return 1 / (1 + np.exp(-z))


ax = plt.subplot(111)

# 描绘十字线
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))

z = np.linspace(-10, 10, 256)
hat_y = sigmoid(z)
plt.plot(z, hat_y, c='r', label='Sigmoid')

# 描绘y=0.5和y=1.0两条直线
plt.yticks([0.0, 0.5, 1.0])
ax = plt.gca()
ax.yaxis.grid(True)

plt.xlabel('z')
plt.ylabel('$\hat{y}$')
plt.legend()
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tSJ8QVB3-1582719512432)(02-12%20Logistic%28%E9%80%BB%E8%BE%91%29%E5%9B%9E%E5%BD%92_files/02-12%20Logistic%28%E9%80%BB%E8%BE%91%29%E5%9B%9E%E5%BD%92_15_0.png)]

  上图为Sigmoid函数图像,可以看出当zz趋于正无穷时,g(z)g(z)趋于1;当zz趋于负无穷时,g(z)g(z)趋于0,这个属性非常适合上述所说的分类模型。

  因此可以把线性函数的假设函数看成是Sigmoid函数的自变量,即逻辑回归的假设函数为
y^=11+eωTx \hat{y} = {\frac{1}{1+e^{-\omega^Tx}}}
  虽然改变了逻辑回归的假设函数,但是Sigmoid函数的输出值是(0,1)(0,1)范围内的连续值,并不是二元分类模型想要的二元离散值,因此需要对逻辑回归的假设函数做进一步处理,即
{y^>0.5ωTx>0,y=1y^<0.5ωTx<0,y=0 \begin{cases} \hat{y}>0.5即\omega^Tx>0, \quad y=1 \\ \hat{y}<0.5即\omega^Tx<0, \quad y=0 \\ \end{cases}
如果y^=0.5ωTx=0\hat{y}=0.5即\omega^Tx=0,不在逻辑回归模型的讨论范围内,一般而言视具体情况而定。

二元逻辑回归的目标函数

  得到了逻辑回归的假设函数,则需要通过最小化目标函数即最小化误差找到最合适的参数ω\omega

  由于线性回归是预测连续值的模型,因此可以使用均方误差代价函数。但是逻辑回归是预测离散值的模型,因此可以使用极大似然估计推导出逻辑回归的目标函数。

  上一节假设逻辑回归的输出为类别00或类别11,用概率表达方式为
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ & p(y=1|x,\ome…
  由于yy只可能是0011,则可以把上述两个公式联立可得yy的概率分布函数表达式
p(yx,ω)=(π(x))y(1π(x))(1y) p(y|x,\omega) = (\pi(x))^y(1-\pi(x))^{(1-y)}
  通过yy的概率分布函数表达式即可得似然函数为
L(ω)=i=1m[π(xi)]yi[(1πxi)](1yi) L(\omega) = \prod_{i=1}^m [\pi(x_i)]^{y_i}[(1-\pi{x_i})]^{(1-y_i)}
其中mm为样本的个数。

  通过似然函数得到对数似然函数即目标函数(注:该目标函数与交叉熵损失函数的形式一致,二元逻辑回归可以理解为交叉熵损失函数两个类变量的特殊形式,为
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ J(\omega) & = …
J(ω)J(\omega)求极大值,即可得到ω\omega的估计值。

  一般采用梯度上升法或拟牛顿法求解ω\omega的估计值。

不同样本分类的代价

  逻辑回归的目标函数为
J(ω)=i=1m[yilogπ(xi)+(1yi)log(1π(xi))] J(\omega) = \sum_{i=1}^m [y_i\log\pi(x_i)+(1-y_i)\log(1-\pi(x_i))]
  对于二分类问题,可以求出y=1y=1y=0y=0的代价函数
J(ω)={logπ(x)ify=1log(1π(x))ify=0 J(\omega) = \begin{cases} -\log\pi(x) \quad if y=1 \\ -\log(1-\pi(x)) \quad if y=0 \\ \end{cases}

# 不同样本实例分类的代价图例
def cost_1(z):
    return -np.log(sigmoid(z))


def cost_0(z):
    return -np.log(1-sigmoid(z))


z = np.linspace(-10, 10, 256)
pi_x = sigmoid(z)
c1 = [cost_1(i) for i in z]
c0 = [cost_0(i) for i in z]
plt.plot(pi_x, c1, c='r', linestyle='--',
         label='$J(\omega), \quad if \quad y=1$')
plt.plot(pi_x, c0, c='g', label='$J(\omega), \quad if \quad y=0$')
plt.xlabel('$\pi(x)$')
plt.ylabel('$J(\omega)$')
plt.legend()
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OsbQAnG1-1582719512432)(02-12%20Logistic%28%E9%80%BB%E8%BE%91%29%E5%9B%9E%E5%BD%92_files/02-12%20Logistic%28%E9%80%BB%E8%BE%91%29%E5%9B%9E%E5%BD%92_21_0.png)]

  上图可以看出如果正确地预测样本属于第11类,代价会接近0(虚线);如果正确的预测y=0y=0(实线),代价也会接近0。如果预测错误,代价则会趋近于无穷大,即用越来越大的代价惩罚错误的预测。

在这里插入图片描述

二元逻辑回归目标函数最大化

梯度上升法

  二元逻辑回归的目标函数为
J(ω)=i=1m[yilnπ(xi)+(1yi)ln(1π(xi))] J(\omega) = \sum_{i=1}^m [y_i\ln\pi(x_i)+(1-y_i)\ln(1-\pi(x_i))]
  得到二元逻辑回归的目标函数,我们需要最大化似然函数,即最大化二元逻辑回归的目标函数。

  目标函数对ω\omega的偏导为
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ {\frac{\partia…
其中ii为第ii个样本,jj为第jj个特征。

  逻辑回归参数的学习规则为
ωj=ωj+αi=1m(yig(ωTxi))xi(j) \omega_j = \omega_j + \alpha{\sum_{i=1}^m (y_i - g(\omega^Tx_i)){x_i}^{(j)}}

线性回归和逻辑回归的参数更新

  线性回归的参数学习公式为
ωj=ωjαi=1m(yih(ωTxi))xi(j) \omega_j = \omega_j - \alpha{\sum_{i=1}^m (y_i - h(\omega^Tx_i)){x_i}^{(j)}}
  逻辑回归的参数学习公式为
ωj=ωj+αi=1m(yig(ωTxi))xi(j) \omega_j = \omega_j + \alpha{\sum_{i=1}^m (y_i - g(\omega^Tx_i)){x_i}^{(j)}}
  从上述两个参数学习公式可以看出线性回归和逻辑回归的参数更新方式有着相同的公式,但是由于线性回归是最小化目标函数,而逻辑回归是最大化似然函数即最大化目标函数,因此线性回归是梯度下降法、逻辑回归是梯度上升法,曾经也讲过其实梯度下降法和梯度上升法可以转换。

拟牛顿法

  收敛速度更快,但是如果特征维度较大计算时间漫长。

二元逻辑回归模型

  假设求得逻辑回归参数为为ωT\omega^T,则二元逻辑回归模型为
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ & p(y=1|x) = {…

在这里插入图片描述

二元逻辑回归的正则化

L1正则化

  二元逻辑回归的L1正则化与普通线性回归的L1正则化类似,增加了L1范数作为惩罚,即
J(ω)=i=1m[yi(ωxiln(1+exp(ω(xi))]+λω1 J(\omega) = \sum_{i=1}^m [y_i(\omega{x_i} - \ln(1+exp(\omega(x_i))] + \lambda||\omega||_1
  二元逻辑回归L1正则化目标函数常用的优化方法有坐标轴下降和最小角回归。

L2正则化

  二元逻辑回归的L2正则化与普通线性回归的L2正则化类似,增加了L2范数作为惩罚,即
J(ω)=i=1m[yi(ωxiln(1+exp(ω(xi))]+12λω2 J(\omega) = \sum_{i=1}^m [y_i(\omega{x_i} - \ln(1+exp(\omega(x_i))] + {\frac{1}{2}}\lambda||\omega||_2

在这里插入图片描述

多元逻辑回归

在这里插入图片描述

  上面介绍的逻辑回归都是二元分类模型,用于二分类问题,可以使用以下三种方法将其推广为多元逻辑回归。OvR和MvM主要是对数据做处理,这里不介绍其具体过程。而Softmax回归则是优化模型,因此主要讲解Softmax回归。

OvR

  假设一个数据集DDc1,c2,,ckc_1,c_2,\ldots,c_kkk个类别,则可以把c1c_1看成一个类别,把c2,c3,,ckc_2,c_3,\ldots,c_k看成另外一个类别,即把DD分为两个子集,把多分类问题则变成了关于c1c_1c2,c3,,ckc_2,c_3,\ldots,c_k的二分类问题,然后对含有多个类别的子集再次使用OvR方法,直至无法分类为止。通常这种方法称为OvR(One-vs-Rest)。

MvM

  假设一个数据集DDc1,c2,,ckc_1,c_2,\ldots,c_kkk个类别,则可以先把c1,c2,,ci,i<kc_1,c_2,\ldots,c_i, \quad i<k看成一个类别,把ci,ci+1,,ckc_i,c_{i+1},\ldots,c_k看成另外一个类别,即把DD分为两个子集,多分类问题则变成了关于c1,c2,,cic_1,c_2,\ldots,c_ici,ci+1,,ckc_i,c_{i+1},\ldots,c_k的二分类问题,然后对两个子集再次使用MvM方法,直至无法分类为止。通常这种方法称为MvM(Many-vs-Many)。

  如果每次只选择两个个类别进行分类的话,则该方法称为OvO(One-vs-One),一般情况下首先考虑使用OvO。

在这里插入图片描述

逻辑回归流程

输入

  有mm个实例nn维特征的数据集
T={(x1,y1),(x2,y2),,(xm,ym)} T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
其中xix_i是实例的特征向量即(xi(1),xi(2),,xi(n))({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})

输出

  ω\omega和二元逻辑回归模型。

流程

  1. 选取初值ω=0\omega=0
  2. 训练集中选取数据(xi,yi)(x_i,y_i),对ω\omega使用梯度上升更新
    ω=ω+α(yig(ωTxi))xi(j) \omega = \omega + \alpha(y_i - g(\omega^Tx_i)){x_i}^{(j)}
  3. 重复步骤2,直至ω\omega收敛停止更新
  4. 得到最小化的目标函数J(ω)J(\omega),同时可以得到最优的ω\omega^*,二元逻辑回归模型为
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ & p(y=1|x) = {…

逻辑回归优缺点

优点

  1. 由于计算量只和特征的数目有关,训练速度相较其他的分类器例如支持向量机快
  2. 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大
  3. 可以手动调整阈值(并不一定要0.5),输出结果可以手动调节控制,灵活

缺点

  1. 因为类似线性回归很容易欠拟合,分类精度不高
  2. 假设数据分类严重不平衡,例如1:10000,则分类时会有倾向问题
  3. 逻辑回归本身无法筛选特征,通常通过GBDT筛选特征后再使用逻辑回归

小结

  逻辑回归引入时说到逻辑回归一定程度上也是基于感知机演化而来,在替换sigmoid函数的同时,将sigmoid函数得到的值转换为概率的形式,进而可以最大化似然函数得到最优ww^*,这也是逻辑回归的巧妙之处,但是两者还是换汤不换药,都是基于特征的线性模型分类。

  由于感知机、线性回归和逻辑回归都和线性模型有一定的关系,因此放在一起讲,下面将会将一个单独的算法,它从理论上而言是最简单易懂的一个算法,即k近邻算法。

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!