修正了部分文档中的笔误
This commit is contained in:
parent
dcd7a8a41b
commit
af055d8853
|
|
@ -303,9 +303,11 @@ for income in incomes:
|
|||
<img src="res/01_regression_model.png" style="zoom:50%;">
|
||||
|
||||
现在,我们的问题就变成了如何利用收集到的历史数据计算出回归模型的斜率 $\small{a}$ 和截距 $\small{b}$ 。为了评价回归模型的好坏,也就是我们计算出的斜率和截距是否理想,我们可以先定义评判标准,一个简单且直观的评判标准就是我们将月收入 $\small{X}$ 带入回归模型,计算出月网购支出的预测值 $\small{\hat{Y}}$ ,预测值 $\small{\hat{Y}}$ 和真实值 $\small{Y}$ 之间的误差越小,说明我们的回归模型越理想。之前我们提到过,计算误差的地方通常都需要取绝对值或者求平方,我们可以用误差平方的均值来作为评判标准,通常称之为均方误差(MSE),如下所示。
|
||||
|
||||
$$
|
||||
MSE = \frac{1}{n}{\sum_{i=1}^{n}(y_{i} - \hat{y}_{i})^{2}}
|
||||
$$
|
||||
|
||||
根据上面的公式,我们可以写出计算均方误差的函数,通常称之为损失函数。
|
||||
|
||||
```python
|
||||
|
|
@ -355,10 +357,13 @@ a = 0.4824040159203802, b = -1515.0162977046068
|
|||
```
|
||||
|
||||
对于数学知识比较丰富的小伙伴,我们可以将回归模型带入损失函数,由于 $\small{X}$ 和 $\small{Y}$ 是已知的历史数据,那么损失函数其实是一个关于 $\small{a}$ 和 $\small{b}$ 的二元函数,如下所示。
|
||||
|
||||
$$
|
||||
MSE = f(a, b) = \frac{1}{n}{\sum_{i=1}^{n}(y_{i} - (ax_{i} + b))^{2}}
|
||||
$$
|
||||
|
||||
根据微积分的极值定理,我们可以对 $\small{f(a, b)}$ 求偏导数,并令其等于0,这样我们就可以计算让 $\small{f(a, b)}$ 取到最小值的 $\small{a}$ 和 $\small{b}$ 分别是多少,即:
|
||||
|
||||
$$
|
||||
\frac{\partial{f(a, b)}}{\partial{a}} = -\frac{2}{n}\sum_{i=1}^{n}x_{i}(y_{i} - x_{i}a - b) = 0
|
||||
$$
|
||||
|
|
@ -368,6 +373,7 @@ $$
|
|||
$$
|
||||
|
||||
求解上面的方程组可以得到:
|
||||
|
||||
$$
|
||||
a = \frac{\sum(x_{i} - \bar{x})(y_{i} - \bar{y})}{\sum(x_{i} - \bar{x})^{2}}
|
||||
$$
|
||||
|
|
|
|||
|
|
@ -17,21 +17,27 @@
|
|||
要讲清楚信息增益,我们得先介绍**信息熵**(information entropy)这个概念。1948年,克劳德·香农(*Claude Shannon*)在他的著名论文《通信的数学原理》中提出了“信息熵”的概念,它解决了信息的度量问题,量化出了信息的价值。“熵”原本是热力学领域的概念,它反映的是系统的混乱程度,熵越大,系统的混乱程度就越高。在信息论中,熵可以看作随机变量(数据集)不确定性的度量,熵越大,变量(数据)的不确定性就越大,那么要确定它所需要获取的信息量也就越大;熵越低,数据的纯度就越高,不确定性就越小。
|
||||
|
||||
例如,甲、乙两人参加一个射击比赛,如果从历史成绩来看,甲的胜率是100%,那么我们很容易接受甲会获胜这个结果;如果从历史成绩来看,甲的胜率是50%,那么我们就难以确定到底谁会获胜。克劳德·香农提出可以用下面的公式来描述这种不确定性:
|
||||
|
||||
$$
|
||||
H(D) = -\sum_{i = 1}^{k} P(x_i)log_2P(x_i)
|
||||
$$
|
||||
|
||||
其中, $\small{D}$ 代表数据集, $\small{k}$ 代表类别的总数, $\small{P(x_i)}$ 表示数据集中第 $\small{i}$ 类样本的比例(概率)。我们用 $\small{x_1}$ 和 $\small{x_2}$ 来分别表示甲获胜和乙获胜,很显然,当 $\small{P(x_1)=0.5}$ , $\small{P(x_2)=0.5}$ 时, $\small{H=1}$ ,不确定性最大;当 $\small{P(x_1)=1}$ , $\small{P(x_2)=0}$ 时, $\small{H=0}$ ,不确定性最小;当 $\small{P(x_1)=0.8}$ , $\small{P(x_2)=0.2}$ 时, $\small{H \approx 0.72}$ 。
|
||||
|
||||
很显然,知道的信息越多,随机变量(数据集)的不确定性就越小。这些信息,可以是直接针对我们想了解的随机事件的信息,也可以是和我们关心的随机事件相关的其他事件的信息。在数学上可以严格的证明这些相关的信息也能够降低或消除不确定性,为此我们定义**条件熵**,它表示在给定特征 $\small{A}$ 的条件下,数据集 $\small{D}$ 的不确定性。条件熵的公式如下所示:
|
||||
|
||||
$$
|
||||
H(D|A) = \sum_{v \in A}\frac{|D_{v}|}{|D|}H(D_{v})
|
||||
$$
|
||||
|
||||
上面的公式中,我们让 $\small{v}$ 取得特征 $\small{A}$ 所有可能的取值,其中 $\small{D_{v}}$ 代表特征 $\small{A}$ 取值为 $\small{v}$ 的样本子集, $\small{\frac{|D_{v}|}{|D|}}$ 代表权重,即特征取值为 $\small{v}$ 的样本比例。可以证明 $\small{H(D) \ge H(D|A)}$ ,也就是说多了特征 $\small{A}$ 的信息之后,数据集 $\small{D}$ 的不确定性下降了。当然,还要注意等号成立的情况,也就是说增加了特征 $\small{A}$ 的信息,但是 $\small{D}$ 的不确定没有下降,也就是说我们获取的信息与要研究的内容没有关系。
|
||||
|
||||
有了上面的铺垫,接下来我们就可以给出**信息增益**的定义,它是在得到特征 $\small{A}$ 的信息后,数据集 $\small{D}$ 的不确定性减少的程度。换句话说,信息增益是一种描述数据集确定性增加的量,特征的信息增益越大,特征的分类能力就越强,在给定该特征后数据集的确定性就越大。信息增益可以通过下面的数学公式直观的描述:
|
||||
|
||||
$$
|
||||
g(D, A) = E(D) - E(D|A)
|
||||
$$
|
||||
|
||||
计算信息熵和信息增益的函数如下所示:
|
||||
|
||||
```python
|
||||
|
|
@ -93,9 +99,11 @@ g(D,A3) = 1.4420095891994646
|
|||
> **注意**:如果在划分训练集和测试集的时候,`train_test_split`函数的`random_state`参数跟我上面的代码不同,那么这里的运算结果可能会存在差异。
|
||||
|
||||
根据上面的输出我们可以得知,花瓣长度(对应上面的`A2`)这个特征信息增益最高,也就是说使用花瓣长度这个特征分类能力最强,分类后的数据集纯度最高。需要注意的是,当某个特征取值较多时,该特征的信息增益计算结果就会比较大,所以使用信息增益选择特征时,会偏向于取值较多的特征。为了解决这个问题,我们可以计算**信息增益比**,它的定义如下所示:
|
||||
|
||||
$$
|
||||
R(D, A) = \frac{g(D, A)}{E_{A}(D)}
|
||||
$$
|
||||
|
||||
其中, $\small{E_{A}(D) = -\sum_{i=1}^{n}{\frac{|D_{i}|}{|D|}log_{2}\frac{|D_{i}|}{|D|}}}$ , $\small{n}$ 表示特征 $\small{A}$ 的取值个数,简单的说 $\small{E_{A}(D)}$ 就是特征 $\small{A}$ 的信息熵,而信息增益比就是特征 $\small{A}$ 的信息增益和特征 $\small{A}$ 的信息熵的比值。我们用下面的函数来计算信息增益比,调用该函数可以输出四个特征对应的信息增益比。
|
||||
|
||||
```python
|
||||
|
|
@ -129,25 +137,35 @@ R(D,A3) = 0.35550822529855447
|
|||
根据上面的输出我们可以得知,花瓣宽度(对应上面的`A3`)这个特征信息增益比最高,也就是说这个特征能够完成一次良好的数据划分,可以作为我们构建决策树的根结点。当然,构建决策树不可能只做一次划分,我们可以在划分后的数据集上继续计算信息增益比来选择新的划分特征,重复这一过程直到满足一定的条件就可以构造出一棵完整的决策树模型。在经典决策树算法中,C4.5 算法就是基于信息增益比进行特征选择的。
|
||||
|
||||
除了上面讲到的信息增益和信息增益比,**基尼指数**也是非常好的特征选择方法,它可以用于评价数据集的纯度。基尼指数也叫**基尼不纯度**(Gini impurity),它的取值在0到1之间,数据集纯度越高,基尼指数越靠近0,数据集纯度越低,基尼指数越靠近1。如果数据集有 $\small{n}$ 个类别,样本属于第 $\small{k}$ 个类别的概率为 $\small{p_{k}}$ ,那么数据集的基尼指数可以通过下面的公式进行计算:
|
||||
|
||||
$$
|
||||
G(D) = 1 - \sum_{k=1}^{n}{p_{k}}^{2}
|
||||
$$
|
||||
|
||||
例如鸢尾花数据集中,三种鸢尾花的样本数量都是50条,那么整个数据集的基尼指数为:
|
||||
|
||||
$$
|
||||
G(D) = 1 - [(\frac{1}{3})^{2} + (\frac{1}{3})^{2} + (\frac{1}{3})^{2}] = \frac{2}{3}
|
||||
$$
|
||||
|
||||
如果三种鸢尾花的样本数量分别为100条、25条、25条,那么整个数据集的基尼指数为:
|
||||
|
||||
$$
|
||||
G(D) = 1 - [(\frac{2}{3})^{2} + (\frac{1}{6})^{2} + (\frac{1}{6})^{2}] = \frac{1}{2}
|
||||
$$
|
||||
|
||||
如果三种鸢尾花的样本数量分别为140条、5条、5条,那么整个数据集的基尼指数为:
|
||||
|
||||
$$
|
||||
G(D) = 1 - [(\frac{14}{15})^{2} + (\frac{1}{30})^{2} + (\frac{1}{30})^{2}] = \frac{19}{150}
|
||||
$$
|
||||
|
||||
可以看出,随着数据集纯度越来越高,基尼指数的值越来越小。如果数据集 $\small{D}$ 根据特征 $\small{A}$ 划分为 $\small{k}$ 个部分,那么在给定特征 $\small{A}$ 的前提条件下,数据集的基尼指数可以定义为:
|
||||
|
||||
$$
|
||||
G(D, A) = \sum_{i=1}^{k}\frac{|D_{i}|}{|D|}G(D_{i})
|
||||
$$
|
||||
|
||||
根据上面的公式,我们可以设计出如下所示的计算基尼指数的函数,大家可以对照上面的公式看看是否能够理解下面的代码,或者通过调用下面的函数看看鸢尾花数据集的哪个特征可以对原始数据集或者训练集做出最好的划分。经典决策树算法中的 CART 算法就是基于基尼指数进行特征选择的。
|
||||
|
||||
```python
|
||||
|
|
|
|||
|
|
@ -5,16 +5,20 @@
|
|||
### 贝叶斯定理
|
||||
|
||||
贝叶斯定理是概率论中的一个重要定理,它描述了如何从主观经验或已知事实出发,通过收集到的样本数据(证据)来更新对事件发生概率的认知(信念)。贝叶斯定理的数学表达式为:
|
||||
|
||||
$$
|
||||
P(A|B) = \frac{P(B|A)}{P(B)} \cdot P(A)
|
||||
$$
|
||||
|
||||
其中, $\small{P(A)}$ 是事件 $\small{A}$ 发生的**先验概率**,我们可以理解为已知事实或主观经验(**主观概率**); $\small{P(B|A)}$ 是在事件 $\small{A}$ 发生的条件下事件 $\small{B}$ 发生的 条件概率,通常也称之为**似然性**(likelihood), $\small{P(B)}$ 是事件 $\small{B}$ 发生的(全)概率,这两个概率可以通过我们收集到的样本数据(证据)获得; $\small{P(A|B)}$ 是在事件 $\small{B}$ 发生的条件下事件 $\small{A}$ 发生的条件概率,即收集到样本数据后对事件 $\small{A}$ 发生概率的重新认知,称之为**后验概率**。贝叶斯定理告诉我们一个重要的事实:可以从已知的事实或主观经验出发,通过收集到的证据来更新我们对某个事件发生概率的认知,简单的说就是**可以通过已知的事实和收集的证据来推断出未知的真相**。
|
||||
|
||||
回到上面李女士购买飞机延误险的例子,假设本次航班是从成都双流国际机场飞往北京首都国际机场,执飞的航空公司是四川航空,起飞地天气为雨天(小雨),温度为8°C,东北风2级,降落地天气为晴天,温度4°C,西北风2级。为了更简单的让大家理解贝叶斯定理,我们对这里的条件稍作简化,只保留天气中的降水信息,暂不考虑温度和风速等其他因素,对应到上面的贝叶斯定理有:
|
||||
|
||||
$$
|
||||
P(延误|起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航) = \\
|
||||
\frac{P(起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航|延误)}{P(起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航)} \cdot P(延误)
|
||||
$$
|
||||
|
||||
上面公式等号左边就是李女士想知道的当前航班延误的概率,等号右边的部分其实就是历史数据和当前信息,计算这个概率的关键在于计算出似然性,即 $\small{P(起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航|延误)}$ 到底是多少,那么这个条件概率又该如何计算呢?
|
||||
|
||||
### 朴素贝叶斯
|
||||
|
|
@ -26,13 +30,14 @@ $$
|
|||
$$
|
||||
P(X|C) = P(x_1|C) \cdot P(x_2|C) \cdot \ldots \cdot P(x_n|C)
|
||||
$$
|
||||
|
||||
这个假设大大简化了计算复杂性,使得我们可以只计算每个特征在给定类别下的概率,而不需要考虑特征之间的相互作用,对应到上面购买飞机延误险的例子,我们可以用下面的方式来计算似然性:
|
||||
|
||||
$$
|
||||
P(起飞机场=双流,到达机场=首都,起飞天气=小雨,降落天气=晴天,执飞航司=川航|延误) = \\
|
||||
P(起飞机场=双流|延误) \times P(到达机场=首都|延误) \times P(起飞天气=小雨|延误) \times P(降落天气=晴天|延误) \times P(执飞航司=川航|延误)
|
||||
$$
|
||||
|
||||
|
||||
### 算法原理
|
||||
|
||||
#### 训练阶段
|
||||
|
|
@ -40,28 +45,35 @@ $$
|
|||
在训练阶段,朴素贝叶斯算法首先需要计算每个类别的先验概率和每个特征在各个类别下的条件概率。
|
||||
|
||||
1. **计算先验概率**:
|
||||
$$
|
||||
P(C_{i}) = \frac{n_{i}}{n}
|
||||
$$
|
||||
|
||||
$$
|
||||
P(C_{i}) = \frac{n_{i}}{n}
|
||||
$$
|
||||
|
||||
其中, $\small{C_{i}}$ 表示类别, $\small{n_{i}}$ 是类别 $\small{C_{i}}$ 的样本数量, $\small{n}$ 是总的样本容量。
|
||||
|
||||
2. **计算条件概率**:
|
||||
$$
|
||||
P(x_{j}|C_{i}) = \frac{n_{i,j}}{n_{i}}
|
||||
$$
|
||||
|
||||
$$
|
||||
P(x_{j}|C_{i}) = \frac{n_{i,j}}{n_{i}}
|
||||
$$
|
||||
|
||||
其中, $\small{n_{i,j}}$ 是在类别 $\small{C_{i}}$ 中,特征 $\small{x_{j}}$ 出现的次数。
|
||||
|
||||
#### 预测阶段
|
||||
|
||||
在预测阶段,给定一个待分类样本 $\small{X}$ ,朴素贝叶斯算法通过以下步骤来计算其属于每个类别的后验概率:
|
||||
|
||||
$$
|
||||
P(C_{i}|X) = \frac{P(X|C_{i})}{P(X)} \cdot P(C_{i})
|
||||
$$
|
||||
|
||||
上面的公式中, $\small{P(X)}$ 对应到每个类别都是一个常量,可以忽略掉它,再结合独立性假设有:
|
||||
|
||||
$$
|
||||
P(C_{i}|X) \propto P(C_{i}) \cdot P(x_1|C_{i}) \cdot P(x_2|C_{i}) \cdot \ldots \cdot P(x_n|C_{i})
|
||||
$$
|
||||
|
||||
这样,我们可以选择具有最高后验概率的类别作为预测结果。
|
||||
|
||||
#### 代码实现
|
||||
|
|
|
|||
|
|
@ -18,75 +18,99 @@
|
|||
1. **线性回归**(Linear Regression):假设输入变量和输出变量之间是线性关系。
|
||||
|
||||
- 一元线性回归:建立一个因变量与单个自变量之间线性关系的模型。
|
||||
$$
|
||||
y = \beta_0 + \beta_1 x + \varepsilon
|
||||
$$
|
||||
其中, $\small{y}$ 是目标变量(因变量), $\small{x}$ 是输入变量(自变量), $\small{\beta_{0}}$ 是截距,表示 $\small{x=0}$ 时的预测值, $\small{\beta_{1}}$ 是回归系数(斜率),表示输入变量对输出变量影响的大小, $\small{\varepsilon}$ 是误差项,用于表示数据中的随机噪声或无法解释的部分。
|
||||
|
||||
$$
|
||||
y = \beta_0 + \beta_1 x + \varepsilon
|
||||
$$
|
||||
|
||||
其中, $\small{y}$ 是目标变量(因变量), $\small{x}$ 是输入变量(自变量), $\small{\beta_{0}}$ 是截距,表示 $\small{x=0}$ 时的预测值, $\small{\beta_{1}}$ 是回归系数(斜率),表示输入变量对输出变量影响的大小, $\small{\varepsilon}$ 是误差项,用于表示数据中的随机噪声或无法解释的部分。
|
||||
|
||||
- 多元线性回归:建立一个因变量与多个自变量之间线性关系的模型。
|
||||
$$
|
||||
y = \beta_{0} + \beta_{1} x_{1} + \beta_{2} x_{2} + \cdots + \beta_{n} x_{n} + \varepsilon
|
||||
$$
|
||||
上面的公式也可以用向量的形式简化表示为:
|
||||
$$
|
||||
y = \mathbf{x}^{T} \mathbf{\beta} + \varepsilon
|
||||
$$
|
||||
其中, $\small{\mathbf{x} = [1, x_{1}, x_{2}, \dots, x_{n}]^{T}}$ 是包含截距的输入向量, $\small{\mathbf{\beta} = [\beta_{0}, \beta_{1}, \beta_{2}, \dots, \beta_{n}]^{T}}$ 是模型参数(包括截距 $\small{\beta_{0}}$ 和回归系数 $\small{\beta_{1}, \beta_{2}, \cdots, \beta_{n}}$ ), $\small{\varepsilon}$ 是误差项。
|
||||
|
||||
$$
|
||||
y = \beta_{0} + \beta_{1} x_{1} + \beta_{2} x_{2} + \cdots + \beta_{n} x_{n} + \varepsilon
|
||||
$$
|
||||
|
||||
上面的公式也可以用向量的形式简化表示为:
|
||||
|
||||
$$
|
||||
y = \mathbf{x}^{T} \mathbf{\beta} + \varepsilon
|
||||
$$
|
||||
|
||||
其中, $\small{\mathbf{x} = [1, x_{1}, x_{2}, \dots, x_{n}]^{T}}$ 是包含截距的输入向量, $\small{\mathbf{\beta} = [\beta_{0}, \beta_{1}, \beta_{2}, \dots, \beta_{n}]^{T}}$ 是模型参数(包括截距 $\small{\beta_{0}}$ 和回归系数 $\small{\beta_{1}, \beta_{2}, \cdots, \beta_{n}}$ ), $\small{\varepsilon}$ 是误差项。
|
||||
|
||||
2. **多项式回归**(Polynomial Regression):引入高阶特征,使模型能拟合更复杂的非线性关系,属于线性模型的扩展,因为因为它对参数 $\small{\beta}$ 的求解仍然是线性形式,如下面所示的二次关系:
|
||||
$$
|
||||
y = \beta_{0} + \beta_{1} x + \beta_{2} x^{2} + \varepsilon
|
||||
$$
|
||||
|
||||
$$
|
||||
y = \beta_{0} + \beta_{1} x + \beta_{2} x^{2} + \varepsilon
|
||||
$$
|
||||
|
||||
3. **非线性回归**(Nonlinear Regression):非线性回归完全放弃了线性假设,模型形式可以是任意非线性函数。
|
||||
|
||||
4. **岭回归**(Ridge Regression)、**套索回归**(Lasso Regression)、**弹性网络回归**(Elastic Net Regression):在线性回归基础上加入正则化项,用于处理过拟合、多重共线性和特征筛选问题。
|
||||
|
||||
5. **逻辑回归**(Logistic Regression):逻辑回归虽然名字中带“回归”,但实际上是用于分类问题的模型。它通过 Sigmoid 函数将线性组合的输入值映射到区间 $\small{(0, 1)}$ ,表示分类概率,适用于二分类问题;也可以扩展为 Softmax 回归,解决多分类问题。
|
||||
$$
|
||||
P(y=1|x) = \frac{1}{1 + e^{-(\beta_{0} + \beta_{1} x_{1} + \cdots + \beta_{n} x_{n})}}
|
||||
$$
|
||||
|
||||
$$
|
||||
P(y=1|x) = \frac{1}{1 + e^{-(\beta_{0} + \beta_{1} x_{1} + \cdots + \beta_{n} x_{n})}}
|
||||
$$
|
||||
|
||||
### 回归系数的计算
|
||||
|
||||
建立回归模型的关键是找到最佳的回归系数 $\small{\mathbf{\beta}}$ ,所谓最佳回归系数是指让模型对数据的拟合效果达到最好的模型参数,即能够最小化模型的预测值 $\small{\hat{y}_{i}}$ 与实际观测值 $\small{y_{i}}$ 之间差异的模型参数。为此,我们先定义如下所示的损失函数。
|
||||
|
||||
$$
|
||||
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2}
|
||||
$$
|
||||
|
||||
其中, $\small{m}$ 表示样本容量,代入回归模型,有:
|
||||
|
||||
$$
|
||||
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \mathbf{x}_{i}^{T}\mathbf{\beta})^{2}
|
||||
$$
|
||||
如果用矩阵形式表示,有:
|
||||
|
||||
如果用矩阵形式表示,有:
|
||||
|
||||
$$
|
||||
L(\mathbf{\beta}) = (\mathbf{y} - \mathbf{X\beta})^{T}(\mathbf{y} - \mathbf{X\beta})
|
||||
$$
|
||||
|
||||
其中, $\mathbf{y}$ 是目标值的向量,大小为 $\small{m \times 1}$, $\mathbf{X}$ 是特征矩阵,大小为 $\small{m \times n}$, $\small{\mathbf{\beta}}$ 是回归系数的向量,大小为 $\small{n \times 1}$。
|
||||
|
||||
通过最小化损失函数 $\small{L(\mathbf{\beta})}$ ,我们可以得到线性回归模型的解析解。对 $\small{L(\mathbf{\beta})}$ 求导并令其为 0,有:
|
||||
|
||||
$$
|
||||
\frac{\partial{L(\mathbf{\beta})}}{\partial{\mathbf{\beta}}} = -2\mathbf{X}^{T}(\mathbf{y} - \mathbf{X\beta}) = 0
|
||||
$$
|
||||
|
||||
整理后得到:
|
||||
|
||||
$$
|
||||
\mathbf{\beta} = (\mathbf{X}^{T}\mathbf{X})^{-1}\mathbf{X}^{T}\mathbf{y}
|
||||
$$
|
||||
|
||||
对于矩阵 $\small{\mathbf{X}^{T}\mathbf{X}}$ 不满秩的情况,可以通过添加正则化项的方式使得矩阵可逆,如下所示,这个就是线性回归的解析解。
|
||||
|
||||
$$
|
||||
\mathbf{\beta} = (\mathbf{X}^{T}\mathbf{X} + \mathbf{\lambda \mit{I}})^{-1}\mathbf{X}^{T}\mathbf{y}
|
||||
$$
|
||||
|
||||
> **说明**:如果你对这里提到的正则化不理解可以先放放,后面我们再来讨论这个问题。
|
||||
|
||||
上述方法适用于小规模数据集,当数据体量不大(样本和特征数量较少)时,计算效率是没有问题的。对于大规模数据集或更为复杂的优化问题,我们可以使用**梯度下降法**,通过迭代更新参数来逐步逼近最优解。梯度下降法的目标也是最小化损失函数,该方法通过计算梯度方向进行参数更新。梯度是一个向量,包含了目标函数在各个参数方向上的偏导数。对于上面的损失函数 $\small{L(\mathbf{\beta})}$ ,梯度可以表示为:
|
||||
|
||||
$$
|
||||
\nabla L(\mathbf{\beta}) = \left[ \frac{\partial{L}}{\partial{\beta_{1}}}, \frac{\partial{L}}{\partial{\beta_{2}}}, \cdots, \frac{\partial{L}}{\partial{\beta_{n}}} \right]
|
||||
$$
|
||||
|
||||
梯度下降法通过以下更新规则来更新参数 $\small{\mathbf{\beta}}$ :
|
||||
|
||||
$$
|
||||
\mathbf{\beta}^{\prime} = \mathbf{\beta} - \alpha \nabla L(\mathbf{\beta}) \\
|
||||
\mathbf{\beta} = \mathbf{\beta^{\prime}}
|
||||
$$
|
||||
其中, $\small{\alpha}$ 是学习率(step size),通常是一个较小的正数,用于控制每次更新的幅度。如果学习率 $\small{\alpha}$ 选择得当,梯度下降法将收敛到目标函数的局部最小值。如果学习率过大,可能导致震荡不收敛;如果学习率过小,则收敛的速度缓慢,需要更多次的迭代。
|
||||
|
||||
其中, $\small{\alpha}$ 是学习率(step size),通常是一个较小的正数,用于控制每次更新的幅度。如果学习率 $\small{\alpha}$ 选择得当,梯度下降法将收敛到目标函数的局部最小值。如果学习率过大,可能导致震荡不收敛;如果学习率过小,则收敛的速度缓慢,需要更多次的迭代。
|
||||
|
||||
### 新数据集介绍
|
||||
|
||||
|
|
@ -235,25 +259,30 @@ print('截距:', model.intercept_)
|
|||
回归模型的预测效果到底如何,我们可以通过下面的指标对其进行评估。
|
||||
|
||||
1. 均方误差(Mean Squared Error, MSE)。MSE 是回归模型最常用的评估指标之一,定义为预测值与真实值误差的平方平均值。
|
||||
$$
|
||||
\text{MSE} = \frac{1}{m} \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2}
|
||||
$$
|
||||
|
||||
|
||||
$$
|
||||
\text{MSE} = \frac{1}{m} \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2}
|
||||
$$
|
||||
|
||||
2. 均方根误差(Root Mean Squared Error, RMSE)。RMSE 是 MSE 的平方根形式,用于更直观地衡量误差的实际尺度(单位与目标变量一致)。
|
||||
$$
|
||||
\text{RMSE} = \sqrt{\text{MSE}} = \sqrt{\frac{1}{m} \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2}}
|
||||
$$
|
||||
|
||||
|
||||
$$
|
||||
\text{RMSE} = \sqrt{\text{MSE}} = \sqrt{\frac{1}{m} \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2}}
|
||||
$$
|
||||
|
||||
3. 平均绝对误差(Mean Absolute Error, MAE)。MAE 是另一个常用的误差度量指标,定义为预测值与真实值误差的绝对值平均值。
|
||||
$$
|
||||
\text{MAE} = \frac{1}{m} \sum_{i=1}^{m}|y_{i} - \hat{y}_{i}|
|
||||
$$
|
||||
|
||||
|
||||
$$
|
||||
\text{MAE} = \frac{1}{m} \sum_{i=1}^{m}|y_{i} - \hat{y}_{i}|
|
||||
$$
|
||||
|
||||
4. 决定系数(R-Squared, $\small{R^2}$)。 $\small{R^2}$ 是一个相对指标,用于衡量模型对数据的拟合程度,其值越接近 1 越好。 $\small{R^2}$ 的计算公式为:
|
||||
$$
|
||||
R^{2} = 1 - \frac{\text{SS}_{\text{res}}}{\text{SS}_{\text{tot}}}
|
||||
$$
|
||||
其中, $\small{\text{SS}_{\text{res}} = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^2}$ 为残差平方和, $\small{\text{SS}_{\text{tot}} = \sum_{i=1}^{m} (y_{i} - \bar{y})^{2}}$ 为总平方和,如下图所示。下图左边红色正方形的面积之和代表总平方和,右边蓝色正方形的面积之和代表残差的平方和,很显然,模型拟合的效果越好, $\small{\frac{\text{SS}_{\text{res}}}{\text{SS}_{\text{tot}}}}$ 的值就越接近 0, $\small{R^{2}}$ 的值就越接近 1。通常 $\small{R^{2} \ge 0.8}$ 时,我们认为模型的拟合效果已经很不错了。
|
||||
|
||||
$$
|
||||
R^{2} = 1 - \frac{\text{SS}_{\text{res}}}{\text{SS}_{\text{tot}}}
|
||||
$$
|
||||
|
||||
其中, $\small{\text{SS}_{\text{res}} = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^2}$ 为残差平方和, $\small{\text{SS}_{\text{tot}} = \sum_{i=1}^{m} (y_{i} - \bar{y})^{2}}$ 为总平方和,如下图所示。下图左边红色正方形的面积之和代表总平方和,右边蓝色正方形的面积之和代表残差的平方和,很显然,模型拟合的效果越好, $\small{\frac{\text{SS}_{\text{res}}}{\text{SS}_{\text{tot}}}}$ 的值就越接近 0, $\small{R^{2}}$ 的值就越接近 1。通常 $\small{R^{2} \ge 0.8}$ 时,我们认为模型的拟合效果已经很不错了。
|
||||
|
||||
<img src="res/05_regression_r2.png" style="zoom:40%;">
|
||||
|
||||
|
|
@ -282,9 +311,11 @@ print(f'决定系数: {r2:.4f}')
|
|||
### 引入正则化项
|
||||
|
||||
岭回归是在线性回归的基础上引入 $\small{L2}$ 正则化项,目的是防止模型过拟合,尤其是当特征数较多或特征之间存在共线性时。岭回归的损失函数如下所示:
|
||||
|
||||
$$
|
||||
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2} + \lambda \sum_{j=1}^{n}\beta_{j}^{2}
|
||||
$$
|
||||
|
||||
其中, $\small{L2}$ 正则化项 $\small{\lambda \sum_{j=1}^{n} \beta_{j}^{2}}$ 会惩罚较大的回归系数,相当于缩小了回归系数的大小,但不会使系数为 0(即不会进行特征选择)。可以通过 scikit-learn 库`linear_model`模块的`Ridge`类实现岭回归,代码如下所示。
|
||||
|
||||
```python
|
||||
|
|
@ -312,9 +343,11 @@ print(f'决定系数: {r2:.4f}')
|
|||
```
|
||||
|
||||
套索回归引入 $\small{L1}$ 正则化项,不仅防止过拟合,还具有特征选择的功,特别适用于高维数据。套索回归的损失函数如下所示:
|
||||
|
||||
$$
|
||||
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2} + \lambda \sum_{j=1}^{n}|\beta_{j}|
|
||||
$$
|
||||
|
||||
其中, $\small{L1}$ 正则化项 $\small{\lambda \sum_{j=1}^{n}|\beta_{j}|}$ 会将某些不重要的回归系数缩减为 0,从而实现特征选择。可以通过 scikit-learn 库`linear_model`模块的`Lasso`类实现套索回归,代码如下所示。
|
||||
|
||||
```python
|
||||
|
|
@ -344,9 +377,11 @@ print(f'决定系数: {r2:.4f}')
|
|||
> **注意**:上面代码运行结果中的回归系数,有四个特征的回归系数被设置为 0,相当于从 8 个特征中选出了 4 个重要的特征。模型的拟合效果是优于之间的回归模型的,这一点从均方误差和决定系数可以看出。
|
||||
|
||||
弹性网络回归结合了岭回归和套索回归的优点,通过同时引入 $\small{L1}$ 和 $\small{L2}$ 正则化项,适用于高维数据且特征之间存在相关的情况,其损失函数如下所示:
|
||||
|
||||
$$
|
||||
L(\mathbf{\beta}) = \sum_{i=1}^{m}(y_{i} - \hat{y}_{i})^{2} + \alpha \lambda \sum_{j=1}^{n}|\beta_{j}| + (1 - \alpha) \lambda \sum_{j=1}^{n}\beta_{j}^{2}
|
||||
$$
|
||||
|
||||
其中, $\small{\alpha}$ 是控制 $\small{L1}$ 和 $\small{L2}$ 正则化的权重比例。
|
||||
|
||||
### 线性回归另一种实现
|
||||
|
|
|
|||
|
|
@ -23,9 +23,11 @@
|
|||
### 数学描述
|
||||
|
||||
我们将上面的算法原理用数学语言进行描述。对于给定的数据集 ,K-Means 算法的目标是最小化目标函数(总误差平方和)。目标函数如下所示:
|
||||
|
||||
$$
|
||||
J = \sum_{i=1}^{K} \sum_{x \in C_{i}} {\lVert x - \mu_{i} \rVert}^{2}
|
||||
$$
|
||||
|
||||
其中, $\small{K}$ 是簇的数量, $\small{C_{i}}$ 表示第 $\small{i}$ 个簇中的样本集合, $\small{\mu_{i}}$ 是第 $\small{i}$ 个簇的中心, $\small{x}$ 是数据点。因为这个问题属于 NP 困难组合优化问题,所以在实际求解时我们会采用迭代的方式来寻求满意解。
|
||||
|
||||
首先随机选择 $\small{K}$ 个点作为初始质心 $\small{\mu_{1}, \mu_{2}, \cdots, \mu_{K}}$ ,对于每个数据点 $\small{x_{j}}$ ,计算到每个质心的距离,选择距离最近的质心,即:
|
||||
|
|
@ -33,10 +35,13 @@ $$
|
|||
$$
|
||||
C_{i} = \lbrace {x_{j} \ | \ {\lVert x_{j} - \mu_{i} \rVert}^{2} \le {\lVert x_{j} - \mu_{k} \rVert}^{2} \ \text{for all} \ k \ne i} \rbrace
|
||||
$$
|
||||
|
||||
更新质心为簇中所有点的均值,即:
|
||||
|
||||
$$
|
||||
\mu_{i} = \frac{1}{|C_{i}|}\sum_{x \in C_{i}} x
|
||||
$$
|
||||
|
||||
重复上面两个动作,直到质心不再变化或变化小于某个阈值,这就确保了算法的收敛性。
|
||||
|
||||
### 代码实现
|
||||
|
|
|
|||
Loading…
Reference in New Issue