机器学习之逻辑回归(手推公式版)

文章目录

    • 前言
    • 1. Sigmoid函数
    • 2. 模型参数估计
    • 3. 模型参数求解
      • 3.1 梯度下降法求解
      • 3.2 牛顿法求解
    • 4. 正则化
    • 5. 模型实现
    • 结束语

前言

  逻辑回归 ( L o g i s t i c (Logistic (Logistic R e g r e s s i o n ) Regression) Regression)虽冠有“回归”之名,却并不是真正意义上的回归,它其实是统计学中经典的分类方法,主要解决的是二分类问题。

  对于逻辑回归,书上说法不一,李航老师的《统计学习方法》将逻辑回归称为逻辑斯谛回归,周志华老师的西瓜书中将逻辑回归称为对数几率回归,简称对率回归,英文名亦称为Logit Regression

1. Sigmoid函数

  在线性回归这篇博客中我们介绍到线性回归模型 z = w T x + b z=\bm {w^Tx}+b z=wTx+b产生的预测值是一个实数值,对应的是连续型的变量,比如公司的股价、产品的销量等等。对于二分类问题,它的预测值是一个离散的变量,要么是0,要么是1,不会再由其他值。那么如何将线性回归模型的值变成离散的呢?这里就引入了一个连接函数 ( l i n k (link (link f u n c t i o n ) function) function)------- S i g m o i d Sigmoid Sigmoid函数。
   S i g m o i d Sigmoid Sigmoid函数是形似 S S S的函数,也称为 L o g i s t i c Logistic Logistic函数,表达式如下: y = 1 1 + e − z y=\frac {1} {1+e^{-z}} y=1+ez1  根据下面的 S i g m o i d Sigmoid Sigmoid函数函数图像,我们可以看出,该函数的输入值为 − ∞ -\infty + ∞ +\infty +,输出值为 ( 0 , 1 ) (0,1) (0,1)。这样对于任意 z = w T x + b z=\bm {w^Tx}+b z=wTx+b,通过 S i g m o i d Sigmoid Sigmoid函数,我们都能得到0到1之间的概率值,也就实现了分类。

机器学习之逻辑回归(手推公式版)_第1张图片

  更为准确的说, L o g i s t i c Logistic Logistic函数是 S i g m o i d Sigmoid Sigmoid函数最重要的代表。

  下面给出一些 S i g m o i d Sigmoid Sigmoid函数的相关性质及其证明:

机器学习之逻辑回归(手推公式版)_第2张图片

  纠正一下:把性质3里面的倒数符号 d \mathrm {d} d 改成偏倒数符号 ∂ \partial

  权值向量和输入向量依旧记作 w , x \bm w,\bm x w,x,这时,逻辑回归模型就是下面这样: P ( y = 1 ∣ x ) = e w T x + b 1 + e w T x + b P ( y = 0 ∣ x ) = 1 1 + e w T x + b P(y=1|x)=\frac {e^{\bm {w^Tx}+b}} {1+e^{\bm {w^Tx}+b}} \\ P(y=0|x)=\frac {1} {1+e^{\bm {w^Tx}+b}} P(y=1x)=1+ewTx+bewTx+bP(y=0x)=1+ewTx+b1  对于给定的输入实例 x x x,按照上述模型可以求得 P ( y = 1 ∣ x ) P(y=1|x) P(y=1x) P ( y = 0 ∣ x ) P(y=0|x) P(y=0x),通过比较两个条件概率值的大小,将实例 x x x分到概率值较大的那一类。
  一个事件的几率 ( o d d s ) (odds) (odds)是指该事件发生的概率与该事件不发生的概率的比值。如果事件发生的概率是 p p p,那么该事件的几率是 p 1 − p \frac {p} {1-p} 1pp,该事件的对数几率 ( l o g o d d s ) (log odds) (logodds) l o g i t logit logit函数是 l o g i t ( p ) = ln ⁡ p 1 − p logit(p)=\ln \frac {p} {1-p} logit(p)=ln1pp  对逻辑回归而言,上式又可以写成如下形式: ln ⁡ P ( y = 1 ∣ x ) 1 − P ( y = 1 ∣ x ) = w T x + b \ln \frac {P(y=1|x)} {1-P(y=1|x)}=\bm {w^Tx}+b ln1P(y=1x)P(y=1x)=wTx+b  也就是说,在逻辑回归模型中,输出 y = 1 y=1 y=1的对数几率是输入 x x x的线性函数,或者说,输出 y = 1 y=1 y=1的对数几率是由输入 x x x的线性函数表示的模型,即逻辑回归模型。

  对几率取对数,即对数几率。

