1 逻辑回归基础理论
逻辑回归(Logistic regression)又叫对数几率回归,是一个分类模型。主要进行二分类。在线性回归的基础上进行一个sigmoid变换,于是得到逻辑回归模型。逻辑回归输出值在(0,1) 之间,直观含义是y=1的概率。
逻辑回归假设数据服从伯努利分布,通过极大似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
1.1 公式
y
=
1
1
+
e
−
(
θ
T
X
+
b
)
y = \frac{1}{1+e^{-(\theta^TX+b)}}
y=1+e−(θTX+b)1
也可以写成:
l
n
y
1
−
y
=
θ
T
X
+
b
ln\frac{y}{1-y} = \theta^TX +b
ln1−yy=θTX+b
从上式可以看出,逻辑回归实际是用线性回归拟合真实标签的对数几率。
1.2 sigmoid函数
理想的二分类函数为阶跃函数,然而其不连续,于是找到一定程度上近似单位阶跃函数的替代函数,并希望它单调可微。
g
(
z
)
=
1
1
+
e
−
z
g(z) = \frac{1}{1+e^{-z}}
g(z)=1+e−z1
![sigmoid函数](https://img-blog.csdnimg.cn/20210210160717570.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hZ2ljTXlzdGVyeQ==,size_16,color_FFFFFF,t_70)
sigmoid函数的特点是:
- 取值永远在0,1之间
- 输出值在z=0附近变化陡峭,远离0时变化平缓
1.3 逻辑回归的优缺点和适用数据
优点:模型简单简单,可解释性强。计算速度快,存储资源底。对线性关系拟合效果好。
缺点:容易欠拟合,分类精度可能不高。因为本质是线性分类器,无法应对较为复杂的数据。
适用数据:数值型和标称型数据。
1.4 损失函数
虽然逻辑回归源于线性回归,但是并不会用线性回归的MSE作为损失函数,因为如果使用MSE的话得到的是一个非凸函数(non-convexfunction),这将影响梯度下降算法寻找全局最小值。
逻辑回归的参数估计方法为极大似然法(maximum likelihood method),即令每个样本属于其真实标签的概率越大越好。
m个样本服从伯努利分布,其概率密度函数为:
p
(
y
∣
x
,
θ
)
=
h
θ
(
x
)
y
(
1
−
h
θ
(
x
)
)
1
−
y
p(y|x,\theta)=h_\theta(x)^y(1-h_\theta(x))^{1-y}
p(y∣x,θ)=hθ(x)y(1−hθ(x))1−y
极大似然即为求联合概率密度最大值:
L
(
θ
)
=
∏
i
=
1
m
p
(
y
i
∣
x
i
,
θ
)
L(\theta)=\prod_{i=1}^m p(y_i|x_i,\theta)
L(θ)=i=1∏mp(yi∣xi,θ)
负对数似然函数即为损失函数,表达式为:
J
(
θ
)
=
−
1
m
∑
i
=
0
m
(
y
i
∗
l
o
g
(
h
θ
(
x
i
)
)
+
(
1
−
y
i
)
∗
l
o
g
(
1
−
h
θ
(
x
i
)
)
)
J(\theta) = - \frac{1}{m}\sum_{i=0}^m (y_i *log(h_\theta(x_i))+ (1-y_i) *log(1-h_\theta(x_i)))
J(θ)=−m1i=0∑m(yi∗log(hθ(xi))+(1−yi)∗log(1−hθ(xi)))
其中,m表示样本数,
y
i
y_i
yi是真实标签,
h
θ
(
x
i
)
h_\theta(x_i)
hθ(xi)是基于参数θ的预测值。
该损失函数的优化方法最常见的有梯度下降法,坐标轴下降法,等牛顿法·等。
梯度下降算法为:
Repeat : {
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
\theta_j := \theta_j -\alpha\frac{\partial}{\partial \theta_j}J(\theta)
θj:=θj−α∂θj∂J(θ)} (
θ
\theta
θ所有分量同时更新)
1.5 偏导数的推导
(
y
i
∗
l
o
g
(
h
θ
(
x
i
)
)
+
(
1
−
y
i
∗
l
o
g
(
1
−
h
θ
(
x
i
)
)
(y_i *log(h_\theta(x_i))+ (1-y_i *log(1-h_\theta(x_i))
(yi∗log(hθ(xi))+(1−yi∗log(1−hθ(xi))
=
y
i
(
l
o
g
h
θ
(
x
i
)
1
−
h
θ
(
x
i
)
)
+
l
o
g
(
1
−
h
θ
(
x
i
)
=y_i(log\frac{h_\theta(x_i)}{1-h_\theta(x_i)}) +log(1-h_\theta(x_i)
=yi(log1−hθ(xi)hθ(xi))+log(1−hθ(xi)
其中:
h
θ
(
x
i
)
=
1
1
+
e
−
θ
T
x
i
h_\theta(x_i) = \frac{1}{1+e^{-\theta^Tx_i}}
hθ(xi)=1+e−θTxi1
因此:
y
i
(
l
o
g
h
θ
(
x
i
)
1
−
h
θ
(
x
i
)
)
+
l
o
g
(
1
−
h
θ
(
x
i
)
)
y_i(log\frac{h_\theta(x_i)}{1-h_\theta(x_i)}) +log(1-h_\theta(x_i))
yi(log1−hθ(xi)hθ(xi))+log(1−hθ(xi))
=
y
i
∗
l
o
g
1
e
−
θ
T
x
i
+
l
o
g
e
−
θ
T
x
i
1
+
e
−
θ
T
x
i
= y_i*log\frac{1}{e^{-\theta^Tx_i}} +log\frac{e^{-\theta^Tx_i}}{1+e^{-\theta^Tx_i}}
=yi∗loge−θTxi1+log1+e−θTxie−θTxi
=
y
i
∗
θ
T
x
i
−
log
(
1
+
e
θ
T
x
i
)
=y_i*\theta^{T}x_i - \log(1+e^{\theta^Tx_i})
=yi∗θTxi−log(1+eθTxi)
所以
∂
J
(
θ
)
∂
θ
=
∂
∂
θ
(
−
1
m
∑
i
=
0
m
(
y
i
∗
l
o
g
(
h
θ
(
x
i
)
)
+
(
1
−
y
i
∗
l
o
g
(
1
−
h
θ
(
x
i
)
)
)
)
\frac{\partial J(\theta)}{\partial \theta}= \frac{\partial}{\partial \theta}( - \frac{1}{m}\sum_{i=0}^m (y_i *log(h_\theta(x_i))+ (1-y_i *log(1-h_\theta(x_i))))
∂θ∂J(θ)=∂θ∂(−m1∑i=0m(yi∗log(hθ(xi))+(1−yi∗log(1−hθ(xi))))
=
∂
∂
θ
(
−
1
m
∑
i
=
0
m
(
y
i
∗
θ
T
x
i
−
log
(
1
+
e
θ
T
x
i
)
)
)
= \frac{\partial}{\partial \theta} (-\frac{1}{m}\sum_{i=0}^{m}(y_i*\theta^{T}x_i - \log(1+e^{\theta^Tx_i})))
=∂θ∂(−m1∑i=0m(yi∗θTxi−log(1+eθTxi)))
=
−
1
m
∑
i
=
0
m
(
y
i
∗
x
−
1
1
+
e
θ
T
x
i
∗
e
θ
T
x
i
∗
x
i
)
= -\frac{1}{m}\sum_{i=0}^{m}(y_i*x -\frac{1}{1+e^{\theta^Tx_i}}*e^{\theta^Tx_i}*x_i)
=−m1∑i=0m(yi∗x−1+eθTxi1∗eθTxi∗xi)
=
−
1
m
∑
i
=
0
m
(
x
i
(
y
i
−
h
θ
(
x
i
)
)
=-\frac{1}{m}\sum_{i=0}^{m}(x_i(y_i-h_\theta(x_i))
=−m1∑i=0m(xi(yi−hθ(xi))
=
1
m
∑
i
=
0
m
(
x
i
(
h
θ
(
x
i
)
−
y
i
)
)
=\frac{1}{m}\sum_{i=0}^{m}(x_i(h_\theta(x_i)-y_i))
=m1∑i=0m(xi(hθ(xi)−yi))
对于
θ
\theta
θ的分量
θ
j
\theta_j
θj 则有:
∂
J
(
θ
)
∂
θ
j
=
1
m
∑
i
=
0
m
(
x
i
j
(
h
θ
(
x
i
)
−
y
i
)
)
\frac{\partial J(\theta)}{\partial \theta_j} =\frac{1}{m}\sum_{i=0}^{m}(x_{ij}(h_\theta(x_i)-y_i))
∂θj∂J(θ)=m1∑i=0m(xij(hθ(xi)−yi))
1.6 正则化
正则化的目的是防止模型过拟合。主要包括L1正则化和L2正则化。
L1为模型添加先验知识:
θ
\theta
θ 服从零均值拉普拉斯分布。
L2为模型添加先验知识:
θ
\theta
θ 服从零均值正态分布。
L1正则会将参数压缩到0,L2则不会,但也会接近于0。因此,加入正则项可实现特征选择。
J
(
θ
)
L
1
=
J
(
θ
)
+
1
2
b
2
∑
j
∣
θ
j
∣
J(\theta)_{L1} = J(\theta) +\frac{1}{2b^2}\sum_j|\theta_j|
J(θ)L1=J(θ)+2b21j∑∣θj∣
J
(
θ
)
L
2
=
J
(
θ
)
+
1
2
σ
2
θ
T
θ
J(\theta)_{L2} = J(\theta) + \frac{1}{2\sigma^2}\theta^T\theta
J(θ)L2=J(θ)+2σ21θTθ
1.7 逻辑回归的多分类方法
逻辑回归也可以处理多分类问题,常用方法是使用一对多 (one-vs-all) 的分类算法。具体方法是:
设有3个类别,y=1,y=2,y=3。
首先,以y=1作为正类,y=2 和y=3作为负类,建立二元逻辑回归模型。
而后,以y=2作为正类,y=1 和y=3作为负类,建立二元逻辑回归模型。
最后,以y=3作为正类,y=1 和y=2作为负类,建立二元逻辑回归模型。
一共建立3个模型。
对于每一个样本,都选择输出概率最大的的类别作为分类结果。
另一种算法为OvO。推导如下:
已知对于二分类,有:
l
n
P
(
y
=
1
∣
x
,
θ
)
P
(
y
=
0
∣
x
,
θ
)
=
x
θ
ln\frac{P(y=1|x,\theta)}{P(y=0|x,\theta)} = x\theta
lnP(y=0∣x,θ)P(y=1∣x,θ)=xθ
若为K元分类,则有:
l
n
P
(
y
=
1
∣
x
,
θ
)
P
(
y
=
K
∣
x
,
θ
)
=
x
θ
1
ln\frac{P(y=1|x,\theta)}{P(y=K|x,\theta)} = x\theta_1
lnP(y=K∣x,θ)P(y=1∣x,θ)=xθ1
l
n
P
(
y
=
2
∣
x
,
θ
)
P
(
y
=
K
∣
x
,
θ
)
=
x
θ
2
ln\frac{P(y=2|x,\theta)}{P(y=K|x,\theta)} = x\theta_2
lnP(y=K∣x,θ)P(y=2∣x,θ)=xθ2
l
n
P
(
y
=
3
∣
x
,
θ
)
P
(
y
=
K
∣
x
,
θ
)
=
x
θ
3
ln\frac{P(y=3|x,\theta)}{P(y=K|x,\theta)} = x\theta_3
lnP(y=K∣x,θ)P(y=3∣x,θ)=xθ3
…
l
n
P
(
y
=
K
−
1
∣
x
,
θ
)
P
(
y
=
K
∣
x
,
θ
)
=
x
θ
K
−
1
ln\frac{P(y=K-1|x,\theta)}{P(y=K|x,\theta)} = x\theta_{K-1}
lnP(y=K∣x,θ)P(y=K−1∣x,θ)=xθK−1
并且有:
∑
k
=
1
K
P
(
y
=
k
∣
x
,
θ
)
=
1
\sum_{k=1}^KP(y=k|x,\theta) =1
∑k=1KP(y=k∣x,θ)=1
可得:
P
(
y
=
k
∣
x
,
θ
)
=
e
x
θ
k
1
+
∑
t
=
1
K
−
1
e
x
θ
t
,
k
=
1
,
2
,
3...
K
−
1
P(y=k|x,\theta) = \frac{e^{x\theta_k}}{1+\sum_{t=1}^{K-1}e^{x\theta_t}}, k=1,2,3...K-1
P(y=k∣x,θ)=1+∑t=1K−1exθtexθk,k=1,2,3...K−1
P
(
y
=
K
∣
x
,
θ
)
=
1
1
+
∑
t
=
1
K
−
1
e
x
θ
t
P(y=K|x,\theta) = \frac{1}{1+\sum_{t=1}^{K-1}e^{x\theta_t}}
P(y=K∣x,θ)=1+∑t=1K−1exθt1
2. 基础版python代码
def sigmoid(inX):
return 1.0/(1+exp(-inX))
def gradDescent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn) #convert to NumPy matrix
labelMat = mat(classLabels).transpose() #convert to NumPy matrix
m,n = shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
h = sigmoid(dataMatrix*weights) #matrix mult
error = (labelMat - h) #vector subtraction
weights = weights - alpha * dataMatrix.transpose()* error #matrix mult
return weights
代码源自《机器学习实战》
3. sklearn中的逻辑回归
## 基础函数库
import numpy as np
## 导入逻辑回归模型函数
from sklearn.linear_model import LogisticRegression
# 实例化,训练数据
lr_clf = LogisticRegression()
lr_clf = lr_clf.fit(x_train, y_train)
lr_clf.coef_ # 查看系数theta
lr_clf.intercept_ # 查看截距
lr_clf.predict_proba(x_test) # 预测概率
lr.predict(x_test) # 预测分类结果
# 模型评估
from sklearn import metrics
# 准确度指标
metrics.accuracy_score(y_test,test_predict)
# 混淆矩阵
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
reference
Andrew NG. Logistic Regression Classification
《机器学习》 周志华版
https://zhuanlan.zhihu.com/p/74874291
https://www.cnblogs.com/pinard/p/6029432.html
《机器学习实战》 Peter Harrington
https://blog.csdn.net/weixin_39910711/article/details/81607386