Skip to content

Commit

Permalink
1. 【关于 交叉验证】 那些你不知道的事
Browse files Browse the repository at this point in the history
  • Loading branch information
km1994 committed Apr 17, 2021
1 parent 7e90377 commit e521f83
Show file tree
Hide file tree
Showing 14 changed files with 210 additions and 22 deletions.
38 changes: 19 additions & 19 deletions BasicAlgorithm/过拟合和欠拟合.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,25 @@

### 2.1 过拟合是什么及检验方法?

- 问题表现:高方差
- 当训练集和测试集的误差之间有大的差距时,为高方差;
- 当方差很高,训练集和验证集的准确率相差太多,应该是过拟合;
- 表现为训练效果好,但是测试效果差,即模型的泛化能力差。可以通过观察模型在训练集和测试集上的损失函数值随着epoch的变化,如果是过拟合,模型在测试集上的损失函数值一般是先下降后上升
- 问题表现方式:高方差
- 如果 训练集 和 测试集 的 误差间 呈现较大的差异时,即为高方差;
- 在 高方差 时,训练集 训练效果很好, 但是 验证集 的验证效果很差的时候, 即 训练集 和 验证集 呈现出 较大的差异,即模型的泛化能力差。这种现象 称为 过拟合;
- 检验方法:此时,观察模型在训练集和测试集上的损失函数值随着epoch的变化情况,当 模型 在 测试集 上的 损失函数值 出现 先下降后上升,那么此时可能出现过拟合

### 2.2 导致过拟合的原因是什么?

1. 训练数据太少,样本单一。如果训练样本只有负样本,然后拿生成的模型去预测正样本,这肯定预测不准。所以训练样本要尽可能的全面,覆盖所有的数据类型
2. 存在噪声。噪声指训练数据中的干扰数据。过多的干扰会导致记录了很多噪声特征,忽略了真实输入和输出之间的关系
3. 模型过于复杂。模型太复杂,已经能够死记硬背记录下了训练数据的信息,但是遇到没有见过的数据的时候不能够变通,泛化能力太差。我们希望模型对不同的数据都有稳定的输出。模型太复杂是过拟合的重要因素。
1. 训练集数量不足,样本类型单一。例如:如果 我们 利用 只包含 负样本的训练集 训练 模型,然后利用训练好的模型 预测 验证集中 的 正样本时,此时就会出现,模型 在 训练的时候,效果特别好,但是在验证的时候效果下降问题。因此,在选取训练集时,应当覆盖所有的数据类型
2. 训练集中存在噪声。噪声指的是 训练数据中 的 干扰数据,噪声数据 会 误导模型 记录 较多 的 错误特征,而 忽略了 真实样本 中 的正确特征信息
3. 模型复杂度过高。当模型过于复杂时,会导致 模型 **过于充分** 的 学习到 训练数据集中特征信息,但是遇到没有见过的数据的时候不能够变通,泛化能力太差。我们希望模型对不同的数据都有稳定的输出。模型太复杂是过拟合的重要因素。

### 2.3 过拟合的解决方法是什么?