2. 模型参数估计

  根据上述可知,在逻辑回归模型中,需要求解的参数是 w \bm w w b b b,我们可以通过极大似然估计法来估计模型参数。
  对于给定的数据集 T = { ( x 1 , y 1 ) , ( x 1 , y 1 ) , … , ( x N , y N ) } T=\{(x_1,y_1),(x_1,y_1),\dots,(x_N,y_N)\} T={ (x1,y1),(x1,y1),(xN,yN)},其中, x i ∈ R , y i ∈ { 0 , 1 } x_i \in \mathbb {R},y_i \in \{0,1\} xiR,yi{ 0,1},设 P ( y = 1 ∣ x ) = p ( x ) P ( y = 0 ∣ x ) = 1 − p ( x ) P(y=1|x)=p(x) \\[3pt] P(y=0|x)=1-p(x) P(y=1x)=p(x)P(y=0x)=1p(x),则似然函数为:
L ( w ) = ∏ i = 1 N [ p ( x i ) ] y i [ 1 − p ( x i ) ] 1 − y i L(\bm w)=\prod_{i=1}^N[p(x_i)]^{y_i}[1-p(x_i)]^{1-y_i} L(w)=i=1N[p(xi)]yi[1p(xi)]1yi   L ( w ) L(\bm w) L(w)是乘积形式,可将似然函数先取对数,转为对数似然函数:

机器学习之逻辑回归(手推公式版)_第3张图片

  这样,问题就变成了以 E ( w ) E(\bm w) E(w)为目标函数的最优化问题,似然函数 L ( w ) L(\bm w) L(w)最大化转换成了损失函数 E ( w ) E(\bm w) E(w)的最小化,然后就可以利用梯度下降法或牛顿法来求其最优解了。此时的 E ( w ) E(\bm w) E(w)称为交叉熵 ( c r o s s − e n t r o p y ) (cross-entropy) (crossentropy)损失函数,没错,交叉熵损失函数其实就是对似然函数先取对数再取相反数得到的。

3. 模型参数求解

  先求出损失函数 E ( w ) E(\bm w) E(w) w \bm w w一阶偏导数和二阶偏导数:

机器学习之逻辑回归(手推公式版)_第4张图片

3.1 梯度下降法求解

  梯度下降法要求目标函数 E ( w ) E(\bm w) E(w)是一个具有一阶连续偏导数的函数,大致求解过程为:先取适当的初值 w ( 0 ) \bm w^{(0)} w(0),不断迭代,更新 w \bm w w的值,进行目标函数的极小化,直到收敛。由于负梯度方向是使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新 w \bm w w的值,从而达到减少函数值的目的。
  设 g k \bm g_k gk E ( w ) E(\bm w) E(w) w ( k ) \bm w^{(k)} w(k)的梯度, g k = ∂ E ( w ) ∂ w \bm g_k=\frac {\partial E(\bm w)} {\partial \bm w} gk=wE(w)  则第 k + 1 k+1 k+1次迭代值 w k + 1 \bm w^{k+1} wk+1为: w k + 1 = w k + λ ( − g k ) \bm w^{k+1}=\bm w^{k}+\lambda (-\bm g_k) wk+1=wk+λ(gk)  当 ∣ ∣ g k ∣ ∣ < ϵ ||\bm g_k||<\epsilon gk<ϵ时,迭代结束,得到近似解 w ∗ = w k \bm w^*=\bm w^{k} w=wk
  当 ∣ ∣ E ( w k + 1 ) − E ( w k ) ∣ ∣ < ϵ ||E(\bm w^{k+1})-E(\bm w^{k})||<\epsilon E(wk+1)E(wk)<ϵ ∣ ∣ w k + 1 − w k ∣ ∣ < ϵ ||\bm w^{k+1}-\bm w^{k}||<\epsilon wk+1wk<ϵ时,迭代结束,得到近似解 w ∗ = w k + 1 \bm w^*=\bm w^{k+1} w=wk+1

