您的位置:首页 > 职场人生

给面试官讲逻辑回归

2020-04-02 18:49 1781 查看

逻辑回归

文章目录

一、口述一下逻辑回归

       逻辑回归是用来解决二分类问题的。它假设数据服从二项分布(伯努利分布),通过极大似然估计,结合梯度下降算法求得最优参数,从而实现分类的目的。
       极大似然估计要最大化的就是分类正确的概率P,分类正确的概率即为所有正样本为正的概率积乘以负样本为负的概率积,逻辑回归的目的就是要使得分类正确的概率最大。所以,逻辑回归的目标函数就是一个样本为正样本的概率。
       最理想的情况肯定是正样本为正的概率是1,负样本为负的概率也是1,但是这样的模型是不可导的,就无法用梯度下降去求极值,因此想到了用sigmoid函数这么一个近似理想目标函数的一个可导函数作为一个替代的目标函数,这样就可以带入极大似然估计的公式中,通过梯度下降去求解最优参数了。这样,最终的分类器就是一个sigmoid(θ\thetaθx)函数,表示的是样本为正样本的概率,如果大于50%就认为样本属于正类,反之负例。

二、推导一下逻辑回归

(首先给出一个情景)有m个带标签的样本组成的数据集(xi,yi)(x_i, y_i)(xi​,yi​),其中,xi=[xi1,...,xin]x_i = [x_{i1}, ..., x_{in}]xi​=[xi1​,...,xin​],代表每个样本有n个特征; yi∈y_i \inyi​∈{1, 0},代表二分类问题。

