ML模型2:逻辑回归

一些回归算法可以用来处理分类问题,以及一些分类算法可以进行回归预测,逻辑回归就属于前者。逻辑回归一般通过估计一个概率值,来表示一个样本属于某一类的概率。假如一个样本属于某一类的概率大于50%,那么就判该样本属于这一类。

优点:计算代价不高,易于理解和实现。

缺点:容易欠拟合,分类精度可能不高。

1. 实现分类

逻辑回归对样本概率的估计类似线性回归,也是计算出样本的一系列权重,然后将该权重线性加和之后输入到sigmoid函数中,进而计算出一个概率值。
p^=hθ(x)=σ(θTx)=σ(xθ) \hat{p}=h_{\theta}(x)=\sigma(\theta^T \cdot x)=\sigma(x\theta)
其中 θ\theta 即为权重,σ\sigma 即为sigmoid函数,如下:
σ(t)=11+et \sigma(t)=\frac{1}{1+e^{-t}}
sigmoid函数图象:
ML模型2:逻辑回归
sigmoid函数将 θTx\theta^Tx 的值域从 R\bf{R} 映射到 (0, 1),从而表示发生事件的概率值,所以我们可以根据计算出来的概率值来进行对样本进行分类:
y^={0p^<0.5,1p^0.5. \hat{y}=\begin{cases}0 \quad \hat{p}<0.5,\\1 \quad \hat{p}\geq 0.5.\end{cases}

2. 损失函数

我们既然是通过sigmoid函数的值来进行概率预测的,那么我们的目标就应该是找出一组权重参数θ,能够对于正样本使得sigmoid函数有一个高的输出值,而对于负样本有一个低的输出。
我们可以通过计算损失函数来逐步达到这一的目标。对于单个样本来说,损失函数如下公式。与线性回归的平方误差不同,此处使用的是对数损失(Q1. 为什么?):
c(θ)={log(p^)   y=1,log(1p^)y=0. c(\theta)=\begin{cases}-\log(\hat{p}) \quad\quad\ \ \ y=1,\\-\log(1-\hat{p}) \quad y=0.\end{cases}
对整个数据集损失函数如下:
J(θ)=1mi=1m[y(i)log(p^(i))+(1y(i))log(1p^(i))] J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}\log(\hat{p}^{(i)})+(1-y^{(i)})log(1-\hat{p}^{(i)})]
对以上损失函数并不像最小二乘法般有封闭解,但由于函数是凸函数,可以使用梯度下降的方法寻找最优值。

3. 极大似然估计

概率公式 hθ(x)h_{\theta}(x) 上面已经给出,对任意一个样本有
{P(y=1x;θ)=hθ(x)P(y=0x;θ)=1hθ(x) \begin{cases}P(y=1|x;\theta)=h_{\theta}(x)\\ P(y=0|x;\theta)=1-h_{\theta}(x)\end{cases}
对以上公式整合得:
P(yx;θ)=hθ(x)y(1hθ(x))1yP(y|x;\theta)=h_{\theta}(x)^y(1-h_{\theta}(x))^{1-y}
对所有样本,发生的概率为
L(θ)=i=1mP(y(i)x(i);θ)=i=1mhθ(x(i))y(i)(1hθ(x(i)))1y(i) L(\theta) =\prod_{i=1}^{m} P(y^{(i)}|x^{(i)};\theta) =\prod_{i=1}^{m} h_{\theta}(x^{(i)})^{y^{(i)}}(1-h_{\theta}(x^{(i)}))^{1-y^{(i)}}
对数似然
l(θ)=logL(θ)=i=1m(y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i))) l(\theta)=\log L(\theta) =\sum_{i=1}^{m} (y^{(i)} \log h_{\theta}(x^{(i)})+(1-y^{(i)}) \log (1-h_{\theta}(x^{(i)}))
引入 J(θ)=1ml(θ)J(\theta)=-\frac{1}{m}l(\theta) 作为损失函数,与上面得到的损失函数一致。
下面使用梯度下降求解。

4. 梯度下降求解

虽然损失函数看起来复杂,但得益于sigmoid函数,是其梯度计算后结果十分简单。
不难证明,对sigmoid函数求导得:
σ(t)=σ(t)(1σ(t))\sigma'(t)=\sigma(t)(1-\sigma(t))
J(θ)J(\theta) 求梯度,得:
ML模型2:逻辑回归
参数更新:
θj:=θjα1mi=1m(hθ(x(i))y(i))xj(i) \theta_j:=\theta_j-\alpha\frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)}
向量化表示:
θ:=θα1mxT(11+exθy) \theta:=\theta-\alpha\frac{1}{m} x^T(\frac{1}{1+e^{-x\theta}}-y)

5. 多分类问题softmax