3.2 牛顿法求解

  牛顿法要求目标函数 E ( w ) E(\bm w) E(w)是一个具有二阶连续偏导数的函数,求解过程和梯度下降法差不多,这里面引入了一个矩阵 H H H,称为黑塞矩阵 ( H e s s i a n (Hessian (Hessian m a t r i x ) matrix) matrix)
  设 g k \bm g_k gk E ( w ) E(\bm w) E(w) w ( k ) \bm w^{(k)} w(k)的梯度, g k = ∂ E ( w ) ∂ w \bm g_k=\frac {\partial E(\bm w)} {\partial \bm w} gk=wE(w)   H k H_k Hk为为 E ( w ) E(\bm w) E(w) w ( k ) \bm w^{(k)} w(k)的黑塞矩阵, H k = ∂ 2 E ( w ) ∂ w ∂ w T H_k=\frac {\partial^2 E(\bm w)} {\partial \bm w \partial \bm w^T} Hk=wwT2E(w)  则第 k + 1 k+1 k+1次迭代值 w k + 1 \bm w^{k+1} wk+1为: w k + 1 = w k − H k − 1 g k \bm w^{k+1}=\bm w^{k}-H_k^{-1}\bm g_k wk+1=wkHk1gk  当 ∣ ∣ g k ∣ ∣ < ϵ ||\bm g_k||<\epsilon gk<ϵ时,迭代结束,得到近似解 w ∗ = w k \bm w^*=\bm w^{k} w=wk
  当 ∣ ∣ E ( w k + 1 ) − E ( w k ) ∣ ∣ < ϵ ||E(\bm w^{k+1})-E(\bm w^{k})||<\epsilon E(wk+1)E(wk)<ϵ ∣ ∣ w k + 1 − w k ∣ ∣ < ϵ ||\bm w^{k+1}-\bm w^{k}||<\epsilon wk+1wk<ϵ时,迭代结束,得到近似解 w ∗ = w k + 1 \bm w^*=\bm w^{k+1} w=wk+1

4. 正则化

  正则化是用来防止模型过拟合的一种策略,在损失函数的基础之上加上一个正则化项 ( r e g u l a r i z e r ) (regularizer) (regularizer)或惩罚项 ( p e n a l t y (penalty (penalty t e r m ) term) term),损失函数改变,基于损失函数的最优化来求解的参数取值必然改变,以此来调节模型拟合的程度。
  常用的有 L 1 L1 L1正则化和 L 2 L2 L2正则化两种选项,其中, L 1 L1 L1范数表现为参数向量中的每个参数的绝对值之和, L 2 L2 L2范数表现为参数向量中的每个参数的平方和然后再求平方根。
  即 ∣ ∣ w ∣ ∣ 1 = ∣ w 1 ∣ + ∣ w 2 ∣ + ⋯ + ∣ w N ∣ ∣ ∣ w ∣ ∣ 2 = ∣ w 1 ∣ 2 + ∣ w 2 ∣ 2 + ⋯ + ∣ w N ∣ 2 ||\bm w||_1=|w_1|+|w_2|+\dots+|w_N| \\[3pt] ||\bm w||_2=\sqrt {|w_1|^2+|w_2|^2+\dots+|w_N|^2} w1=w1+w2++wNw2=w12+w22++wN2 E ( w ) L 1 = E ( w ) + λ ∣ ∣ w ∣ ∣ 1 E ( w ) L 2 = E ( w ) + λ 2 ∣ ∣ w ∣ ∣ 2 2 E(\bm w)_{L1}=E(\bm w)+\lambda||\bm w||_1 \\[3pt] E(\bm w)_{L2}=E(\bm w)+\frac {\lambda} {2} ||\bm w||_2^2 E(w)L1=E(w)+λw1E(w)L2=E(w)+2λw22  上述这种形式在书中很常见,通过控制正则项来调整损失函数。
E ( w ) L 1 = C ∗ E ( w ) + λ ∣ ∣ w ∣ ∣ 1 E ( w ) L 2 = C ∗ E ( w ) + λ 2 ∣ ∣ w ∣ ∣ 2 2 E(\bm w)_{L1}=C*E(\bm w)+\lambda||\bm w||_1 \\[3pt] E(\bm w)_{L2}=C*E(\bm w)+\frac {\lambda} {2} ||\bm w||_2^2 E(w)L1=CE(w)+λw1E(w)L2=CE(w)+2λw22  上述这种形式是 s k l e a r n sklearn sklearn正则化形式,通过控制损失函数前的系数 C C C直接调整损失函数。

  可能有些小伙伴们会有个疑问:为啥上述的正则化中 L 2 L_2 L2范式要带个平方?这是因为啊 L 2 L_2 L2范式是先求平方和再开根号,带个平方是为了省去开根号的操作,简化运算,哈哈哈哈。