P(y=1∣x;θ=g(z)=11+exp(−z)P(y=1|x;\theta = g(z) = \frac{1}{1+exp(-z)}P(y=1∣x;θ=g(z)=1+exp(−z)1​,其中,θ=[θ1\theta = [\theta_{1}θ=[θ1​, …, θn]T\theta_{n}]^Tθn​]T, z=θxz = \theta xz=θx

P(分类正确)=∏i=1mP(yi=1∣x)iy⋅P(yi=0∣x)1−yiP(分类正确) = \prod _{i = 1}^mP(y_i=1|x)^y_i \cdot P(y_i=0|x)^{1-y_i}P(分类正确)=∏i=1m​P(yi​=1∣x)iy​⋅P(yi​=0∣x)1−yi​

对数似然函数lnP=∑i=1m[ylnP(yi=1∣x)+(1−y)lnP(yi=0∣x)]lnP = \sum _{i = 1}^m[ylnP(y_i=1|x) + (1-y)lnP(y_i=0|x)]lnP=∑i=1m​[ylnP(yi​=1∣x)+(1−y)lnP(yi​=0∣x)]

要使似然函数最大,损失函数L=−lnP=−∑i=1m[yilng(z)+(1−yi)ln(1−g(z))]L = -lnP = -\sum_{i=1}^m[y_i lng(z) + (1-y_i)ln(1-g(z))]L=−lnP=−∑i=1m​[yi​lng(z)+(1−yi​)ln(1−g(z))],即为交叉熵损失。

通过梯度下降求最优解,需要每一步更新参数θj:=θj−∂L∂θj\theta_j := \theta_{j} - \frac{\partial L}{\partial \theta_j}θj​:=θj​−∂θj​∂L​

∂L∂θj=∂L∂g(z)∂g(z)∂z∂z∂θj=−∑i=1m[yi1g(z)−(1−yi)11−g(z)]⋅g(z)(1−g(z))⋅xij\frac{\partial L}{\partial \theta_j} = \frac{\partial L}{\partial g(z)} \frac{\partial g(z)}{\partial z} \frac{\partial z}{\partial \theta_j}=-\sum_{i=1}^m[y_i\frac{1}{g(z)} - (1-y_i)\frac{1}{1 - g(z)}] \cdot g(z)(1-g(z)) \cdot x_{ij}∂θj​∂L​=∂g(z)∂L​∂z∂g(z)​∂θj​∂z​=−∑i=1m​[yi​g(z)1​−(1−yi​)1−g(z)1​]⋅g(z)(1−g(z))⋅xij​

=−∑i=1m[yi(1−g(z))−(1−yi)g(z)]⋅xij=-\sum_{i=1}^m[y_i(1-g(z)) - (1 - y_i)g(z)] \cdot x_{ij}=−∑i=1m​[yi​(1−g(z))−(1−yi​)g(z)]⋅xij​

=−∑i=1m[yi−g(z)]⋅xij=-\sum_{i=1}^m[y_i - g(z)] \cdot x_{ij}=−∑i=1m​[yi​−g(z)]⋅xij​

=∑i=1m[g(z)−yi]⋅xij=\sum_{i=1}^m[g(z)-y_i] \cdot x_{ij}=∑i=1m​[g(z)−yi​]⋅xij​ , 理解起来就是所有样本当前预测结果和真实标签的差值再待乘上待更新特征值的总和。

最终的梯度更新公式即为:θj:=θj−α∑i=1m[g(z)−yi]xij\theta_j := \theta_j - \alpha\sum_{i=1}^m[g(z)-y_i]x_{ij}θj​:=θj​−α∑i=1m​[g(z)−yi​]xij​

向量形式的偏导

在计算机计算中,求和往往要消耗大量内存,因此在实际代码中,常用向量形式。
定义:X=[x1,...,xm]T,Y=[y1,...,ym]T,θ=[θ1X =[x_1, ..., x_m]^T, Y = [y_1, ...,y_m]^T, \theta = [\theta_{1}X=[x1​,...,xm​]T,Y=[y1​,...,ym​]T,θ=[θ1​, …, θn]T\theta_{n}]^Tθn​]T。

则有,z=Xθ,g(z)=g(Xθ),g(Xθ)−yi=g(Xθ)−Yz = X\theta, g(z) = g(X\theta), g(X\theta)-y_i=g(X\theta )-Yz=Xθ,g(z)=g(Xθ),g(Xθ)−yi​=g(Xθ)−Y

从而,∑i=1m[g(z)−yi]xij=XT⋅[g(Xθ)−Y]\sum_{i=1}^m[g(z)-y_i]x_{ij} = X^T\cdot [g(X\theta)-Y]∑i=1m​[g(z)−yi​]xij​=XT⋅[g(Xθ)−Y]

最终的梯度更新公式即为:θ:=θ−αXT⋅[g(Xθ)−Y]\theta := \theta - \alpha X^T \cdot [g(X\theta) - Y]θ:=θ−αXT⋅[g(Xθ)−Y],一次就可以更新所有θ\thetaθ。

三、代码实现逻辑回归

import numpy as np

class LRclassifer:
def __init__(self):
self.theta = None

def sigmoid(self, x): # sigmoid函数
return 1/(1 + np.exp(-x))

def gradDescent(self, X, Y, alpha, maxIteration): # 梯度下降求最优参数
# input
# X: train_data
# Y: label
# alpha: learning rate
# maxIteration: max interation to end
# return
# theta: weights
for i in range(len(X)): X[i].append(1) # 给每个维度增加一个偏置
X, Y = np.array(X), np.array(Y)
pre_theta = np.ones(X.shape[1]) # 初始化权值为1
i = 0 # 迭代次数
while i < maxIteration:
cur_theta = pre_theta - alpha * np.dot(X.T, self.sigmoid(np.dot(X, pre_theta))- Y)
if abs(cur_theta - pre_theta).all() <= 0.001: # 如果参数不跟新了,则跳出
break
pre_theta = cur_theta
i += 1
return pre_theta

def tarining(self, X, Y, alpha, maxIneration): # 训练参数
self.theta = self.gradDescent(X, Y, alpha, maxIneration)

def predict(self, x): # 预测一个新样本的类别
x.append(1)
return 1 if self.sigmoid(np.dot(self.theta.T, x)) > 0.5 else 0

def main(): # 测试
train_data = [[1,8], [2,6], [0,7], [9,1], [10,3], [8, 0]]
label = [1, 1, 1, 0, 0, 0]
cls = LRclassifer()
cls.tarining(train_data, label, 0.001, 500)
l1 = cls.predict([1, 7])
l2 = cls.predict([10, -1])
l3 = cls.predict([5, 5])
print(l1, l2, l3) # 应该是1, 0

main()

四、常见问题(面经)整理

1. 逻辑回归的优缺点
优点:(1)结构简单,效果还行,工程上可以接受LR作为Baseline。(2)可解释性好,参数的大小代表了该特征对结果的影响程度大小。(3)内存消耗下,训练过程中只需要存储每次的参数值。(4)训练速度快,可并行计算不同特征的参数。(5)输出概率,方便调整结果(6)对异常值不敏感(解释一下:sigmoid函数会把θx\theta xθx的取值压缩到0~1的范围内,在梯度下降过程中会弱化较大较小值的影响)
缺点:(1)准确率并不高,因为本身形式非常简单,难以拟合真实分布。(2)难以解决异或问题,因为决策面是线性的,θTx=0\theta^Tx = 0θTx=0,需要复杂特征工程。(3)难以处理数据不平衡问题。

2. 逻辑回归和线性回归的关系
(1)逻辑回归是广义线性回归,当用线性回归求解分类问题时,P=θxP = \theta xP=θx,左侧的取值范围是[0, 1],右侧是[0,∞][0, \infty][0,∞],为了左右取值范围相等,因此在线性回归上加了一层映射lny1−y=θxln\frac{y}{1-y} = \theta xln1−yy​=θx,转换过来就是sigmoid函数。(2)逻辑回归和线性回归都属于指数族分布,前者的损失函数的输出y的伯努利分布,后者是输出y的高斯分布。(3)线性回归解决的问题是回归问题,输出的是连续值,逻辑回归解决的是分类问题,输出的是概率值,最终会转换成类别,也就是离散值。

3. 逻辑回归和朴素贝叶斯的关系
首先回顾一下朴素贝叶斯的公式的推导:

P(Y=k∣X)=P(X,Y)P(X)=P(X∣Y=k)P(Y=k)∑i=1KP(X∣Y=i)P(Y=i)P(Y=k|X)=\frac{P(X,Y)}{P(X)}=\frac{P(X|Y=k)P(Y=k)}{\sum_{i=1}^KP(X|Y=i)P(Y=i)}P(Y=k∣X)=P(X)P(X,Y)​=∑i=1K​P(X∣Y=i)P(Y=i)P(X∣Y=k)P(Y=k)​,其中K代表样本被分为K类。

当K=2时,即一个二分类任务,上式可以写为:

P(y=1∣x)=P(x∣y=1)P(y=1)P(x∣y=0)P(y=0)+P(x∣y=1)P(y=1)=11+P(x∣y=0)P(y=0)P(x∣y=1)P(y=1)=11+exp(−lnP(x∣y=1)P(y=1)P(x∣y=0)P(y=0))P(y=1|x)=\frac{P(x|y=1)P(y=1)}{P(x|y=0)P(y=0)+P(x|y=1)P(y=1)}=\frac{1} {1+\frac{P(x|y=0)P(y=0)}{P(x|y=1)P(y=1)}}=\frac{1}{1+exp(-ln\frac{P(x|y=1)P(y=1)}{P(x|y=0)P(y=0)})}P(y=1∣x)=P(x∣y=0)P(y=0)+P(x∣y=1)P(y=1)P(x∣y=1)P(y=1)​=1+P(x∣y=1)P(y=1)P(x∣y=0)P(y=0)​1​=1+exp(−lnP(x∣y=0)P(y=0)P(x∣y=1)P(y=1)​)1​

令lnP(x∣y=1)P(y=1)P(x∣y=0)P(y=0)=θTx=zln\frac{P(x|y=1)P(y=1)}{P(x|y=0)P(y=0)}=\theta^Tx=zlnP(x∣y=0)P(y=0)P(x∣y=1)P(y=1)​=θTx=z,就回到了我们熟悉的逻辑回归公式。那么,什么时候等式能够成立呢?

在朴素贝叶斯中,假设每个特征独立分布,从而P(Y=k∣xi)∝∏j=1nP(xij∣Y=k)⋅P(Y=k)P(Y=k|x_i)\propto\prod_{j=1}^nP(x_{ij}|Y=k)\cdot P(Y=k)P(Y=k∣xi​)∝∏j=1n​P(xij​∣Y=k)⋅P(Y=k),其中,xijx_{ij}xij​代表样本xix_ixi​的第jjj个特征。

若xijx_{ij}xij​是离散特征,记xij=[xij(1),xij(2),...,xij(t)]x_{ij}=[{x_{ij}^{(1)},x_{ij}^{(2)},...,x_{ij}^{(t)}}]xij​=[xij(1)​,xij(2)​,...,xij(t)​],是一个有t个取值的one-hot变量,只有某一维是1,其余维都是0。那么P(xij∣Y=k)=∏h=1tP(xij(h)=1∣Y=k)xij(h)=count(xij(h)=1)count(Y=k)P(x_{ij}|Y=k)=\prod_{h=1}^tP(x{ij}^{(h)}=1|Y=k)^{x_{ij}^{(h)}}=\frac{count(x{ij}^{(h)}=1)}{count(Y=k)}P(xij​∣Y=k)=∏h=1t​P(xij(h)=1∣Y=k)xij(h)​=count(Y=k)count(xij(h)=1)​。

对于二分类来说,上式可以写为:
P(xij∣Y=1)=∏h=1tP(xij(h)=1∣Y=1)xij(h)P(x_{ij}|Y=1)=\prod_{h=1}^tP(x{ij}^{(h)}=1|Y=1)^{x_{ij}^{(h)}}P(xij​∣Y=1)=∏h=1t​P(xij(h)=1∣Y=1)xij(h)​
P(xij∣Y=0)=∏h=1tP(xij(h)=0∣Y=1)xij(h)P(x_{ij}|Y=0)=\prod_{h=1}^tP(x{ij}^{(h)}=0|Y=1)^{x_{ij}^{(h)}}P(xij​∣Y=0)=∏h=1t​P(xij(h)=0∣Y=1)xij(h)​

从而:lnP(xi∣y=1)P(y=1)P(xi∣y=0)P(y=0)=∑h=1tP(xij(h)=1∣y=1)P(xij(h)=0∣y=0)xij(h)+lnP(y=1)P(y=0)=wTx+b=θTxln\frac{P(x_i|y=1)P(y=1)}{P(x_i|y=0)P(y=0)}=\sum_{h=1}^t\frac{P(x{ij}^{(h)}=1|y=1)}{P(x{ij}^{(h)}=0|y=0)}x_{ij}^{(h)}+ln\frac{P(y=1)}{P(y=0)}=w^Tx+b=\theta^TxlnP(xi​∣y=0)P(y=0)P(xi​∣y=1)P(y=1)​=∑h=1t​P(xij(h)=0∣y=0)P(xij(h)=1∣y=1)​xij(h)​+lnP(y=0)P(y=1)​=wTx+b=θTx,是关于x的线性形式。

若xijx_{ij}xij​为连续特征,假设xijx_{ij}xij​服从正态分布且在不同类别下的协方差相等时,也会有关于x的线性形式。

总结一下:(1)LR是概率判别模型,NB是生成式模型。(2)NB假设个特征独立,连续特征符合正态分布。LR没有这些限制,但是满足这些条件的时候,LR能够取得非常好的效果。但是当数据不满足时,也可以通过调整参数让模型最大化符合分布(调整方法:)。(3)NB对数据的需求量小一些,LR在整个线性空间搜索,需求量大。(4)NB和LR输出的都是概率,可解释性比较好。(5)NB可以先把数据集中所有要用到的概率提前计算好,存储下来,能够实现懒惰学习,有助于并行化。

4. 逻辑回归和SVM的异同
相同点:(1)都是解决的分类问题。(2)都是监督学习方法。(3)都是判别模型。(4)都能通过核技巧解决非线性情况。(5)均对异常值不敏感(一个通过sigmoid函数,一个通过支持向量,也算是一个不同点吧)
不同点:(1)损失函数不同,逻辑回归是交叉熵损失,SVM是hinge损失。(2)逻辑回归是软分类,对概率建模,SVM是硬分类,对超平面建模。(3)逻辑回归是处理经验风险最小化,SVM是结构风险最小化,SVM自带L2正则化项。
(解释:机器学习模型的损失函数可以抽象为:minf[Ω(f)+C∑i=1mloss(f(xi),y)]min_f[\Omega(f)+C\sum_{i=1}^mloss(f(x_i), y)]minf​[Ω(f)+C∑i=1m​loss(f(xi​),y)],Ω(f)\Omega(f)Ω(f)为结构风险,用于描述模型的某些性质,另一项是经验风险,用于描述模型和数据的契合程度。C用于折中两种风险。Ω(f)\Omega(f)Ω(f)表述了我们希望获得何种性质的模型(如间隔最小、复杂度较小),也就是常说的正则化项。)
(4)处理异常数据的方法,逻辑回归通过sigmoid函数非线性变化弱化,一个通过支持向量消去了影响。

5. 逻辑回归在训练过程中,如果有很多特征高度相关,或重复了很多遍,会造成怎样的影响
实际上,如果最终结果收敛,那么将不会影响分类器的效果。但对于特征本身来说,如果一个特征重复了n次,那么本质上是将权值分成了n份分给了每个重复的特征,最终的权值之和是相同的。例如,对于一个特征x1,训练出参数w1,有两个高度相关的特征x2和x3,训练出的参数是w2和w3,那么最终可能的结果是w2+w3=0,特征值抵消了,不会造成影响。

6. (接上一条)为什么还是会在训练过程中将高度相关的特征去掉
(1)因为去掉相关的特征会让模型的解释性更好。(2)会加速梯度下降过程,特征多了,本身训练时间就会增加,而且有很多特征高度相关的话,就算损失函数本身收敛了,实际参数是没有收敛的,也会拉低训练速度。

7. 逻辑回归的损失函数是什么
交叉熵损失,具体形式是L=−lnP=−∑i=1m[ylng(z)+(1−y)ln(1−g(z))]L=-lnP=-\sum_{i=1}^m[ylng(z) + (1-y)ln(1-g(z))]L=−lnP=−∑i=1m​[ylng(z)+(1−y)ln(1−g(z))]

8. 逻辑回归损失函数的偏导是什么
∂L∂θj=∑i=1m[g(z)−yi]xij\frac{\partial L}{\partial \theta_j}=\sum_{i=1}^m[g(z) - y_i]x{ij}∂θj​∂L​=∑i=1m​[g(z)−yi​]xij,向量形式为XT[g(Xθ)−Y]X^T[g(X\theta) - Y ]XT[g(Xθ)−Y]。

9. 逻辑回归中为什么使用对数损失而不用平方的损失
使用sigmoid作为样本为正的概率,同时将平方损失作为损失函数,构造出来的损失函数将会是非凸函数,难以收敛到全局最小值。并且,平方损失的导数与sigmoid值大小有关,收敛较慢,对数损失的导数和sigmoid值无关,只和预测值和真实值的差有关,差的越多,梯度越大,收敛越快。

10. 逻辑回归为什么用Sigmoid函数?这个函数有什么优缺点?为什么不用其他函数?
sigmoid是由指数族分布加上二项分布推出来,也可从朴素贝叶斯角度推导出来,这个函数可以将置于压缩至[0, 1]的区间,有利于输出概率,并且能够加速训练,弱化异常值的影响。

11. 逻辑回归可以用核吗?加什么正则可以用核?
可以,用L2正则化可以用核,类似SVM,加线性核、高斯核等等。

12. 逻辑回归可以用来处理非线性问题吗?可以像SVM那样吗?为什么?
可以,但是需要进行特征组合,使用多项式特征(例如x1+x22x_1 + x_2^2x1​+x22​)将空间映射到高维空间;或使用核技巧,将θx\theta xθx写成∑iθi<xi,x>\sum_i\theta_i<x_i,x>∑i​θi​<xi​,x>的形式,但是这样做的话,模型要存储各个θi\theta_iθi​和对应的xix_ixi​本身,存储量就比较大。核技巧试用于SVM是因为他是稀疏的,只有支持向量的θ\thetaθ为零,才需要存储相应的xix_ixi​,因此,逻辑回归中并不常用核技巧。

13. 为什么LR需要归一化或取对数,为什么特征离散化后效果更好,为什么特征组合后还能提升?
归一化和取对数能加速模型训练,加快收敛。离散和特征组合均能够提升模型的表达能力,使样本更容易线性可分,但要注意过拟合问题。

14. 为什么逻辑回归可以用来做CTR预估?
CTR预测本质上是一个二分类问题,把被点击的样本作为正例,未被点击的作为负例,逻辑回归正好可以用来解决这个问题,此外,逻辑回归具有求解简单、可解释性强、内存小、训练快、输出概率等优点,被工业界所看重。

15. 逻辑回归估计参数时的目标函数是什么?如果加上一个先验的服从高斯分布的假设,会变成什么样?
目标函数是最小化交叉熵损失函数,加上先验高斯分布即加上了一个L2正则化项:Loss=−∑i=12[yilng(θTxi)+(1−yi)ln(1−g(θTxi))]+λ2∑i=1nθTθLoss=-\sum_{i=1}^2[y_ilng(\theta^T x_i) + (1-y_i)ln(1-g(\theta^T x_i))] + \frac{\lambda}{2}\sum_{i=1}^n\theta^T\thetaLoss=−∑i=12​[yi​lng(θTxi​)+(1−yi​)ln(1−g(θTxi​))]+2λ​∑i=1n​θTθ

16. 逻辑回归正类是1,反类是-1时的损失函数是什么?
对于sigmoid函数,容易得到:g(−z)=1−g(z)g(-z) =1-g(z)g(−z)=1−g(z),从而P(y=1∣x)=g(z),P(y=−1∣x)=1−g(z)=g(−z)P(y=1|x)=g(z),P(y=-1|x)=1-g(z)=g(-z)P(y=1∣x)=g(z),P(y=−1∣x)=1−g(z)=g(−z),从而可以在极大似然函数里将两个概率结合起来:P(正确)=∏i=1mg(yz)P(正确)=\prod_{i=1}^mg(yz)P(正确)=∏i=1m​g(yz),因此损失函数即为Loss=−∑i=1mlng(yz)Loss=-\sum_{i=1}^mlng(yz)Loss=−∑i=1m​lng(yz)。

17. 逻辑回归与最大熵模型的关系
当无条件约束时,均匀分布的熵最大,但存在约束时,指数族模型的熵最大,而逻辑回归的服从伯努利分布的最大熵模型,是最大熵模型在二分类中的特例,推广到多分类,逻辑回归进化为Softmax。

18. sk-learn中LR的源码实现。
sk-learn中对逻辑回归的优化方法有四种:(1) liblinear,使用开源的liblinear库实现,内部使用坐标轴下降法迭代优化损失函数;(2) lbfgs,拟牛顿法的一种。(3) newton-cg,也是牛顿法的一种。(4) sag,随机平均梯度下降,sgd每轮根据当前样本值误差更新梯度,sag根据前几轮的平均梯度更新,效果更好,速度更快。其中,只有liblinear能用于带L1正则化的LR,因为L1正则化后损失函数不可导。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
本堂町小春 发布了11 篇原创文章 · 获赞 9 · 访问量 283 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: