首先,用一句话概括逻辑回归: 逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。下面将从 数学推导 和应用调参以及 面试问题三方面来介绍逻辑回归。
1,数学推导
逻辑回归算法的数学推导主要分为五个内容:
1,线性模型;2,概率函数;3,损失函数;4,最优化;5,正则化。下面将分别介绍这些内容。
线性模型
逻辑回归的一般形式为:
h
θ
(
x
;
θ
)
=
1
1
+
e
−
θ
T
x
.
h_\theta(x;\theta) = \frac{1}{1+e^-\theta^Tx}.
hθ(x;θ)=1+e−θTx1.
分步表示为:
g
(
z
)
=
1
1
+
e
−
z
.
g(z) = \frac{1}{1+e^-z}.
g(z)=1+e−z1.
z
(
x
)
=
θ
1
x
1
+
.
.
.
+
θ
n
x
n
=
θ
T
x
.
z(x) =\theta^1x^1 + ... + \theta^nx^n = \theta^Tx.
z(x)=θ1x1+...+θnxn=θTx.
其中
g
(
z
)
g(z)
g(z) 是sigmod函数。
概率函数
这里我们假设数据服从伯努利分布(0-1 分布),首先介绍一下伯努利分布。如果随机变量X只取0和1两个值,并且相应的概率为:
P
r
(
X
=
1
)
=
p
,
P
r
(
X
=
0
)
=
1
−
p
,
0
<
p
<
1
Pr(X = 1) = p,Pr(X = 0) = 1-p,0<p<1
Pr(X=1)=p,Pr(X=0)=1−p,0<p<1
则称随机变量X服从参数为p的伯努利分布,X的概率函数可表示为:
P
r
(
x
∣
p
)
=
p
x
(
1
−
p
)
1
−
x
=
e
x
p
(
x
l
o
g
(
p
)
+
(
1
−
x
)
l
o
g
(
1
−
p
)
)
Pr(x|p) = p^x(1-p)^{1-x} = exp(xlog(p) + (1-x)log(1-p))
Pr(x∣p)=px(1−p)1−x=exp(xlog(p)+(1−x)log(1−p))
回到逻辑回归,因为数据服从伯努利分布。所以观测值y取0和1两个值,相应的概率为:
P
r
(
y
=
1
∣
x
,
θ
)
=
h
θ
(
x
;
θ
)
,
P
r
(
y
=
0
)
=
1
−
h
θ
(
x
;
θ
)
Pr(y = 1|x,\theta) = h_\theta(x;\theta),Pr(y = 0) = 1-h_\theta(x;\theta)
Pr(y=1∣x,θ)=hθ(x;θ),Pr(y=0)=1−hθ(x;θ)
其概率函数为:
P
r
(
y
∣
x
,
θ
)
=
h
θ
(
x
;
θ
)
y
(
1
−
h
θ
(
x
;
θ
)
)
1
−
y
Pr(y|x,\theta) = h_\theta(x;\theta)^y(1- h_\theta(x;\theta))^{1-y}
Pr(y∣x,θ)=hθ(x;θ)y(1−hθ(x;θ))1−y
损失函数
既然这里我们已经得到y的概率分布函数表达式,我们就可以用似然函数最大化来求解我们需要的模型系数θ。
首先,似然函数的代数表达式为:
L
(
θ
)
=
∏
i
=
1
N
h
θ
(
x
i
)
y
i
(
1
−
h
θ
(
x
i
)
)
1
−
y
i
L(\theta) = \prod_{i=1}^{N} {h_\theta(x^i)}^{y^i}(1-h_\theta(x^i))^{1-y^i}
L(θ)=i=1∏Nhθ(xi)yi(1−hθ(xi))1−yi
对似然函数对数化取反的表达式,即损失函数表达式为:
J
(
θ
)
=
−
l
n
L
(
θ
)
=
−
∑
i
=
1
N
y
i
l
o
g
h
θ
(
x
i
)
+
(
1
−
y
i
)
l
o
g
(
1
−
h
θ
(
x
i
)
)
J(\theta) =-ln L(\theta) =-\sum_{i=1}^{N} y^i log{h_\theta(x^i)} + (1-y^i)log(1-h_\theta(x^i))
J(θ)=−lnL(θ)=−i=1∑Nyiloghθ(xi)+(1−yi)log(1−hθ(xi))
转化成向量形式:
J
(
θ
)
=
−
Y
T
l
o
g
h
θ
(
X
)
−
(
E
−
Y
T
)
l
o
g
(
E
−
h
θ
(
X
)
)
J(\theta) =- Y^Tlogh_\theta(X) - (E - Y^T)log(E - h_\theta(X))
J(θ)=−YTloghθ(X)−(E−YT)log(E−hθ(X))
最优化
逻辑回归的最优化问题是最大化似然函数,这里通过取损失函数为似然函数对数化取反,将问题转化成最小化损失函数。这里采用梯度下降优化算法进行求解,其主要过程是在每一次迭代过程中,通过对损失函数求梯度值,再根据梯度值对参数进行更新,直到损失函数下降到一定范围的时候停止更新,得到最优值。
首先给出部分函数的求导公式:
∂
∂
x
l
o
g
x
=
1
x
\frac{\partial}{\partial{x}} log x = \frac{1}{x}
∂x∂logx=x1
∂
∂
x
h
θ
(
x
)
=
∂
∂
x
g
(
x
)
=
−
(
1
+
e
−
x
)
−
2
∗
e
−
x
∗
−
1
=
1
1
+
e
−
x
(
1
−
1
1
+
e
−
x
)
=
g
(
x
)
(
1
−
g
(
x
)
)
\frac{\partial}{\partial{x}} h_\theta(x) = \frac{\partial}{\partial{x}} g(x) = -(1+e^-x)^{-2} * e^{-x} * -1= \frac{1}{1+e^-x}(1-\frac{1}{1+e^-x}) = g(x)(1-g(x))
∂x∂hθ(x)=∂x∂g(x)=−(1+e−x)−2∗e−x∗−1=1+e−x1(1−1+e−x1)=g(x)(1−g(x))
∂
θ
θ
θ
x
=
x
\frac{\partial}{\theta{\theta}} \theta x = x
θθ∂θx=x
对于损失函数梯度求导如下:
∂
∂
x
J
(
θ
)
=
−
Y
T
1
h
θ
(
X
)
h
θ
(
X
)
(
E
−
h
θ
(
X
)
)
X
−
(
E
−
Y
T
)
1
E
−
h
θ
(
X
)
∗
−
1
∗
(
E
−
h
θ
(
X
)
)
h
θ
(
X
)
∗
X
\frac{\partial}{\partial{x}} J(\theta) = - Y^T\frac{1}{h_\theta(X) }h_\theta(X) (E-h_\theta(X) ) X - (E - Y^T)\frac{1}{E -h_\theta(X) } * -1 * (E-h_\theta(X) )h_\theta(X) *X
∂x∂J(θ)=−YThθ(X)1hθ(X)(E−hθ(X))X−(E−YT)E−hθ(X)1∗−1∗(E−hθ(X))hθ(X)∗X
化简得到
∂
∂
x
J
(
θ
)
=
X
T
(
h
θ
(
X
)
−
Y
)
\frac{\partial}{\partial{x}} J(\theta) = X^T(h_\theta(X) - Y)
∂x∂J(θ)=XT(hθ(X)−Y)
从而在梯度下降法中每一步向量θ的迭代公式如下:
θ
=
θ
−
α
X
T
(
h
θ
(
X
)
−
Y
)
\theta = \theta - \alpha X^T(h_\theta(X) - Y)
θ=θ−αXT(hθ(X)−Y)
其中α为步长。
正则化
逻辑回归也会面临过拟合问题,所以我们也要考虑正则化。常见的有L1正则化和L2正则化。
二元逻辑回归的L1正则化损失函数表达式如下:
J
(
θ
)
=
−
Y
T
l
o
g
h
θ
(
X
)
−
(
E
−
Y
T
)
l
o
g
(
E
−
h
θ
(
X
)
)
+
λ
∥
θ
∥
1
J(\theta) =- Y^Tlogh_\theta(X) - (E - Y^T)log(E - h_\theta(X)) + \lambda \left \|\theta \right \|_1
J(θ)=−YTloghθ(X)−(E−YT)log(E−hθ(X))+λ∥θ∥1
二元逻辑回归的L2正则化损失函数表达式如下:
J
(
θ
)
=
−
Y
T
l
o
g
h
θ
(
X
)
−
(
E
−
Y
T
)
l
o
g
(
E
−
h
θ
(
X
)
)
+
1
2
λ
∥
θ
∥
2
J(\theta) =- Y^Tlogh_\theta(X) - (E - Y^T)log(E - h_\theta(X)) +\frac{1}{2} \lambda \left \|\theta \right \|_2
J(θ)=−YTloghθ(X)−(E−YT)log(E−hθ(X))+21λ∥θ∥2
其中
∥
θ
∥
1
\left \|\theta \right \|_1
∥θ∥1为θ的
L
1
L_1
L1范数,
∥
θ
∥
2
\left \|\theta \right \|_2
∥θ∥2为θ的
L
2
L_2
L2范数,λ为正则化系数,逻辑回归的
L
1
L_1
L1正则化损失函数的优化方法常用的有坐标轴下降法和最小角回归法。逻辑回归的
L
2
L_2
L2正则化损失函数的优化方法和普通的逻辑回归类似。
2,应用调参
这里主要根据scikit-learn库中的LogisticRegression的参数进行说明。
penalty:惩罚项,str类型,可选参数为l1和l2,默认为l2。
c:正则化系数λ的倒数,float类型,默认为1.0。越小的数值表示越强的正则化。
solver:优化算法选择参数,只有五个可选参数,即newton-cg,lbfgs,liblinear,sag,saga。默认为liblinear。关于优化算法日后另写一篇详细介绍。
3,面试问题
1.逻辑斯蒂回归推导
2.简述一下线性回归
3.为什么逻辑斯特回归中使用最大似然函数求得的参数是最优可能的参数值?
这里主要考察的是似然函数的性质。在统计学中,概率是在特定环境下某件事情发生的可能性,似然刚好相反,是在确定的结果下去推测产生这个结果的可能环境(参数)。概率描述的是在一定条件下某个事件发生的可能性,概率越大说明这件事情越可能会发生;而似然描述的是结果已知的情况下,该事件在不同条件下发生的可能性,似然函数的值越大说明该事件在对应的条件下发生的可能性越大。具体细节可参考最大似然估计(Maximum likelihood estimation)(通过例子理解)
4.逻辑回归是线性模型吗?
逻辑回归是广义的线性模型,就是在线性回归基础上加了一个非线性映射。
5.逻辑回归做分类的样本应该满足什么分布?
伯努利分布,
P
r
(
x
∣
p
)
Pr(x|p)
Pr(x∣p)是根据伯努利分布概率函数得到的,具体可参考百度百科 伯努利分布
6.逻辑回归输出的值是0到1之间的值,这个值是真实的概率吗?
不是,实际上反应的是该点到划分线的距离,但很多地方会认为它是一个接近真实概率的值。
7.逻辑回归与线性回归的联系和区别?
联系:逻辑回归是在线性回归上添加一个函数映射得到的。两者都属于广义线性模型,具体的说都是从指数族分布导出的线性模型。
区别:数据假设不同;逻辑回归用来分类,线性回归用来预测(输出实质变量);线性回归用MLE求解参数,线性回归用最小二乘法来求解(其实这一点也不算区别,线性回归最小二乘法也是由MLE推导来的)。线性回归假设样本的分布为高斯分布,则用极大似然估计导出的损失函数为最小均方误差损失;逻辑回归假设样本分布服从伯努利分布,则导出的损失函数为交叉熵损失函数。
8.逻辑回归会发生过拟合吗?如何解决?
会,原因可能是样本数量少;数据不规范;特征数量过多;
解决方法:增加样本;数据重新清洗;减少特征数量;减少迭代次数(early stop),适当加大学习率;正则化;融合几个模型;
9.什么是特征离散化和特征交叉?
特征离散化: 线性特征转化成离散特征,例如年龄可以转换成青年、中年和老年。
特征交叉:多个维度的特征形成新的特征,也就是衍生变量。参考资料:【机器学习】逻辑回归特征的离散化与交叉
10.逻辑斯特回归为什么要对特征进行离散化?
特征增删容易,易于迭代;计算速度快,方便存储;离散特征具有鲁棒性;从线性到离散型相当于为模型引入了非线性,能够提升模型表达能力,加大拟合; 特征交叉进一步引入非线性,提升表达能力;特征离散化后,模型会更稳定;特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。参考资料:今日面试题分享:逻辑斯特回归为什么要对特征进行离散化
11.在逻辑回归模型中,为什么常常要做特征组合(特征交叉)?
离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
12.逻辑回归在训练的过程当中,如果有很多的特征高度相关或者说有一个特征重复了100遍,会造成怎样的影响?
先说结论,如果在损失函数最终收敛的情况下,其实就算有很多特征高度相关也不会影响分类器的效果。
但是对特征本身来说的话,假设只有一个特征,在不考虑采样的情况下,你现在将它重复100遍。训练以后完以后,数据还是这么多,但是这个特征本身重复了100遍,实质上将原来的特征分成了100份,每一个特征都是原来特征权重值的百分之一。
如果在随机采样的情况下,其实训练收敛完以后,还是可以认为这100个特征和原来那一个特征扮演的效果一样,只是可能中间很多特征的值正负相消了。
13.为什么逻辑回归在训练的过程当中将高度相关的特征去掉?
去掉高度相关的特征会让模型的可解释性更好
可以大大提高训练的速度。如果模型当中有很多特征高度相关的话,就算损失函数本身收敛了,但实际上参数是没有收敛的,这样会拉低训练的速度。其次是特征多了,本身就会增大训练的时间。
14.逻辑回归最优化过程中如何避免局部极小值?
逻辑回归优化算法一般采用梯度下降算法,而梯度下降算法容易陷入局部最优。主要解决方法有:[1]使用随机梯度下降代替真正的梯度下降。[2]设置动量,momentum相当与记忆住上一次的更新。这样,也不再是按照标准路线前进,每次的步骤都容易受到上一次的影响,从而可能会逃出局部最优。另外,也会加大步长,从而加快收敛。[3]不同的初始权值进行训练。
15.线性回归的损失函数里面为什么常用平方形式, 而不是1次方,3次方,4次方或者绝对值?
16.逻辑回归特征系数的绝对值可以认为是特征的重要性吗?
逻辑回归的特征系数的绝对值越大,对分类效果的影响越显著,然而并不能简单认为特征系数更大的特征更重要。原因有以下亮点:1,改变变量的尺度就会改变系数绝对值。2, 如果特征是线性相关的,则系数可以从一个特征转移到另一个特征。此外,数据集特征越多,特征间越可能线性相关,用系数解释特征的重要性就越不可靠。
17.如何使用逻辑回归实现多分类?
One Vs One Many Vs Many: 将数据分为任意两组进行逻辑回归。
One Vs All:将数据分为A类和非A类进行逻辑回归。
Softmax:不展开
18.逻辑回归的损失函数为什么要使用极大似然函数作为损失函数?
一方面这是由于样本分布满足伯努利分布,可以直接从最大熵模型导出Hypothesis函数(二分类sigmoid,多分类softmax)后用极大似然即可导出目标函数为交叉熵损失函数。
另一方面不考虑模型背后的概率意义,选用交叉熵损失函数相比于平方损失函数,可以使得模型在求解最优解的过程中相对平稳,而不至于造成梯度消失等情况。具体参见之前的一篇文章二次损失函数的不足及交叉熵损失softmax详解
19. 逻辑回归参数归一化是否对结果有什么影响吗?
数据归一化之后可以使得梯度下降更为快速,同时避免取值较小特征的参数影响更大的问题,可以提升模型的精度。
20.逻辑回归有哪些优缺点
在这里我们总结了逻辑回归应用到工业界当中一些优点:
- 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
-模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。 - 训练速度较快,易于并行实现。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
- 资源占用小,尤其是内存。因为只需要存储各个维度的特征值。
- 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。
但是逻辑回归本身也有许多的缺点:
- 准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
- 很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
- 处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 。
- 逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。
4,参考资料
逻辑回归常见面试题总结
机器学习面试题汇总(逻辑斯蒂回归相关)
逻辑回归原理小结
scikit-learn 逻辑回归类库使用小结
LogisticRegression - 参数说明
逻辑回归常见面试点总结
线性回归和逻辑回归常见问题
李航 《统计学习方法》