1. 增加样本,要覆盖全部的数据类型。数据经过清洗之后再进行模型训练,防止噪声数据干扰模型;
2. 降低模型复杂度。在训练和建立模型的时候,从相对简单的模型开始,不要一开始就把特征做的非常多,模型参数挑的非常复杂;
3. 正则化。在模型算法中添加惩罚函数来防止过拟合。常见的有L1,L2正则化。而且 L1正则还可以自动进行特征选择;
4. 集成学习方法bagging(如随机森林)能有效防止过拟合
1. 标注不同类型的样本,是 样本尽可能的均衡。数据经过清洗之后再进行模型训练,防止噪声数据干扰模型;
2. 降低训练模型复杂度。在训练和建立模型的时候,从相对简单的模型开始,不要一开始就把特征做的非常多,模型参数挑的非常复杂;
3. 正则化。在模型算法中添加惩罚函数来防止模型出现过拟合问题。常见的有L1,L2,dropout 正则化等。而且 L1正则还可以自动进行特征选择;
4. 采用 bagging(如随机森林等)集成学习方法 来 防止过拟合
5. 减少特征个数(不是太推荐,但也是一种方法)。可以使用特征选择,减少特征数或使用较少的特征组合,对于按区间离散化的特征,增大划分的区间;
6. 交叉检验,通过交叉检验得到较优的模型参数
6. 交叉检验。利用 交叉检验的方法,来让模型得到充分的训练,以得到较优的模型参数
7. 早停策略。本质上是交叉验证策略,选择合适的训练次数,避免训练的网络过度拟合训练数据;
8. DropOut策略。核心思想就是bagging,可以看作是低成本的集成学习。所谓的Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。 在对训练集中的一批数据进行训练时,我们随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合我们的一批训练数据。使用基于dropout的正则化比基于bagging的正则化简单,这显而易见,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。

Expand All @@ -39,19 +39,19 @@
### 3.1 欠拟合是什么及检验方法?

- 问题表现:高偏差
- 当训练集和测试集的误差收敛但却很高时,为高偏差;
- 当偏差很高,训练集和验证集的准确率都很低,很可能是欠拟合;
- 表现为不能很好的拟合数据,训练集和测试集效果都不佳。
- 如果 训练集 和 测试集 的 误差 收敛 但是收敛值 很高时,即为高偏差;
- 虽然 训练集 和 测试集 都可以收敛,但是偏差很高,训练集和验证集的准确率都很低,这种现象 称为 欠拟合;
- 检验方法:模型 无法很好的拟合数据,导致 训练集和测试集效果都不佳。

### 3.2 导致欠拟合的原因是什么?

- 原因:模型没有很好的捕捉数据特征,不能很好地拟合数据
- 原因:模型没有 充分 学习到 数据中的特征信息,使得 模型 无法很好地拟合数据

### 3.3 欠拟合的解决方法是什么?

1. 做特征工程,添加更多的特征项,比如特征组合、高次特征,来增大假设空间。如果欠拟合是由于特征项不够,没有足够的信息支持模型做判断
2. 集成学习方法boosting(如GBDT)能有效解决high bias;
3. 增加模型复杂度。如果模型太简单,不能够应对复杂的任务。可以使用更复杂的模型。比如说可以使用SVM的核函数,增加了模型复杂度,把低维不可分的数据映射到高维空间,就可以线性可分,减小欠拟合;
1. 特征工程。添加更多的特征项,eg:特征组合、高次特征,来增大假设空间;
2. 集成学习方法。 boosting(如GBDT)能有效解决 high bias;
3. 提高 模型复杂度。当 所采用的模型比较简单,不能够应对复杂的任务。可以考虑 提升 模型复杂度,选用复杂度更好、学习能力更强的模型。比如说可以使用 SVM 的核函数,增加了模型复杂度,把低维不可分的数据映射到高维空间,就可以线性可分,减小欠拟合;
4. 减小正则化系数。

## 参考资料
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

> 作者:杨夕
>
> 本文链接:https://github.com/km1994/nlp_paper_study
> 面筋地址:https://github.com/km1994/NLP-Interview-Notes
>
> 个人笔记:https://github.com/km1994/nlp_paper_study
>
> 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。
>
Expand Down
10 changes: 10 additions & 0 deletions Trick/SmallSampleProblem/EDA/eda.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# 【关于 EDA 】那些你不知道的事

> 作者:杨夕
>
> 面筋地址:https://github.com/km1994/NLP-Interview-Notes
>
> 个人笔记:https://github.com/km1994/nlp_paper_study
>
> 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。
>
> 【注:手机阅读可能图片打不开!!!】
## 目录

