<commit_before>---
layout: post
title: Logistic Regression
subtitle: 逻辑斯特回归
author: Bin
tags: [Machine Learning, Classification]
comments: true
published: true
typora-root-url: ../../../../binlidaily.github.io
typora-copy-images-to: ../../../img/media
---

{% include toc.html %}

　　逻辑斯特回归（或对数几率回归，Logistic Regression, LR）是机器学习中的一种**分类**模型，由于算法的简单高效，在实际运用中非常的广泛。

　　就线性模型来说，我们在现实生活中四种需求：

1. 预测实数：线性回归（Linear Regression）
2. 预测正负二分类：线性分类（Linear Classification）
3. 预测多分类：多个二分类组合（One Vs All）
4. 预测概率：逻辑斯特回归（Logistic Regression）

## 1. 创造 LR 的思维路径
### 1.1 从需求入手
　　这里我们想要实现预测的二分类结果是概率形式，于是我们就要尝试找到一种变换，将之前的线性模型（$h(x)=wx$）结果转换到 $[0,1]$ 内。幸运的是，伟大的数学就有这样的函数了，那就是 [logistic function](https://en.wikipedia.org/wiki/Logistic_function)：

$$
f(x)=\frac{L}{1+e^{-k\left(x-x_{0}\right)}}
$$

　　其中：

1. $e$ 是自然对数。
2. $x_0$ 是该 S 型曲线的重点 $x$ 坐标，像 sigmoid 函数 $x_0=0$
3. $L$ 是曲线的最大值
4. $k$ 是 logistic 曲线增长率

　　Sigmoid 函数就是特殊的 logistic function，其中 $x_0 = 0$，$k=1$，$L=1$。

$$
\sigma(s)=\frac{1}{1+e^{-s}}=\frac{e^{s}}{1+e^{s}} 
$$

　　原来结果范围在 $[-\infty, +\infty]$ 压缩到了 $[0, 1]$，我们再把之前的线性结果带进去看最终的决策函数：

$$
h(\mathbf{x})=\sigma\left(\mathbf{w}^{\mathrm{T}} \mathbf{x}\right)=\frac{1}{1+e^{-\mathbf{w}^{\mathrm{T}}\mathbf{x}}}
$$

　　这边是从需求角度引入了 LR 的决策函数，当然我们还能从广义线性模型的角度来引入这个结果。

### 1.2 广义线性模型导出 LR
　　然而从上面的直观理解，虽然输出的结果是在 [0, 1] 上，很难将输出结果跟概率值直接对应上。可以参考 GLM 的具体[介绍](https://binlidaily.github.io/2019-11-27-glm-generalized_linear_model)。

## 2. 构建 LR 模型
　　到此我们知道了 LR 的决策函数，接下来我们就要构建非常重要的损失函数了。然后尝试去求解最优值，会用到求导和梯度下降的通用方法。

### 2.1 极大似然估计构造损失函数
　　我们先假设数据类标用的是 $\{0, 1\}$ 表示，对于二分类的对应结果概率为：

$$
{P(y = 1| x; \mathrm{w}) = g(\mathrm{w}^Tx)}={1\over{1+e^{-{\mathrm{w}^Tx}}}}=p
$$

$$
{P(y = 0| x; \mathrm{w}) = 1 - g(\mathrm{w}^Tx)}={e^{-{\mathrm{w}^Tx}}\over{1+e^{-{\mathrm{w}^Tx}}}}=1-p
$$

　　当 $P(y=1 \vert x)>0.5$，则预测的结果 $y^*=1$。可以看特定的情况选择不同的阈值。如果对正例的判别准确性要求高一些，可以调大阈值。对正例的召回率要求高，则可以减小阈值。

　　上面的两个式子可以写成:

$$P(y|{x};\mathrm{w})=\left\{ \begin{aligned} p, y=1 \\ 1-p,y=0 \end{aligned} \right.$$

　　在进一步可以合并到一个式子中，这里其实是因为逻辑回归假设样本符合**伯努利分布**，于是有下式:

$$P(y_i|{x}_i;\mathrm{w}) = p^{y_i}(1-p)^{1-{y_i}}$$

　　如果是 $y \in \{1，-1\}$ 就要注意下指数的写法。

　　接下来就可以走极大似然估计的套路了，选择 $m$ 个训练集，最大化概率连乘，然后套上对数并加上负号，变成最小化交叉熵损失函数。

$$
\begin{aligned} L(\mathrm{w}) &=p({y} | X ; \mathrm{w}) \\ 
&=\prod_{i=1}^{m} p\left(y_{i} | x_{i} ; \mathrm{w}\right) \\ 
&=\prod_{i=1}^{m}\left(h_{\mathrm{w}}\left(x_{i}\right)\right)^{y_{i}}\left(1-h_{\mathrm{w}}\left(x_{i}\right)\right)^{1-y_{i}} \\
&=\prod_{i=1}^{m}p_i^{y_{i}}\left(1-p_i\right)^{1-y_{i}}
\end{aligned}
$$

　　加单调的对数，最大化似然：

$$
\begin{aligned} L^\prime(\mathrm{w}) &=\log L(\mathrm{w}) \\ 
&=\sum_{i=1}^{m} y_{i} \log h\left(x_{i}\right)+\left(1-y_{i}\right) \log \left(1-h\left(x_{i}\right)\right) \\
&=\sum_{i=1}^{m} y_{i} \log p_i+\left(1-y_{i}\right) \log \left(1-p_i\right)
\end{aligned}
$$

　　加上负号，最小化交叉熵损失函数：

$$
\ell(\mathrm{w}) = -\sum_{i=1}^{m} y_{i} \log p_i+\left(1-y_{i}\right) \log \left(1-p_i\right)
$$

### 2.2 优化求导更新参数
　　对于特定样本 $j$，计算损失函数对 $w$ 的偏导如下：
$$
\begin{aligned}
\frac{\partial}{\partial \mathrm{w}_{j}} \ell(\mathrm{w}) &=\left(y \frac{1}{g\left(\mathrm{w}^{T} x\right)}-(1-y) \frac{1}{1-g\left(\mathrm{w}^{T} x\right)}\right) \frac{\partial}{\partial \mathrm{w}_{j}} g\left(\mathrm{w}^{T} x\right) \\ &=\left(y \frac{1}{g\left(\mathrm{w}^{T} x\right)}-(1-y) \frac{1}{1-g\left(\mathrm{w}^{T} x\right)}\right) g\left(\mathrm{w}^{T} x\right)\left(1-g\left(\mathrm{w}^{T} x\right)\right) \frac{\partial}{\partial \mathrm{w}_{j}} \mathrm{w}^{T} x \\ &=\left(y\left(1-g\left(\mathrm{w}^{T} x\right)\right)-(1-y) g\left(\mathrm{w}^{T} x\right)\right) x_{j} \\ &=\left(y-h_{\mathrm{w}}(x)\right) x_{j} \end{aligned}
$$

　　接着利用梯度下降法就可以进行模型参数更新优化。


### Logistic Regression 决策函数
　　线性回归模型 ($f(x) = \Theta^Tx$) 不能做分类任务，那么在其上面套一个单调可微的的 Sigmoid function，我们得到了可以做分类任务的逻辑回归，使得线性回归的预测值对应到了分类任务的类标 $y$ 上。那为什么要用 Sigmoid 函数？我们可以从广义线性模型的角度去[推导](http://cs229.stanford.edu/notes/cs229-notes1.pdf)，也可以从朴素贝叶斯的方向去理解。

先做一些假设：
1. 假设所有的 $x_i$ 和 $y$ 条件独立；<commit_msg>update posts<commit_after>---
layout: post
title: Logistic Regression
subtitle: 逻辑斯特回归
author: Bin
tags: [Machine Learning, Classification]
comments: true
published: true
typora-root-url: ../../../../binlidaily.github.io
typora-copy-images-to: ../../../img/media
---

{% include toc.html %}

　　逻辑斯特回归（或对数几率回归，Logistic Regression, LR）是机器学习中的一种**分类**模型，由于算法的简单高效，在实际运用中非常的广泛。

　　就线性模型来说，我们在现实生活中四种需求：

1. 预测实数：线性回归（Linear Regression）
2. 预测正负二分类：线性分类（Linear Classification）
3. 预测多分类：多个二分类组合（One Vs All）
4. 预测概率：逻辑斯特回归（Logistic Regression）

## 1. 创造 LR 的思维路径
### 1.1 从需求入手
　　这里我们想要实现预测的二分类结果是概率形式，于是我们就要尝试找到一种变换，将之前的线性模型（$h(x)=wx$）结果转换到 $[0,1]$ 内。幸运的是，伟大的数学就有这样的函数了，那就是 [logistic function](https://en.wikipedia.org/wiki/Logistic_function)：

$$
f(x)=\frac{L}{1+e^{-k\left(x-x_{0}\right)}}
$$

　　其中：

1. $e$ 是自然对数。
2. $x_0$ 是该 S 型曲线的重点 $x$ 坐标，像 sigmoid 函数 $x_0=0$
3. $L$ 是曲线的最大值
4. $k$ 是 logistic 曲线增长率

　　Sigmoid 函数就是特殊的 logistic function，其中 $x_0 = 0$，$k=1$，$L=1$。

$$
\sigma(s)=\frac{1}{1+e^{-s}}=\frac{e^{s}}{1+e^{s}} 
$$

　　原来结果范围在 $[-\infty, +\infty]$ 压缩到了 $[0, 1]$，我们再把之前的线性结果带进去看最终的决策函数：

$$
h(\mathbf{x})=\sigma\left(\mathbf{w}^{\mathrm{T}} \mathbf{x}\right)=\frac{1}{1+e^{-\mathbf{w}^{\mathrm{T}}\mathbf{x}}}
$$

　　这边是从需求角度引入了 LR 的决策函数，当然我们还能从广义线性模型的角度来引入这个结果。

### 1.2 广义线性模型导出 LR
　　然而从上面的直观理解，虽然输出的结果是在 [0, 1] 上，很难将输出结果跟概率值直接对应上。可以参考 GLM 的具体[介绍](https://binlidaily.github.io/2019-11-27-glm-generalized_linear_model)。

## 2. 构建 LR 模型
　　到此我们知道了 LR 的决策函数，接下来我们就要构建非常重要的损失函数了。然后尝试去求解最优值，会用到求导和梯度下降的通用方法。

### 2.1 极大似然估计构造损失函数
　　我们先假设数据类标用的是 $\{0, 1\}$ 表示，对于二分类的对应结果概率为：

$$
{P(y = 1| x; \mathrm{w}) = g(\mathrm{w}^Tx)}={1\over{1+e^{-{\mathrm{w}^Tx}}}}=p
$$

$$
{P(y = 0| x; \mathrm{w}) = 1 - g(\mathrm{w}^Tx)}={e^{-{\mathrm{w}^Tx}}\over{1+e^{-{\mathrm{w}^Tx}}}}=1-p
$$

　　当 $P(y=1 \vert x)>0.5$，则预测的结果 $y^*=1$。可以看特定的情况选择不同的阈值。如果对正例的判别准确性要求高一些，可以调大阈值。对正例的召回率要求高，则可以减小阈值。

　　上面的两个式子可以写成:

$$
P(y|{x};\mathrm{w})=\left\{ \begin{aligned} p, y=1 \\ 1-p,y=0 \end{aligned} \right.
$$

　　在进一步可以合并到一个式子中，这里其实是因为逻辑回归假设样本符合**伯努利分布**，于是有下式:

$$P(y_i|{x}_i;\mathrm{w}) = p^{y_i}(1-p)^{1-{y_i}}$$

　　如果是 $y \in \\{1，-1\\}$ 就要注意下指数的写法。

　　接下来就可以走极大似然估计的套路了，选择 $m$ 个训练集，最大化概率连乘，然后套上对数并加上负号，变成最小化交叉熵损失函数。

$$
\begin{aligned} L(\mathrm{w}) &=p({y} | X ; \mathrm{w}) \\ 
&=\prod_{i=1}^{m} p\left(y_{i} | x_{i} ; \mathrm{w}\right) \\ 
&=\prod_{i=1}^{m}\left(h_{\mathrm{w}}\left(x_{i}\right)\right)^{y_{i}}\left(1-h_{\mathrm{w}}\left(x_{i}\right)\right)^{1-y_{i}} \\
&=\prod_{i=1}^{m}p_i^{y_{i}}\left(1-p_i\right)^{1-y_{i}}
\end{aligned}
$$

　　加单调的对数，最大化似然：

$$
\begin{aligned} L^\prime(\mathrm{w}) &=\log L(\mathrm{w}) \\ 
&=\sum_{i=1}^{m} y_{i} \log h\left(x_{i}\right)+\left(1-y_{i}\right) \log \left(1-h\left(x_{i}\right)\right) \\
&=\sum_{i=1}^{m} y_{i} \log p_i+\left(1-y_{i}\right) \log \left(1-p_i\right)
\end{aligned}
$$

　　加上负号，最小化交叉熵损失函数：

$$
\ell(\mathrm{w}) = -\sum_{i=1}^{m} y_{i} \log p_i+\left(1-y_{i}\right) \log \left(1-p_i\right)
$$

### 2.2 优化求导更新参数
　　对于特定样本 $j$，计算损失函数对 $w$ 的偏导如下：

$$
\begin{aligned}
\frac{\partial}{\partial \mathrm{w}_{j}} \ell(\mathrm{w}) &=\left(y \frac{1}{g\left(\mathrm{w}^{T} x\right)}-(1-y) \frac{1}{1-g\left(\mathrm{w}^{T} x\right)}\right) \frac{\partial}{\partial \mathrm{w}_{j}} g\left(\mathrm{w}^{T} x\right) \\ &=\left(y \frac{1}{g\left(\mathrm{w}^{T} x\right)}-(1-y) \frac{1}{1-g\left(\mathrm{w}^{T} x\right)}\right) g\left(\mathrm{w}^{T} x\right)\left(1-g\left(\mathrm{w}^{T} x\right)\right) \frac{\partial}{\partial \mathrm{w}_{j}} \mathrm{w}^{T} x \\ &=\left(y\left(1-g\left(\mathrm{w}^{T} x\right)\right)-(1-y) g\left(\mathrm{w}^{T} x\right)\right) x_{j} \\ &=\left(y-h_{\mathrm{w}}(x)\right) x_{j} \end{aligned}
$$

　　接着利用梯度下降法就可以进行模型参数更新优化。


### Logistic Regression 决策函数
　　线性回归模型 ($f(x) = \Theta^Tx$) 不能做分类任务，那么在其上面套一个单调可微的的 Sigmoid function，我们得到了可以做分类任务的逻辑回归，使得线性回归的预测值对应到了分类任务的类标 $y$ 上。那为什么要用 Sigmoid 函数？我们可以从广义线性模型的角度去[推导](http://cs229.stanford.edu/notes/cs229-notes1.pdf)，也可以从朴素贝叶斯的方向去理解。

先做一些假设：
1. 假设所有的 $x_i$ 和 $y$ 条件独立；
{'fraction_non_alphanumeric': 0.26834804539722573, 'fraction_numerical': 0.025472887767969736, 'mean_word_length': 4.940823970037453, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6894244', 'n_tokens_mistral': 4963, 'n_tokens_neox': 5221, 'n_words': 496}