softmax其实是Logistic的推广到多类别分类应用中,不需建立多个二分类分类器来实现多类别分类。softmax分类器的思想很简单,对于一个新的样本,softmax回归模型对于每一类都先计算出一个分数,然后通过softmax函数得出一个概率值,根据最终的概率值来确定属于哪一类。

通过下公式来计算并归一化之后就是输出的概率值:
p^k=σ(θkTx)=exp(θkTx)j=1Kexp(θjTx) \hat{p}_k=\sigma(\theta_k^Tx)=\frac{\exp(\theta_k^Tx)}{\sum_{j=1}^K\exp(\theta_j^Tx)}
计算出每一个分类的概率值后,从得到的各个概率值中选择最大的一个概率类别,即为预测类别 y^=argmax(p^k)\hat{y}=argmax(\hat{p}_k)

类似逻辑回归,我们可以通过损失函数求得最优解:
J(Θ)=1mi=1mk=1Kyk(i)log(exp(θkTx(i))j=1Kexp(θjTx(i)))) J(\Theta)=-\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K} y_k^{(i)}\log{(\frac{\exp(\theta_k^Tx^{(i)})}{\sum_{j=1}^K\exp(\theta_j^Tx^{(i)}))}})
该损失函数又称为交叉熵,交叉熵常在机器学习中作为损失函数,比方说p表示真实类别的分布,q则为训练后的模型的预测类别分布,交叉熵损失函数可以衡量p与q的相似性。与逻辑回归类似,依然可以用梯度下降法求解。

6. Sklearn示例

官方文档

from sklearn import linear_model
clf = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6)

参数列表

参数 解释 数值类型(默认值) 选项
penalty 惩罚项,用于指定惩罚中使用的范式 str,默认l2 l1/l2
dual 用于指定使用对偶形式还是原形式;对偶形式只有在liblinear solver使用l2范式时设定;当样本数>特征数时,通常dual=False bool,默认False True/False
tol 停止标准的容忍度 float,默认1e-4
C 正则化强度的倒数;必须是一个正浮点数; float(1.0)
fit_intercept 指定是否应该在决策函数中添加一个常数(也称为偏差或截距) bool(True) True/False
intercept_scaling 只有当’liblinear’被用,并且self.fit_intercept也设置为True时,该参数有效 float(1)
class_weight 与类别标签相关的权重,如果没有给出,所有类的权重都为1;'balanced’根据y的值自动调节与类频率成反比的权重 默认(None) dict/balanced
random_state 对数据洗牌的时候伪随机数生成器的种子; 可选参数,default(None) int/Random State instance/None
solver 指定用于优化问题的算法 ;[取值说明待定] str(‘liblinear’) newton-cg/lbfgs/liblinear/sag/saga
max_iter 仅当newton-cg/sag/lbfgs使用的时候有效;最大的迭代次数 int(100)
multi_class 分类方式的选择 str(ovr) ovr/multinomial/auto
verbose solver是liblinear或者lbfgs时,设置此参数为任意的正数来应对冗长问题 int(0)
warm_start 当设置为True时,重复使用上次的解决方案以适应初始化,否则只需要擦除上次的解决方案;除非是solver是‘liblinear’ bool(False) True/False
n_jobs 可选参数,当multi_class=‘ovr’,并行化处理时使用的CPU核数 default(None) int/None

属性:

属性 解释
coef_ array,shape(1,n_features)/(n_classes,n_features) ,输入模型的系数(权重)
intercept_ array,shape(1,)/(n_classes,) 截距
n_iter_ array,shape(n_classes,)/(1,) ,所有类的实际迭代次数。如果二进制或多项式,它只返回1个元素。对于liblinear求解器,只给出了所有类中迭代的最大数量。

Q&A

Q1. 为什么使用对数损失函数?

损失函数:平方损失函数 / 对数损失函数 / HingeLoss(0-1损失函数) / 绝对值损失函数

  1. 因为sigmoid函数非凸,使用平方损失得出的损失函数也是非凸,梯度下降后不一定能获取最小值。但是使用对数损失后,损失函数为凸函数,必定能找到最小值。
  2. 使用对数函数后,与极大对数似然的式子几乎一致,从概率理论上有理论证明。

Q2. 逻辑回归和线性回归有什么区别?(面试题

预测结果 - 线性回归的预测结果是连续的,逻辑回归的结果是离散的;
假设函数 - 逻辑回归在线性回归的实数范围输出上施加了sigmoid函数,将值收敛在0-1之间;
损失函数 - 线性回归是均方误差(平方损失),逻辑回归是对数似然函数(对数损失)。

参考:

  1. 机器学习-周志华
  2. ML模型3:逻辑回归模型
  3. 逻辑回归(logisitic regression)
  4. sklearn官方文档