![](img/数据增强EDA.png)
Expand Down
6 changes: 4 additions & 2 deletions Trick/SmallSampleProblem/activeLearn/readme.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# 【关于 主动学习】 那些你不知道的事

> 作者:杨夕
> 作者:杨夕、芙蕖、李玲、陈海顺、twilight、LeoLRH、JimmyDU、艾春辉、张永泰、金金金
>
> 本文链接:https://github.com/km1994/nlp_paper_study
> 面筋地址:https://github.com/km1994/NLP-Interview-Notes
>
> 个人笔记:https://github.com/km1994/nlp_paper_study
>
> 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。
>
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
154 changes: 154 additions & 0 deletions Trick/cross_validation/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
# 【关于 交叉验证】 那些你不知道的事

> 作者:杨夕
>
> 面筋地址:https://github.com/km1994/NLP-Interview-Notes
>
> 个人笔记:https://github.com/km1994/nlp_paper_study
>
> 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。
>
> 【注:手机阅读可能图片打不开!!!】
## 一、为什么需要交叉验证?

### 1.1 引言

学习预测函数的参数,并在相同数据集上进行测试是一种错误的做法: 一个仅给出测试用例标签的模型将会获得极高的分数,但对于尚未出现过的数据它则无法预测出任何有用的信息。 这种情况称为 overfitting(过拟合).

![](img/微信截图_20210417142112.png)

### 1.2 The Validation Set Approach

#### 1.2.1 The Validation Set Approach介绍

为了避免这种情况,在进行(监督)机器学习实验时,通常取出部分可利用数据作为 test set(测试数据集) X_test, y_test。需要强调的是这里说的 “experiment(实验)” 并不仅限于学术(academic),因为即使是在商业场景下机器学习也往往是从实验开始的。

![](img/微信截图_20210417144331.png)

#### 1.2.2 The Validation Set Approach scikit-learn 实现

在 scikit-learn 包中 有 train_test_split 辅助函数可以很快地将实验数据集划分为任何训练集(training sets)和测试集(test sets)。

```s
>>> import numpy as np
>>> from sklearn.model_selection import train_test_split
>>> from sklearn import datasets
>>> from sklearn import svm
>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))
```

#### 1.2.3 The Validation Set Approach 存在问题

1. 模型性能强依赖于 划分的方式。也就是划分的不同,最后效果存在很大的差异。

![](img/微信截图_20210417144658.png)

> 注:右边是十种不同的训练集和测试集划分方法得到的test MSE,可以看到,在不同的划分方法下,test MSE的变动是很大的,而且对应的最优degree也不一样。所以如果我们的训练集和测试集的划分方法不够好,很有可能无法选择到最好的模型与参数。
2. 只有部分数据参与模型训练。由于将原始数据分为3个数据集合,我们就大大减少了可用于模型学习的样本数量, 并且得到的结果依赖于集合对(训练,验证)的随机选择。

## 二、 什么是 Cross-Validation 方法?

### 2.1 前言

第一章 已经 介绍了 The Validation Set Approach,并分析 该方法 所存在问题,那么 有什么方法 可以 解决 该问题呢?

### 2.2 什么是 Cross-Validation 方法?

Cross Validation:简言之,就是进行多次train_test_split划分;每次划分时,在不同的数据集上进行训练、测试评估,从而得出一个评价结果。

### 2.3 Cross-Validation 方法 的 目的 是什么?

1. 从有限的学习数据中获取尽可能多的有效信息;
2. 交叉验证从多个方向开始学习样本的,可以有效地避免陷入局部最小值;
3. 可以在一定程度上避免过拟合问题;

## 三、Cross-Validation 方法有哪些方法?

### 3.1 Leave-one-out cross-validation(LOOCV)

#### 3.1.1 LOOCV 方法介绍

将数据集分成 N 份,然后 每次从中选取 一份 作为 测试集,其他的作为 训练集,循环重复步骤 N 次,如下图所示:

