# LogisticRegression 逻辑回归
逻辑回归是一种统计学中的经典分类模型,其本质是假设数据服从某个分布,然后使用极大似然来估计这个分布的参数。逻辑回归可以解决二分类问题也可以解决多分类问题。
逻辑回归 python 实现:[这里](https://github.com/TryFire/Machine-Learning-Algos-theory-and-implementation/blob/master/LogisticRegression/logistic_regression.py)
**二分类逻辑回归定义**假设数据集 $(x_1,y_1),\dots,(x_i,y_i),\dots,(x_N,y_N),x_i \in \mathbb{R^n}, y_i \in \{0,1\}$, $x_i$ 代表第 $i$ 个样本的特征向量,$y_i$ 代表第 $i$ 个样本的标签,二分逻辑回归模型是如下的条件概率分布:
$$
\begin{align}
& P(y=1|x) = \frac{\exp(w^Tx+b)}{1+\exp(w^Tx+b)} = \frac{1}{1+\exp(-(w^Tx+b))} \\
& P(y=0|x) = 1- P(y=1|x)= \frac{1}{1+\exp(w^Tx+b)} \\
\end{align}
$$
其中$(w \in \mathbb{R^n},b \in \mathbb{R})$是参数。为了简化,可以令$w = [b,w_1,\dots,w_n],x=[1,x_1,\dots,x_n]$, 并且令 $\sigma(t) = \frac{1}{1+\exp(-t)}$,那么如上条件概率就可以简化为:
$$
\begin{align}
& P(y=1|x) = \sigma(w^Tx) \\
& P(y=0|x) = 1-\sigma(w^Tx) = \sigma(-w^Tx) \\
\end{align}
$$
逻辑回归模型就比较两个条件概率值的大小,将实例 $x$ 归类到概率比较大的那一类。
其实逻辑回归和感知器有相似之处。感知器中把$w^Tx=0$看做是分类的超平面,$w^Tx>0$和$$w^Tx<0$$ 分别归到两类。在逻辑回归中,如果$w^Tx>0$,那么$P(y=1|x)>0.5,P(y=0|x)<0.5$,如果$$w^Tx<0$$,那么$P(y=1|x)<0.5,P(y=0|x)>0.5$,正好 $w^Tx=0$ 是二分类的界限。逻辑回归针对一个输入,输出一个把输入划分给某个类概率值,很直观。
## 用极大似然估计来学习参数$w$
这里假设每个输入 $x_{i}$ ,其标签服从参数为 $p(x_i)=\sigma(w^Tx)$ 的伯努利分布,也就是说针对 $x_i$,$P(y_i=1|x_i) = p(x_i)$,所以对$x_i$ 来说,其标签为$y_i$ 的概率为$P(y_i|x_i) = p(x_i)^{y_i}*(1-p(x_i))^{1-y_i}$。训练集 $(x_1,y_1),\dots,(x_i,y_i),\dots,(x_N,y_N),x_i \in \mathbb{R^n}, y_i \in \{0,1\}$的似然函数为:
$$
\begin{align*}
L(w) & = P(y_1,\dots,y_i,\dots,y_N | x_i,\dots,x_i,\dots,x_N) \\
& = \prod_{i=1}^{N} P(y_i|x_i) \ (假设每个样本独立) \\
& = \prod_{i=1}^{N} p(x_i)^{y_i}*(1-p(x_i))^{1-y_i}\\
& = \prod_{i=1}^{N} \sigma(w^Tx_i)^{y_i}*(1-\sigma(w^Tx_i))^{1-y_i}
\end{align*}
$$
我们是想找到参数$w$使得$L(w)$ 越大越好,即 $\max L(w)$,这又等价于 $\min -\log(L(w))$,所以我们的损失函数就出来了:
$$
\begin{aligned}
\text{Loss}(w) & = -\log(L(w)) \\
& = -\log(\prod_{i=1}^{N} \sigma(w^Tx_i)^{y_i}*(1-\sigma(w^Tx_i))^{1-y_i}) \\
& = -[ \sum_{i=1}^{N} y_i \log(\sigma(w^Tx_i)) + (1-y_i)\log(\sigma(-w^Tx_i)) ] \\
& = -[\sum_{i=1}^{N} y_i \log(\sigma(w^Tx_i)) - y_i\log(\sigma(-w^Tx_i)) + \log(\sigma(-w^Tx_i)) ] \\
& = -[\sum_{i=1}^{N} y_i \log(\frac{\sigma(w^Tx_i)}{\sigma(-w^Tx_i)}) + \log(\sigma(-w^Tx_i)) ] \\
&= -[\sum_{i=1}^{N} y_i \log(\frac{P(y_i=1|x_i)}{P(y_i=0|x_i)}) + \log(P(y=0|x)) ] \\
&= -[\sum_{i=1}^{N} y_i \log(\frac{\frac{\exp(w^Tx_i)}{1+\exp(w^Tx_i)}}{\frac{1}{1+\exp(w^Tx_i)}}) + \log(\frac{1}{1+\exp(w^Tx_i)}) ] \\
&= \sum_{i=1}^{N} \log(1+\exp(w^Tx_i)) - y_i(w^Tx_i) \\
\end{aligned}
$$
我们的目标就是找到合适的$w$ 来最小化无约束损失函数:
$$
\min \text{Loss}(w) = \min_{w \in \mathbb{R^{n+1}}} \sum_{i=1}^{N} \log(1+\exp(w^Tx_i)) - y_i(w^Tx_i)
$$
### 求解 $\min \text{Loss}(w)$
要求解 $\min \text{Loss}(w)$,我们常用的办法是如果函数 $\text{Loss}(w)$ 是凸函数(convex),并且其一阶导数等于0不可解(没有**闭式解**),那么我们可以用梯度下降法(SGD)来求解可以最小化 $\text{Loss}(w)$的近似解。
证明 $\text{Loss}(w)$是凸函数一般有这几种方法:
- 如果 $f(\frac{a+b}{2}) \leq \frac{f(a)+f(b)}{2},\forall a,b \in I$ ,那么函数 $f$ 在区间 $I$ 上是convex的。
- 如果 $f(a) \geq f(b) + f^{'}(b)(a-b), \forall a,b \in I$,那么函数 $f$ 在区间 $I$ 上是convex的。
- 如果 $f^{''}(x) \geq 0, \forall x \in I$ ,么函数 $f$ 在区间 $I$ 上是convex的。
- 函数$f$由一些基本的凸函数的组合,比如$g(x)$ 是convex,那么$f(x) = c*g(x),f(x) = g(ax+b)$ 或者多个凸函数的线性组合。
如果我们可以证明 $g(w) = \log(1+\exp(w^Tx_i)) - y_i(w^Tx_i)$ 是convex,那么 $\text{Loss}(w)$ 也是convex的。
用第一种方法好像有点难,我们先求一下$g(w)$的一阶导数:
$$
\begin{align}
\frac{\partial g(w)}{\partial w^{(m)}} = \frac{\exp(w^Tx_i)x_{i}^{(m)}}{1+\exp(w^Tx_i)} - y_ix_i^{(m)}
\end{align}
$$
其中$w^{(m)}$是$w$的第$(m)$维的值,$x_{i}^{(m)}$ 是 $x_i$ 这个向量的第$(m)$维的值。
看起来用第三种方法会比较简便,就是求解$g(w)$的**Hessian矩阵 $\frac{\partial^2 g(w)}{\partial w^{(m)}\partial w^{(n)}}$** :
$$
\begin{aligned}
\frac{\partial^2 g(w)}{\partial w^{(m)}\partial w^{(n)}} & = - \frac{\exp(-w^Tx_i)(-x_i^{(n)})}{(1+\exp(-w^Tx_i))^2}x_i^{(m)} \\
& = \frac{\exp(-w^Tx_i)}{1+\exp(-w^Tx_i)}\frac{1}{1+\exp(-w^Tx_i)}x_i^{(m)}x_i^{(n)} \\
& = \sigma(w^Tx_i)(1-\sigma(w^Tx_i))x_i^{(m)}x_i^{(n)}
\end{aligned}
$$
可以得到**Hessian矩阵**:
$$
\nabla^2g(w) = \alpha (x_ix_i^T)
$$
其中 $\alpha =\sigma(w^Tx_i)(1-\sigma(w^Tx_i)) > 0, \forall w,x_i$ 。其中 $x_i x_i^T$ 是熟悉的二次函数,所以 $x_i x_i^T >= 0\forall x_i$ ,由此我们可以得出 $\nabla^2g(w) \geq 0, \forall w$ ,所以 $g(w)$ 是convex的。因为 $\text{Loss}(w)$ 是由多个 $g(w)$ 线性组合而成,所以 $\text{Loss}(w)$ 也是convex的。
### SGD
因为$\text{Loss}(w)$是convex,我们可以用$\nabla_w \text{Loss}(w) = 0$ 来获得最优的 $w$ :
$$
\begin{align}
\nabla_w \text{Loss}(w) & = \sum_{i=1}^N (\frac{\exp(w^Tx_i)}{1+\exp(w^Tx_i)} - y_i)x_i \\
& = \sum_{i=1}^N (\sigma(w^Tx_i) - y_i)x_i \\
\end{align}
$$
可惜我们无法求出使得$\nabla_w \text{Loss}(w) = 0 $时候的解,所以可以用梯度下降法(SGD)来求解可以最小化 $\text{Loss}(w)$的近似解。
令$Q_i = \sigma(w^Tx_i), Y_i = y_i, X_i = x_i, Q \in \mathbb{R}^{N \times 1},Y \in \mathbb{R}^{N \times 1}, X \in \mathbb{R}^{N \times (n+1)}$,则更新规则:
$$
\begin{align}
w^{\text{new}} & = w^{(\text{old})} - \eta \nabla_w \text{Loss}(w) \\
& = w^{(\text{old})} - \eta X^T(Q-Y)
\end{align}
$$
其中$\eta \in (0,1]$是学习速率。
### 牛顿法
我们发现$\text{Loss}(w)$在任意一处是高阶可导的,所以可以对其在当前$w^{\text{old}}$处进行泰勒展开:
$$
\text{Loss2}(w) = \text{Loss}(w^{\text{old}}) + \text{Loss}^{(1)}(w^{\text{old}})(w - w^{\text{old}}) + \frac{\text{Loss}^{(2)}(w^{\text{old}})(w - w^{\text{old}})^2 }{2}
$$
这样我们得到了一个新的损失函数$\text{Loss2}(w)$的表达式。而且我们发现它是convex的,所以可以试着求解使得$\nabla_w\text{Loss2}(w) = 0$ 的解:
$$
\nabla_w\text{Loss2}(w) = \text{Loss}^{(1)}(w^{\text{old}}) + \text{Loss}^{(2)}(w^{\text{old}})(w - w^{\text{old}}) = 0 \\
w = w^{\text{old}} - h^{-1}g
$$
其中$h = \text{Loss}^{(1)}(w^{\text{old}})$ 是原损失函数$\text{Loss}(w)$的一阶导数,$g=\text{Loss}^{(2)}(w^{\text{old}})$是原损失函数$\text{Loss}(w)$的二阶导数,$h^{-1}$ 是矩阵 $h$ 的逆。
原损失函数$\text{Loss}(w)$的一阶和二阶导数很好求啊。其中一阶导数在随机梯度下降部分已经求过,我们copy一下:
$$
\begin{align}
g = \text{Loss}^{(1)}(w^{\text{old}}) & = \sum_{i=1}^N (\sigma({w^{\text{old}}}^Tx_i) - y_i)x_i \\
\end{align}
$$
二阶导数在证明 $\text{Loss}(w)$ 是convex的时候求解了一部分了,我们只需要加上累加符号:
$$
\begin{aligned}
\frac{\partial \text{Loss}(w)}{\partial w^{(m)}\partial w^{(n)}} & = \sum_{i=1}^N \sigma(w^Tx_i)(1-\sigma(w^Tx_i))x_i^{(m)}x_i^{(n)} \\
h & = \text{Loss}^{(2)}(w^{\text{old}}) = X^T A X
\end{aligned}
$$
其中$X_i = x_i, X \in \mathbb{R}^{N \times (n+1)}$, $A_{i,i} = \sigma(w^Tx_i)(1-\sigma(w^Tx_i)), A \in \mathbb{R}^{N \times N}$ , A 是对角矩阵。这里的$w$ 都用该用当前的$w^{\text{old}}$ 。
有了 $\text{Loss}(w)$ 的一阶和二阶导数,我们就可以利用更新规则对$w$ 进行更新了:
$$
w = w^{\text{old}} - \eta h^{-1}g
$$
其中$\eta \in (0,1]$是学习速率。
#### Iteratively reweighted least squares (IRLS) 法
有空补
## 正则化
当模型复杂度过大时候,模型会产生过拟合现象,所以需要选择复杂度适当的模型。可以使用正则化,在损失函数上加一个正则化项,或者对模型结构复杂度的一个惩罚项,来防止过拟合。常用的正则化有$L1$ 和$L2$ 正则。
### L1正则
我们直接在 $\text{Loss}(w)$上加一个代表模型复杂度的 $w$ 的$L1$ 范式。
$$
\text{Loss}(w) = \sum_{i=1}^{N} \left ( \log(1+\exp(w^Tx_i)) - y_i(w^Tx_i) \right ) + \lambda \sum_{k=1}^{n+1} |w_k|
$$
其中$\lambda > 0$ 用于调整经验风险和惩罚项的关系。那么其梯度为:
$$
\begin{align}
\nabla_w \text{Loss}(w)
& = \sum_{i=1}^N (\sigma(w^Tx_i) - y_i)x_i + I\\
I^{(m)} & = \left \{ \begin{aligned} \lambda,w^{(m)} > 0 \\ -\lambda,w^{(m)} < 0 \\ 0,w^{(m)} = 0 \end{aligned} \right.
\end{align}
$$
我们依然可以用梯度下降来优化损失函数。然而$L1$ 正则对牛顿法没什么用,因为其Hessian矩阵没有变化。
$L1$ 正则使得梯度下降法让$w$ 向着$0$的方向下降,而且$w$ 向量中任一维度的下降对$\text{Loss}(w)$的影响是一样的,$w$ 向量中在0附近的梯度和远离0的梯度是一样的,所以最后得出来的 $w$ 向量中某些维度可能是$0$.
### L2正则
我们直接在 $\text{Loss}(w)$上加一个代表模型复杂度的 $w$ 的$L2$范式。
$$
\text{Loss}(w) = \sum_{i=1}^{N} \left ( \log(1+\exp(w^Tx_i)) - y_i(w^Tx_i) \right ) + \frac{\lambda}{2} w^Tw
$$
那么其梯度为:
$$
\begin{align}
\nabla_w \text{Loss}(w)
& = \sum_{i=1}^N (\sigma(w^Tx_i) - y_i)x_i + \lambda w\\
\end{align}
$$
我们依然可以用梯度下降来优化损失函数。
$L2$ 正则使得梯度下降法让$w$ 向着$0$的方向下降,但是$w$ 向量中 值比较大 的维度下降 比 值比较小 的维度下降对$\text{Loss}(w)$的影响要大,而且$w$某些维度越接近 $0$ ,梯度越小,所以最后得出来的$w$ 中的维度的值很小的概率是$0$,他们会比较平滑得在$0$ 附近。
如果用牛顿法,一阶导数如上,Hessian 矩阵如下
$$
\begin{align}
h & = \text{Loss}^{(2)}(w^{\text{old}}) = X^T A X + E \\
\end{align}
$$
$X, A$ 的解释见上面的牛顿法那儿,$E_{m,m} = \lambda, E \in \mathbb{R}^{(n+1) \times (n+1)}$ 是对角矩阵。
## 逻辑回归多类分类
## 逻辑回归于其他模型的关系
- 最大熵模型
-
## 逻辑回归优缺点,适用场景
- 输出概率值,可解释性强,分给哪个类很直观。
- 处理离散特征还挺好,因为每个离散特征有独立的权重
- 对特征维度大的数据集处理比较快,因为用的是 权重和特征的内积$(w^Tx)$,**梯度下降**或者**牛顿法**(见上面更新规则的表达式),用的都是向量内积,不是一个一个特征循环,和树模型不一样,特征越多,树越大,越深,计算速度会下降很多。
- 只能处理$x, y$ 线性关系的数据集
- 依赖特征工程,对某些特征要进行离散化处理,比如年龄,不能处理类别特征,需要手动one-hot
- 对连续特征进行归一化,梯度下降收敛更快