逻辑回归LR
1.逻辑回归模型
我们知道线性回归的模型如下:(线性回归介绍)
z
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
=
θ
T
x
z=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n=\theta^Tx
z=θ0+θ1x1+θ2x2+...+θnxn=θTx
而对于Logistic Regression来说,其思想也是基于线性回归(Logistic Regression属于广义线性回归模型)。其公式如下:
h
θ
(
x
)
=
1
1
+
e
−
z
=
1
1
+
e
θ
T
x
h_\theta(x)=\frac{1}{1+e^{-z}}=\frac{1}{1+e^{\theta^Tx}}
hθ(x)=1+e−z1=1+eθTx1
其中:
y
=
1
1
+
e
−
x
y=\frac{1}{1+e^{-x}}
y=1+e−x1被称作sigmoid函数,我们可以看到,Logistic Regression算法是将线性函数的结果映射到了sigmoid函数中。
sigmoid的函数图形如下:
我们可以看到,sigmoid的函数输出是介于
(
0
,
1
)
(0,1)
(0,1)之间的,中间值是0.5,于是之前的公式
h
θ
(
x
)
h_θ(x)
hθ(x) 的含义就很好理解了,因为
h
θ
(
x
)
h_θ(x)
hθ(x) 输出是介于
(
0
,
1
)
(0,1)
(0,1))之间,也就表明了数据属于某一类别的概率。
(概率越大,熵越小,也就是不确定性也小)
其中
x
x
x为样本输入,
h
θ
(
x
)
h_θ(x)
hθ(x)为模型输出,可以理解为某一分类的概率大小。而
θ
θ
θ为分类模型的要求出的模型参数。对于模型输出
h
θ
(
x
)
h_θ(x)
hθ(x),我们让它和我们的二元样本输出
y
y
y(假设为0和1)有这样的对应关系:
如果
h
θ
(
x
)
>
0.5
h_θ(x)>0.5
hθ(x)>0.5 ,即
x
θ
>
0
x_θ>0
xθ>0, 则
y
y
y为1;
如果
h
θ
(
x
)
<
0.5
h_θ(x)<0.5
hθ(x)<0.5,即
x
θ
<
0
x_θ<0
xθ<0, 则
y
y
y为0;
y
=
0.5
y=0.5
y=0.5是临界情况,此时
x
θ
x_θ
xθ=0, 从逻辑回归模型本身无法确定分类。
h
θ
(
x
)
h_θ(x)
hθ(x)的值越小,而分类为
0
0
0的的概率越高,反之,值越大的话分类为
1
1
1的的概率越高。如果靠近临界点,则分类准确率会下降。
此处我们也可以将模型写成矩阵模式:
h
θ
(
X
)
=
1
1
+
e
−
X
θ
h_\theta(X)=\frac{1}{1+e^{-X\theta}}
hθ(X)=1+e−Xθ1
其中
h
θ
(
X
)
h_θ(X)
hθ(X)为模型输出,为
m
m
mx
1
1
1的维度。
X
X
X为样本特征矩阵,为
m
m
mx
n
n
n的维度。
θ
θ
θ为分类的模型系数,为
n
n
nx
1
1
1的向量。
理解了二元分类回归的模型,接着我们就要看模型的损失函数了,我们的目标是极小化损失函数来得到对应的模型系数
θ
θ
θ。
2.逻辑回归的损失函数
回顾下线性回归的损失函数,由于线性回归是连续的,所以可以使用模型误差的的平方和来定义损失函数。但是逻辑回归不是连续的,自然线性回归损失函数定义的经验就用不上了。不过我们可以用最大似然法来推导出我们的损失函数。
因为
h
θ
(
x
)
h_\theta(x)
hθ(x)函数的特性,它输出的结果也不再是预测结果,而是一个值预测为正例的概率,预测为负例的概率就是1-g(z).按照二元逻辑回归的定义,假设我们的样本输出是0或者1两类。
那么我们有:
p
(
y
=
1
∣
x
;
θ
)
=
h
θ
(
x
)
p
(
y
=
0
∣
x
;
θ
)
=
1
−
h
θ
(
x
)
p(y=1|x;\theta)=h_\theta(x)\\ p(y=0|x;\theta)=1-h_\theta(x)
p(y=1∣x;θ)=hθ(x)p(y=0∣x;θ)=1−hθ(x)
把这两个式子写成一个式子,就是:
P
(
y
∣
x
;
θ
)
=
(
h
θ
(
x
)
)
y
⋅
(
1
−
h
θ
(
x
)
)
1
−
y
P(y|x;\theta)=(h_\theta(x))^{y} \cdot(1-h_\theta(x))^{1-y}
P(y∣x;θ)=(hθ(x))y⋅(1−hθ(x))1−y
其中
y
y
y的取值只能是0或者1。(因为损失函数不是凸函数,不可以直接使用梯度下降法的方式计算最值)
得到了
y
y
y的概率分布函数表达式,我们就可以用似然函数最大化来求解我们需要的模型系数
θ
θ
θ。
为了方便求解,这里我们用对数似然函数最大化,对数似然函数取反即为我们的损失函数
J
(
θ
)
J(θ)
J(θ)。
注意:损失函数表征预测值与真实值之间的差异程度,如果预测值与真实值越接近则损失函数应该越小。所以在此损失函数可以取为最大似然估计函数的相反数,其次除以
m
m
m这一因子并不改变最终求导极值结果,通过除以
m
m
m可以得到平均损失值,避免样本数量对于损失值的影响
假设样本之间是相互独立的,即似然函数如下:
L
(
θ
)
=
p
(
Y
∣
X
;
θ
)
=
Π
i
=
1
m
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
=
Π
i
=
1
m
(
h
θ
(
x
(
i
)
)
)
y
(
i
)
⋅
(
1
−
h
θ
(
x
)
(
i
)
)
1
−
y
(
i
)
\begin{aligned} L(\theta) &= p(Y|X;\theta) \\ &= \Pi_{i=1}^mp(y^{(i)}|x^{(i)};\theta) \\ &= \Pi_{i=1}^m (h_\theta(x^{(i)}))^{y^{(i)}} \cdot(1-h_\theta(x)^{(i)})^{1-y^{(i)}} \end{aligned}
L(θ)=p(Y∣X;θ)=Πi=1mp(y(i)∣x(i);θ)=Πi=1m(hθ(x(i)))y(i)⋅(1−hθ(x)(i))1−y(i)
其中m为样本的个数。
对数似然函数:
l
(
θ
)
=
l
o
g
L
(
θ
)
=
∑
i
=
1
m
p
(
y
(
i
)
∣
x
(
i
)
;
θ
)
=
∑
i
=
1
m
l
o
g
(
h
θ
(
x
(
i
)
)
)
y
(
i
)
(
1
−
h
θ
(
x
)
(
i
)
)
1
−
y
(
i
)
=
∑
i
=
1
m
(
y
(
i
)
l
o
g
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
)
\begin{aligned} l(\theta)&=logL(\theta) \\ &= \sum_{i=1}^mp(y^{(i)}|x^{(i)};\theta) \\ &= \sum_{i=1}^m log(h_\theta(x^{(i)}))^{y^{(i)}} (1-h_\theta(x)^{(i)})^{1-y^{(i)}} \\ &=\sum_{i=1}^m ({y^{(i)}} log(h_\theta(x^{(i)}))+(1-y^{(i)})log{(1-h_\theta(x^{(i)})))} \end{aligned}
l(θ)=logL(θ)=i=1∑mp(y(i)∣x(i);θ)=i=1∑mlog(hθ(x(i)))y(i)(1−hθ(x)(i))1−y(i)=i=1∑m(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))
从而逻辑回归的代价函数为:
J
(
θ
)
=
−
1
m
∑
i
=
1
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=1}^m ({y^{(i)}} log(h_\theta(x^{(i)}))+(1-y^{(i)})log{(1-h_\theta(x^{(i)})))}
J(θ)=−m1i=1∑m(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))
对单个样本求偏导数:
∂
h
θ
(
x
)
∂
θ
j
=
−
(
1
+
e
−
θ
T
x
)
−
2
⋅
e
−
θ
T
x
⋅
(
−
x
)
=
e
−
θ
T
x
(
1
+
e
−
θ
T
x
)
2
⋅
x
=
1
+
e
−
θ
T
x
−
1
(
1
+
e
−
θ
T
x
)
2
⋅
x
=
(
1
(
1
+
e
−
θ
T
x
)
−
1
(
1
+
e
−
θ
T
x
)
2
)
⋅
x
=
h
θ
(
x
)
⋅
(
1
−
h
θ
(
x
)
)
⋅
x
\begin{aligned} \frac{\partial h_\theta(x)}{\partial \theta_j}&=-(1+e^{-\theta^Tx})^{-2} \cdot e^{-\theta^Tx} \cdot (-x)\\ &=\frac{e^{-\theta^Tx}}{(1+e^{-\theta^Tx})^2} \cdot x \\ &=\frac{1+e^{-\theta^Tx-1}}{(1+e^{-\theta^Tx})^2} \cdot x \\ &=(\frac{1}{(1+e^{-\theta^Tx})} -\frac{1}{(1+e^{-\theta^Tx})^2}) \cdot x \\ &=h_\theta(x) \cdot (1-h_\theta(x)) \cdot x \end{aligned}
∂θj∂hθ(x)=−(1+e−θTx)−2⋅e−θTx⋅(−x)=(1+e−θTx)2e−θTx⋅x=(1+e−θTx)21+e−θTx−1⋅x=((1+e−θTx)1−(1+e−θTx)21)⋅x=hθ(x)⋅(1−hθ(x))⋅x
从而对代价函数求导:
∂
J
(
θ
)
∂
θ
j
=
−
1
m
∑
i
=
1
m
(
y
(
i
)
⋅
1
h
θ
(
x
(
i
)
)
−
(
1
−
y
(
i
)
)
⋅
1
1
−
h
θ
(
x
(
i
)
)
)
∂
h
θ
(
x
(
i
)
)
∂
θ
j
=
−
1
m
∑
i
=
1
m
y
(
i
)
−
h
θ
(
x
(
i
)
)
h
θ
(
x
(
i
)
)
(
1
−
h
θ
(
x
(
i
)
)
)
∂
h
θ
(
x
(
i
)
)
∂
θ
j
=
−
1
m
∑
i
=
1
m
y
(
i
)
−
h
θ
(
x
(
i
)
)
h
θ
(
x
(
i
)
)
(
1
−
h
θ
(
x
(
i
)
)
)
h
θ
(
x
(
i
)
)
(
1
−
h
θ
(
x
(
i
)
)
)
x
j
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
\begin{aligned} \frac{\partial J(\theta)}{\partial \theta_j}&=-\frac{1}{m}\sum_{i=1}^m (y^{(i)}\cdot\frac{1}{h_\theta(x^{(i)})}-(1-y^{(i)})\cdot\frac{1}{1-h_\theta(x^{(i)})})\frac{\partial h_\theta(x^{(i)})}{\partial \theta_j}\\ &= -\frac{1}{m}\sum_{i=1}^m\frac{y^{(i)}-h_\theta(x^{(i)})}{h_\theta(x^{(i)})(1-h_\theta(x^{(i)}))}\frac{\partial h_\theta(x^{(i)})}{\partial \theta_j} \\ &= -\frac{1}{m}\sum_{i=1}^m\frac{y^{(i)}-h_\theta(x^{(i)})}{h_\theta(x^{(i)})(1-h_\theta(x^{(i)}))}h_\theta(x^{(i)})(1-h_\theta(x^{(i)}))x_j \\ &=\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j \end{aligned}
∂θj∂J(θ)=−m1i=1∑m(y(i)⋅hθ(x(i))1−(1−y(i))⋅1−hθ(x(i))1)∂θj∂hθ(x(i))=−m1i=1∑mhθ(x(i))(1−hθ(x(i)))y(i)−hθ(x(i))∂θj∂hθ(x(i))=−m1i=1∑mhθ(x(i))(1−hθ(x(i)))y(i)−hθ(x(i))hθ(x(i))(1−hθ(x(i)))xj=m1i=1∑m(hθ(x(i))−y(i))xj
我们是要求使得似然函数最大时的
θ
θ
θ ,所以使用梯度下降法:
θ
j
:
=
θ
j
−
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
∗
x
(
i
)
\theta_j:=\theta_j-(h_\theta(x^{(i)})-y^{(i)})*x^{(i)}
θj:=θj−(hθ(x(i))−y(i))∗x(i)
得到优化后的θ ,代入
h
θ
(
x
)
=
1
1
+
e
−
z
h_\theta(x)=\frac{1}{1+e^{-z}}
hθ(x)=1+e−z1 ,以0.5为阈值进行分类。
3.利用梯度下降法求参数
在开始梯度下降之前,要这里插一句,sigmoid function有一个很好的性质就是
ϕ
′
(
z
)
=
ϕ
(
z
)
(
1
−
ϕ
(
z
)
)
\phi'(z)=\phi(z)(1-\phi(z))
ϕ′(z)=ϕ(z)(1−ϕ(z))
下面会用到这个性质。
还有,我们要明确一点,梯度的负方向就是代价函数下降最快的方向。什么?为什么?好,我来说明一下。借助于泰特展开,我们有
f
(
x
+
δ
)
−
f
(
x
)
=
f
′
(
x
)
⋅
δ
f(x+\delta)-f(x)=f'(x) \cdot \delta
f(x+δ)−f(x)=f′(x)⋅δ
其中,
f
′
(
x
)
f'(x)
f′(x)和
δ
δ
δ为向量,那么这两者的内积就等于
f
′
(
x
)
⋅
δ
=
∣
∣
f
′
(
x
)
∣
∣
⋅
∣
∣
δ
∣
∣
⋅
c
o
s
θ
f'(x) \cdot \delta = ||f'(x)|| \cdot ||\delta|| \cdot cos\theta
f′(x)⋅δ=∣∣f′(x)∣∣⋅∣∣δ∣∣⋅cosθ
当
θ
=
π
θ=π
θ=π时,也就是
δ
δ
δ在
f
′
(
x
)
f'(x)
f′(x)的负方向上时,取得最小值,也就是下降的最快的方向了~
θ
:
=
θ
+
Δ
θ
,
Δ
θ
=
−
η
∇
J
(
θ
)
\theta : = \theta+ \Delta \theta , \Delta \theta =-\eta \nabla J(\theta)
θ:=θ+Δθ,Δθ=−η∇J(θ)
没错,就是这么下降。没反应过来?那我再写详细一些
θ
j
:
=
θ
j
+
Δ
θ
j
,
Δ
=
−
η
∂
J
(
θ
)
∂
θ
j
\theta_j : = \theta_j+ \Delta \theta_j , \Delta =-\eta \frac {\partial J(\theta)}{\partial \theta_j}
θj:=θj+Δθj,Δ=−η∂θj∂J(θ)
其中,
θ
j
\theta_j
θj表示第
j
j
j个特征的权重;
η
η
η为学习率,用来控制步长。
所以,在逻辑回归中使用梯度下降法更新权重时,只要根据下式即可
θ
j
:
=
θ
j
−
η
⋅
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta_j : = \theta_j-\eta \cdot \frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
θj:=θj−η⋅m1i=1∑m(hθ(x(i))−y(i))xj(i)
当然,在样本量极大的时候,每次更新权重会非常耗费时间,这时可以采用随机梯度下降法,这时每次迭代时需要将样本重新打乱,然后用下式不断更新权重。
θ
j
:
=
θ
j
−
η
⋅
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
,
f
o
r
i
i
n
r
a
n
g
e
(
m
)
\theta_j : = \theta_j-\eta \cdot(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} ,for \text{ } i \text{ } in \text{ } range\text{ } (m)
θj:=θj−η⋅(hθ(x(i))−y(i))xj(i),for i in range (m)
4.sk-learn 应用
linear_model.LogisticRegression(penalty='l2',
dual=False,
tol=0.0001,
C=1.0,
fit_intercept=True,
intercept_scaling=1,
class_weight=None,
random_state=None, # 随机种子
solver='liblinear',
max_iter=100, # 最大迭代次数,
multi_class='ovr', # 多分类方式,有‘ovr','mvm'
verbose=0, # 输出日志,设置为1,会输出训练过程的一些结果
warm_start=False,
n_jobs=1
)
首先我们来看看LogisticRegression()有哪些参数。
penalty参数
str, ‘l1’ or ‘l2’, default: ‘l2’
即选择正则化参数,str类型,可选L1和L2正则化,默认是L2正则化。
dual参数
bool, default: False
即选择对偶公式(dual)或原始公式(primal),bool类型默认是原始公式,用于求解线性多核(liblinear)的L2的惩罚项上。当样本数大于特征数时,更倾向于原始公式,即False。
tol参数
float, default: 1e-4
对停止标准的容忍,即求解到多少的时候认为已经求得最优解,并停止。float类型,默认值为1e-4。
C参数
float, default: 1.0
设置正则化强度的倒数,值越小,正则化越强。float类型,默认值为1.0。
fit_intercept参数
bool, default: True
即选择是否将偏差(也称截距)添加到决策函数中。bool类型,默认为True,添加。
是否存在截距值,即b
intercept_scaling参数
float, default 1
只在solver选择liblinear并且self.fit_intercept设置为True的时候才有用。float类型。在这种情况下x变为[x,self.intercept_scaling]
class_weight参数
dict or ‘balanced’, default: None
类别的权重,样本类别不平衡时使用,设置balanced会自动调整权重。为了平横样本类别比例,类别样本多的,权重低,类别样本少的,权重高。
即类型权重参数,用于标示分类模型中各种类型的权重。可以用字典模式输入也可选择‘balanced’模式,默认是None,即所有类型的权重都一样。
可以通过直接输入{class_label: weight}来对每个类别权重进行赋值,如{0:0.3,1:0.7}就是指类型0的权重为30%,而类型1的权重为70%。
也可以通过选择‘balanced’来自动计算类型权重,实际计算公式为:
n_samples / (n_classes * np.bincount(y)),当然这是不需要我们计算的啦。
在出现误分类代价很高或类别不平衡的情况下,我们可以通过这个参数来调整权重。
1、误分类代价很高:比如说对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。
2、类别不平衡:分类任务中不同类别的训练样例数目差别很大,这种情况在这本书中3.6节有提到,并且提出了“再缩放”的基本策略。
random_state参数
int, RandomState instance or None, optional, default: None
随机数种子。仅在solver为‘sag’或者‘liblinear’时使用。int类型,默认为无。
solver参数
优化算法的参数,包括newton-cg,lbfgs,liblinear,sag,saga,对损失的优化的方法
{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’},
即选择逻辑回归损失函数优化算法的参数。默认情况是使用‘liblinear’算法。
对于小型数据集来说,选择‘liblinear’更好;对于大型数据集来说,‘saga’或者‘sag’会更快一些。
对于多类问题我们只能使用‘newton-cg’, ‘sag’, ‘saga’ and ‘lbfgs’。
对于正则化来说,‘newton-cg’,‘lbfgs’和‘sag’只能用于L2正则化(因为这些优化算法都需要损失函数的一阶或者二阶连续导数,因此无法用于没有连续导数的L1正则化);而‘liblinear’,‘saga’则可处理L1正则化。
‘newton-cg’是牛顿家族中的共轭梯度法,‘lbfgs’是一种拟牛顿法,
‘sag’则是随机平均梯度下降法,‘saga’是随机优化算法,‘liblinear’是坐标轴下降法
a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
b) ld) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
max_iter参数
int, default: 100
算法收敛最大迭代次数,int类型,默认为100。
只在solver为‘newton-cg’,‘sag’和‘lbfgs’是有用。
multi_class参数
str, {‘ovr’, ‘multinomial’}, default: ‘ovr’
即选择分类方式的参数,可选参数有‘ovr’和‘multinomial’,str类型,默认为‘ovr’。
‘ovr’即one-vs-rest(OvR),而‘multinomial’即many-vs-many(MvM)。
OvR每次将一个类的样例作为正例,所有其他类的样例作为反例来训练,
在测试中若仅有一个分类器预测为正类,则对应的类别标记为最终结果;若有多个分类器预测为正类,则考虑每个分类器的置信度,置信度高的类别作为分类结果,MvM则是每次将若干类作为正例,若干其他类作为反例。
verbose参数
int, default: 0
日志冗长度;对于solver为‘liblinear’和‘lbfgs’将详细数字设置为任意正数以表示详细;int类型。默认为0。输出日志,设置为1,会输出训练过程的一些结果
warm_start参数
bool, default: False
热启动参数;bool类型,默认为False。当设置为True时,重用上一次调用的解决方案作为初始化,否则,只需删除前面的解决方案。对于‘liblinear’没用。
n_jobs参数
int, default: 1
并行数。int类型,默认为1,代表CPU的一个内核运行程序。
设置为1,用1个cpu运行,设置-1,用你电脑的所有cpu运行程序
【属性(Attributes)】
与线性回归模型类似,有coef_(决策函数中的特征系数),intercept_(决策函数的偏置)和n_iter_(所有类的实际迭代次数)。最常用的就是coef_和intercept_。