Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
ml-mastery-zh
提交
5594d1a7
M
ml-mastery-zh
项目概览
OpenDocCN
/
ml-mastery-zh
8 个月 前同步成功
通知
2
Star
556
Fork
158
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
ml-mastery-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
5594d1a7
编写于
9月 11, 2019
作者:
飞
飞龙
提交者:
GitHub
9月 11, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #23 from tabeworks/master
通过在 Python 中使用 XGBoost 提前停止来避免过度拟合
上级
6435e203
16634e88
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
68 addition
and
66 deletion
+68
-66
docs/xgboost/avoid-overfitting-by-early-stopping-with-xgboost-in-python.md
...d-overfitting-by-early-stopping-with-xgboost-in-python.md
+68
-66
未找到文件。
docs/xgboost/avoid-overfitting-by-early-stopping-with-xgboost-in-python.md
浏览文件 @
5594d1a7
# 通过
在 Python 中使用 XGBoost 提前停止来避免过度拟合
# 通过
提前停止(early stopping)避免Python中应用XGBoost时发生得过拟合(overfitting)现象
> 原文: [https://machinelearningmastery.com/avoid-overfitting-by-early-stopping-with-xgboost-in-python/](https://machinelearningmastery.com/avoid-overfitting-by-early-stopping-with-xgboost-in-python/)
过
度拟合是复杂的非线性学习算法(例如梯度提升)的
问题。
过
拟合是非线性学习算法(例如梯度提升)中常见的一个复杂
问题。
在这篇文章中,您将了解如何
使用早期停止来限制 Python 中的 XGBoost 过度拟合
。
在这篇文章中,您将了解如何
通过提前停止(early stopping)来抑制在Python中应用XGBoost时的过拟合现象
。
阅读这篇文章
后,你会知道
:
阅读这篇文章
,您会学习到
:
*
关于早期停止作为减少训练数据过度拟合的方法。
*
如何在训练期间监控 XGBoost 模型的表现并绘制学习曲线。
*
如何使用早期停止来提前停止在最佳时期训练 XGBoost 模型。
*
提前停止(early stopping)是减少训练数据过拟合的一种方法。
*
如何在训练期间监测XGBoost模型的表现并绘制学习曲线。
*
如何使用提前停止(early stopping)来适时及早终止训练处于最佳epoch中的XGBoost模型。
请在我的
[
新书
](
https://machinelearningmastery.com/xgboost-with-python/
)
中找到如何通过XGBoost配置、训练、调试和评估梯度提升模型,其中包括了15个手把手(Step-by-Step)的示例课程以及完整的Python代码。
让我们开始吧。
*
**2017
年 1 月更新**
:已更新,以反映 scikit-learn API 版本 0.18.1 中的更改
。
*
**
更新 March / 2018**
:添加了备用链接以下载数据集,因为原始图像已被删
除。
*
**2017
年1月更新**
:此次更新为对应scikit-learn API版本0.18.1中的更改
。
*
**
2018年3月更新**
:为下载数据集添加了备用链接,旧链接已被移
除。
![
Avoid Overfitting By Early Stopping With XGBoost In Python
](
img/3b5a137b9d5bd85033c44aac0f3068ff.jpg
)
通过
Python 中的 XGBoost 提前停止来避免过度拟合
照片由
[
Michael Hamann
](
https://www.flickr.com/photos/michitux/7218180540/
)
拍摄,保留一些权利
。
通过
提前停止(early stopping)避免Python中应用XGBoost时发生得过拟合(overfitting)现象
照片由
[
Michael Hamann
](
https://www.flickr.com/photos/michitux/7218180540/
)
拍摄,保留部分版权
。
##
提前停止以避免过度
拟合
##
通过提前停止(early stopping)避免过
拟合
[
早期停止
](
https://en.wikipedia.org/wiki/Early_stopping
)
是一种训练复杂机器学习模型的方法,以避免过度拟合
。
[
提前停止(early stopping)
](
https://en.wikipedia.org/wiki/Early_stopping
)
是一种训练复杂机器学习模型时避免过拟合的方法
。
它通过监
视在单独的测试数据集上训练的模型的表现并且一旦在固定数量的训练迭代之后测试数据集上的表现没有改善就
停止训练过程。
它通过监
测在单独的测试数据集上训练模型的表现,并且观察到一旦在固定数量的训练迭代之后测试数据集上的表现没有得到改善,就会
停止训练过程。
它通过尝试自动选择测试数据集上的表现开始降低的拐点来避免过度拟合,同时随着模型开始过度拟合,训练数据集上的表现继续提高
。
通过尝试自动选出测试数据集上的表现开始降低而训练数据集上的表现继续提高这样的过拟合发生迹象拐点来避免过拟合
。
表现度量可以是
针对训练模型而优化的损失函数(例如对数损失),或者一般对问题感兴趣的外部度量(例如分类准确
度)。
表现度量可以是
通过训练模型而进行优化的损失函数(例如对数损失函数(logarithmic loss)),或者通常情况下问题所关注的外部指标(例如分类精
度)。
##
使用 XGBoost 监控
训练表现
##
在XGBoost中监测
训练表现
XGBoost
模型可以在训练期间评估和报告模型的
测试集上的表现。
XGBoost
模型可以在训练期间评估和报告模型在
测试集上的表现。
它通过在训练模型和
指定详细输出时调用
**model.fit()**
时指定测试数据集和评估指标
来支持此功能。
它通过在训练模型和
获取verbose output中调用
**model.fit()**
的同时指定测试数据集以及评估度量(evaluation metric)
来支持此功能。
例如,我们可以在
独立测试集(
**eval_set**
)上报告二进制分类错误率(“_ 错误 _”),同时训练 XGBoost 模型
,如下所示:
例如,我们可以在
训练XGBoost模型时,在独立测试集(
**eval_set**
)上报告二值分类误差("error")
,如下所示:
```
py
eval_set
=
[(
X_test
,
y_test
)]
model
.
fit
(
X_train
,
y_train
,
eval_metric
=
"error"
,
eval_set
=
eval_set
,
verbose
=
True
)
```
XGBoost
支持一套评估指标,
不仅限于:
XGBoost
所支持的评估度量(evaluation metric)集合包括但
不仅限于:
*
“
_rmse_
”表示均方根误差。
*
“
_mae_
”表示平均绝对误差。
*
“
_logloss_ ”用于二元对数损失,“ _mlogloss_ ”用于多级
对数损失(交叉熵)。
*
“
_ 错误 _”表示分类错误
。
*
“
_auc_ ”用于
ROC 曲线下的面积。
*
“
rmse
”表示均方根误差。
*
“
mae
”表示平均绝对误差。
*
“
logloss”表示二值对数损失,“mlogloss”表示多类
对数损失(交叉熵)。
*
“
error”表示分类误差
。
*
“
auc”表示
ROC 曲线下的面积。
完整列表
在 XGBoost 参数网页的“
[
学习任务参数
](
http://xgboost.readthedocs.io/en/latest//parameter.html
)
”部分中提供
。
完整列表
请参照XGBoost参数网页“
[
学习任务参数(Learning Task Parameters)
](
http://xgboost.readthedocs.io/en/latest//parameter.html
)
”
。
例如,我们可以
演示如何跟踪
[
Pima 印第安人糖尿病数据集
](
https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes
)
的 XGBoost 模型训练的表现,可从 UCI 机器学习库获取
(更新:
[
从此处下载
](
https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv
)
)。
例如,我们可以
展示如何追踪XGBoost模型训练的表现,应用对象是
[
Pima印第安人糖尿病数据集(Pima Indians onset of diabetes dataset)
](
https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes
)
,可以从UCI机器学习库(UCI Machine Learning Repository)获取下载
(更新:
[
从此处下载
](
https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv
)
)。
完整示例如下:
完整示例
代码
如下:
```
py
# monitor training performance
...
...
@@ -84,11 +86,11 @@ accuracy = accuracy_score(y_test, predictions)
print
(
"Accuracy: %.2f%%"
%
(
accuracy
*
100.0
))
```
运行
此示例在 67%的数据上训练模型,并在 33%的测试数据集上评估每个训练时期的
模型。
运行
这个例子将会在67%的数据上训练模型,并在剩余33%的测试数据集上,于每一个训练epoch评估一次
模型。
每
次迭代都会报告分类错误,最后报告分类准确性
。
每
一次迭代的结果都将会报告分类误差,而分类精度将会在最后给出
。
下面
提供了输出,为简洁起见,将其截断。我们可以看到,每次训练迭代都会报告分类错误(在每个提升的树
被添加到模型之后)。
下面
展示了结果输出,为简洁明了,只截取末尾部分。我们可以看到每次训练迭代都会报告分类误差(在每个boosted tree
被添加到模型之后)。
```
py
...
...
...
@@ -106,13 +108,13 @@ print("Accuracy: %.2f%%" % (accuracy * 100.0))
Accuracy
:
77.95
%
```
回顾所有输出,我们可以看到
测试集上的模型表现平稳,甚至在训练结束时变得更糟
。
回顾所有输出,我们可以看到
在测试集上模型表现平稳,不过在训练即将结束时表现有些下降
。
##
使用学习曲线评估 XGBoost
模型
##
通过学习曲线评估XGBoost
模型
我们可以在评估数据集上检
索模型的表现并绘制它以深入了解在训练时如何展开学习
。
我们可以在评估数据集上检
视模型的表现,并通过绘制图像以更深入地展开了解训练中是如何学习的
。
在
拟合 XGBoost 模型时,我们为
**eval_metric**
参数提供了一对 X 和 y 对。除了测试集,我们还可以提供训练数据集。这将提供一份报告,说明模型在训练期间对训练和测试集的执行
情况。
在
训练XGBoost模型时,我们为
**eval_metric**
参数提供了一对X和y数组。除了测试集,我们也可以一并提供训练数据集。它将说明模型在训练期间在训练集和测试集上分别表现的
情况。
例如:
...
...
@@ -121,14 +123,14 @@ eval_set = [(X_train, y_train), (X_test, y_test)]
model
.
fit
(
X_train
,
y_train
,
eval_metric
=
"error"
,
eval_set
=
eval_set
,
verbose
=
True
)
```
此外,通过调用
**model.evals_result()**
函数,
模型在训练后存储并使模型在每个评估集上的表现可用。这将返回评估数据集和分数的字典
,例如:
此外,通过调用
**model.evals_result()**
函数,
在每个评估集上训练的模型都可以存储并再度可用。这将返回评估数据集和评分的dictionary
,例如:
```
py
results
=
model
.
evals_result
()
print
(
results
)
```
这将
打印如下结果(为简洁起见,将其截断
):
这将
print如下结果(为简洁明了,只截取部分作说明
):
```
py
{
...
...
@@ -137,19 +139,19 @@ print(results)
}
```
'
_validation_0_ '和' _validation_1_ '中的每一个对应于在
**fit()调用中向 **
eval_set
** 参数提供数据集的顺序**
。
'
validation_0'和'validation_1'对应于在
**fit()**
调用中向
**eval_set**
参数提供数据集的顺序
。
可以按如下方式访问特定的结果数组,例如第一个数据集和错误度量标准
:
若需要访问特定的结果数组,例如针对第一个数据集和其误差指标,可以操作如下
:
```
py
results
[
'validation_0'
][
'error'
]
```
此外,我们可以通过
为
**fit()**
函数的 eval_metric 参数提供一系列度量来指定更多评估度量来评估和收集
。
此外,我们可以通过
向
**fit()**
函数的eval_metric参数提供度量数组,来指定更多的评估度量(evaluation metric)用于评价和汇总
。
然后,我们可以使用这些收集的表现度量来创建线图,并进一步了解模型在训练时期的训练
和测试数据集上的表现。
我们可以使用这些汇总的表现度量来创建曲线图,并进一步解读模型在训练epochs过程中分别在训练数据集
和测试数据集上的表现。
下面是完整的代码示例,显示了如何在
线图上显示收集
的结果。
下面是完整的代码示例,显示了如何在
曲线图上可视化汇总
的结果。
```
py
# plot learning curve
...
...
@@ -197,40 +199,40 @@ pyplot.title('XGBoost Classification Error')
pyplot
.
show
()
```
运行
此代码会报告每个纪元的训练和测试数据集的分类错误。我们可以通过在
**fit()**
函数的调用中设置
**verbose = False**
(默认值)来关闭它
。
运行
这段代码会显示每个epoch中训练数据集和测试数据集的分类误差。我们可以通过在
**fit()**
函数的调用中设置
**verbose = False**
(默认值)来关闭这个功能
。
创建了两个图。第一个显示了训练和测试数据集中每个时期的 XGBoost 模型的对数损失
。
我们看到结果创建了两张图。第一张图显示了训练数据集和测试数据集每个epoch中XGBoost模型的对数损失(logarithmic loss)
。
![
XGBoost Learning Curve Log Loss
](
img/3dd164f486ba1862fa97f82eb6693360.jpg
)
XGBoost
学习曲线日志丢失
XGBoost
学习曲线(对数损失(log loss))
第二
个图显示了训练和测试数据集中每个时期的 XGBoost 模型的分类错误
。
第二
张图显示了训练数据集和测试数据集每个epoch中XGBoost模型的分类误差(classification error)
。
![
XGBoost Learning Curve Classification Error
](
img/cdfec3000bac01a37daacb6f874ff978.jpg
)
XGBoost
学习曲线分类错误
XGBoost
学习曲线(分类误差(classification error))
通过回顾
logloss 图,看起来有机会提前停止学习,也许在 20 世纪到 40 世纪左右
。
通过回顾
logloss的图像,我们看起来是有提前停止学习过程的机会,也许在epoch 20到epoch 40之间的某个阶段
。
我们看到了类似的分类错误故事,其中错误似乎在 40 左右的时间内重新出现
。
在分类误差的图像中,我们也观察到了类似的情况,误差似乎在epoch 40左右出现上升
。
##
早期停止使用 XGBoost
##
在XGBoost中使用提前停止(early stopping)
XGBoost
支持在固定次数的迭代后提前停止
。
XGBoost
可以支持在固定次数的迭代后提前停止(early stopping)
。
除了为每个
时期指定用于评估的度量和度量数据集之外,还必须指定一个窗口,其中没有观察到任何改进的时期数。这在
**early_stopping_rounds**
参数中指定
。
除了为每个
epoch指定用于评估的度量和测试数据集之外,还必须指定一个epoch窗长,它代表没有观察到任何改善的epoch数目。它可以在
**early_stopping_rounds**
参数中实现
。
例如,我们可以
检查 10 个时期的对数损失没有改善
如下:
例如,我们可以
在10个epoch中检查对数损失没有得到改善,代码
如下:
```
py
eval_set
=
[(
X_test
,
y_test
)]
model
.
fit
(
X_train
,
y_train
,
early_stopping_rounds
=
10
,
eval_metric
=
"logloss"
,
eval_set
=
eval_set
,
verbose
=
True
)
```
如果提供了多个评估数据集或多个评估
指标,则提前停止
将使用列表中的最后一个。
如果提供了多个评估数据集或多个评估
度量(evaluation metric),则提前停止(early stopping)
将使用列表中的最后一个。
下面
提供了完整性的完整示例,提前停止
。
下面
展示提前停止(early stopping)的一个完整示例
。
```
py
# early stopping
...
...
@@ -259,7 +261,7 @@ accuracy = accuracy_score(y_test, predictions)
print
(
"Accuracy: %.2f%%"
%
(
accuracy
*
100.0
))
```
运行
该示例提供以下输出,为简洁起见,将其截断
:
运行
示例代码将给出如下输出(为简洁明了,只截取部分作说明)
:
```
py
...
...
...
@@ -275,18 +277,18 @@ Stopping. Best iteration:
[
32
]
validation_0
-
logloss
:
0.487297
```
我们可以看到模型在
第 42 纪元停止训练(接近我们对学习曲线的手动判断的预期),并且在第 32 纪元观察到具有最佳损失
的模型。
我们可以看到模型在
epoch 42停止训练(接近我们对学习曲线人为判断的预期),并且在epoch 32观察到具有最佳损失结果
的模型。
选择
**early_stopping_rounds**
作为训练时期总数(在这种情况下为 10%)的合理函数通常是个好主意,或者尝试对应于在情节上可以观察到的拐点时期。学习曲线
。
通常情况下,选择
**early_stopping_rounds**
作为训练epoch总数(在这种情况下为 10%)是个不错的主意,或者尝试找到可能观察到的学习曲线拐点时期
。
##
摘要
##
总结
在这篇文章中,您
发现了监控表现和提前停止
。
在这篇文章中,您
了解到了如何监测性能表现和提前停止(early stopping)
。
你了解到
:
所学到的要点是
:
*
关于在模型过度训练数据之前停止模型训练的早期停止技术
。
*
如何在训练期间监
控 XGBoost
模型的表现并绘制学习曲线。
*
如何在训练
XGBoost 模型时配置早期停止
。
*
提前停止(early stopping)技术能够在训练数据集发生过拟合之前就停止模型训练
。
*
如何在训练期间监
测XGBoost
模型的表现并绘制学习曲线。
*
如何在训练
XGBoost模型中配置提前停止(early stopping)
。
您对过度拟合或有关此帖子有任何疑问吗?在评论中提出您的问题,我会尽力回答。
\ No newline at end of file
您对过拟合或这篇文章有任何疑问吗?请在评论中提出您的问题,我将会尽力回答。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录