5. 模型实现

  这里使用sklearn.linear_model里的LogisticRegression进行逻辑回归建模来解决分类问题,数据集为sklearn自带的乳腺癌数据集breast_cancer,数据集详情大致如下:

机器学习之逻辑回归(手推公式版)_第5张图片
机器学习之逻辑回归(手推公式版)_第6张图片机器学习之逻辑回归(手推公式版)_第7张图片

  该数据集有30个特征,2个类别,详情可打印irisdata.DESCR

	from sklearn.linear_model import LogisticRegression
	from sklearn.datasets import load_breast_cancer
	from sklearn.model_selection import train_test_split
	from sklearn.metrics import accuracy_score
	import numpy as np
	import matplotlib.pyplot as plt
	
	
	breast = load_breast_cancer()
	
	# penalty: 正则化选项, 默认L2
	# C: 控制系数, 默认1.0
	# solver: 求解最优模型参数的方法, 默认liblinear, 用于小数据集或简单二分类
	# 大数据集可以选择SAG或SAGA
	# max_iter: 最大迭代次数
	model1 = LogisticRegression(penalty='l1', C=0.5, solver='liblinear', max_iter=1000)
	model2 = LogisticRegression(penalty='l2', C=0.5, solver='liblinear', max_iter=1000)
	model1.fit(breast.data, breast.target)
	model2.fit(breast.data, breast.target)
	
	print('model1: ', model1.coef_)
	print('model2: ', model2.coef_)

机器学习之逻辑回归(手推公式版)_第8张图片
  由上也可以看出, L 1 L1 L1正则化越强,参数向量中就含有越多为0的参数,参数就越稀疏,选出来的特征就越少,以此来防止过拟合。相对的, L 2 L2 L2正则化在加强的过程中,会尽量让每个特征对模型都有一些小的贡献,但携带信息少,对模型贡献不大的特征的参数会非常接近于0。
  下面对比一下系数 C C C L 1 L1 L1正则化和 L 2 L2 L2正则化的影响:

	x_train, x_test, y_train, y_test = train_test_split(breast.data, breast.target,test_size=0.3,random_state=128)
	
	l1 = []
	l2 = []
	l1_test = []
	l2_test = []
	
	for i in np.linspace(0.05, 1.0, 20):
	    model1 = LogisticRegression(penalty='l1', C=i, solver='liblinear', max_iter=1000)
	    model2 = LogisticRegression(penalty='l2', C=i, solver='liblinear', max_iter=1000)
	
	    model1.fit(breast.data, breast.target)
	    model2.fit(breast.data, breast.target)
	
	    l1.append(accuracy_score(y_true=y_train, y_pred=model1.predict(x_train)))
	    l2.append(accuracy_score(y_true=y_train, y_pred=model2.predict(x_train)))
	    l1_test.append(accuracy_score(y_true=y_test, y_pred=model1.predict(x_test)))
	    l2_test.append(accuracy_score(y_true=y_test, y_pred=model2.predict(x_test)))
	
	plt.figure(figsize=(6, 6))
	plt.plot(np.linspace(0.05, 1.0, 20), l1, c="green", label='L1')
	plt.plot(np.linspace(0.05, 1.0, 20), l2, c="blue", label='L2')
	plt.plot(np.linspace(0.05, 1.0, 20), l1_test, c="red", label='L1_test')
	plt.plot(np.linspace(0.05, 1.0, 20), l2_test, c="gray", label='L2_test')
	
	plt.legend(loc='lower right')
	plt.show()

机器学习之逻辑回归(手推公式版)_第9张图片

  有关LogisticRegression的详细参数说明可参考官方手册。

结束语

  持续充电中,博客内容也在不断更新补充中,如有错误,欢迎来私戳小编哦!共同进步,感谢Thanks♪(・ω・)ノ

在这里插入图片描述

你可能感兴趣的:(机器学习,人工智能,机器学习,python,逻辑回归,算法)