未验证 提交 5594d1a7 编写于 作者: 飞龙 提交者: GitHub

Merge pull request #23 from tabeworks/master

通过在 Python 中使用 XGBoost 提前停止来避免过度拟合
# 通过在 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.
先完成此消息的编辑!
想要评论请 注册