![](img/微信截图_20210417151022.png)

这种方法 的优点是能够 训练 n 个 不同的模型,并得到 一个 MSE,最后将 这 n 个 MSE 取平均 得到 最终的 test MES。

![](img/微信截图_20210417152434.png)

#### 3.1.2 LOOCV 方法 实现方式

```s
>>> from sklearn.model_selection import LeaveOneOut
>>> X = [1, 2, 3, 4]
>>> loo = LeaveOneOut()
>>> for train, test in loo.split(X):
... print("%s %s" % (train, test))
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]
```

#### 3.1.3 LOOCV 方法 的 优缺点

- 优点:

1. 该方法是 循环 N 次选取,每一份数据集都可以作为 测试集 进行测试,所以 该方法 不受 划分方式 的 影响;
2. 因为能够 循环 N 次训练,所以所有数据 都可以参与 模型训练;

- 缺点:

1. 由于 要 循环 计算 N 次,所以 计算量过高;

### 3.2 K-fold Cross Validation

#### 3.2.1 前言

上一节 介绍了 LOOCV 方法,该方法 由于需要 将 数据集 分成 N 份,并抽取其中一份 作为 验证集,循环 N 次,这种方式虽然能够解决 The Validation Set Approach 问题,但是 计算复杂度太高,那么 有没有 更好的Cross Validation方式呢?

因为该问题,有了 K折交叉验证方法(K-fold Cross Validation)。

#### 3.2.2 K-fold Cross Validation 介绍

将数据集划分为互斥的K个集合,用K-1个集合做训练,然后剩下的一个做验证。

这种方式和 LOOCV 的区别在于 该方法每次 选取 K 份数据【eg:一般 k=5】

![](img/微信截图_20210417155546.png)

#### 3.2.3 K-fold Cross Validation 思路【以 k=5 为例】

1. 将 数据集 分割成 5 份;
2. 每次从中选取不同的样本作为 验证集,而其他部分作为训练集用于训练模型,得到 不同 的 $MSE_i$;
3. 对 5 次 $MSE_i$ 取平均值作为最后 的 MSE;

![](img/微信截图_20210417155034.png)

```s
>>> import numpy as np
>>> from sklearn.model_selection import RepeatedKFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> random_state = 12883823
>>> rkf = RepeatedKFold(n_splits=2, n_repeats=2, random_state=random_state)
>>> for train, test in rkf.split(X):
... print("%s %s" % (train, test))
...
[2 3] [0 1]
[0 1] [2 3]
[0 2] [1 3]
[1 3] [0 2]
```

## 参考

1. [交叉验证:评估估算器的表现](https://sklearn.apachecn.org/docs/master/30.html)
2. [【机器学习】Cross-Validation(交叉验证)详解](https://zhuanlan.zhihu.com/p/24825503)
3. [几种交叉验证(cross validation)方式的比较](https://cloud.tencent.com/developer/article/1093322)

10 changes: 10 additions & 0 deletions Trick/new_word_find/readme.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# 【关于 新词发现】那些你不知道的事

> 作者:杨夕
>
> 面筋地址:https://github.com/km1994/NLP-Interview-Notes
>
> 个人笔记:https://github.com/km1994/nlp_paper_study
>
> 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。
>
> 【注:手机阅读可能图片打不开!!!】
![](img/微信截图_20210206161631.png)

## 一、动机篇
Expand Down
10 changes: 10 additions & 0 deletions Trick/noisy_label_learning/readme.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# 【关于 “脏数据”处理】那些你不知道的事

> 作者:杨夕
>
> 面筋地址:https://github.com/km1994/NLP-Interview-Notes
>
> 个人笔记:https://github.com/km1994/nlp_paper_study
>
> 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。
>
> 【注:手机阅读可能图片打不开!!!】
![](img/微信截图_20210206161111.png)

## 一、动机
Expand Down

0 comments on commit e521f83

Please sign in to comment.