在XGBoost中通过Early Stop避免过拟合

本文翻译自AvoidBy EarlyWithIn,讲述如何在使用建模时通过Early Stop手段来避免过拟合 。全文系作者原创,仅供学习参考使用,转载授权请私信联系,否则将视为侵权行为 。码字不易,感谢支持 。以下为全文内容:
过拟合问题是在使用复杂的非线性学习算法时会经常碰到的,比如 算法 。
在这篇博客中你将发现如何通过Early Stop方法使得我们在使用中的模型时可以尽可能地避免过拟合问题:
读完这篇博客后,你将学到:
让我们开始吧 。
使用Early Stop避免过拟合
Early Stop是训练复杂机器学习模型以避免其过拟合的一种方法 。
它通过监控模型在一个额外的测试集上的表现来工作,当模型在测试集上的表现在连续的若干次(提前指定好的)迭代中都不再提升时它将终止训练过程 。
它通过尝试自动选择拐点来避免过拟合,在拐点处,测试数据集的性能开始下降,而训练数据集的性能随着模型开始过拟合而继续改善 。
性能的度量可以是训练模型时正在使用的损失函数(例如对数损失),或通常意义上用户感兴趣的外部度量(例如分类精度) 。
在中监控模型的表现
【在XGBoost中通过Early Stop避免过拟合】模型在训练时可以计算并输入在某个指定的测试数据集的性能表现 。
在调用model.fit()函数时,可以指定测试数据集和评价指标,同时设置参数为True,这样就可以在训练过程中输出模型在测试集的表现 。
例如,我们可以通过下面的方法在使用训练二分类任务时输出分类错误率(通过“error”指定):
eval_set = [(X_test, y_test)]model.fit(X_train, y_train, eval_metric="error", eval_set=eval_set, verbose=True)
提供了一系列的模型评价指标,包括但不限于:
完整的列表见文档中的“ Task ””章节 。
例如,我们可以演示如何监控使用UCI机器学习存储库(更新:从这里下载)的关于Pima糖尿病发病数据集的模型在训练过程中的性能指标 。
完整代码清单如下:
# monitor training performancefrom numpy import loadtxtfrom xgboost import XGBClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score# load datadataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")# split data into X and yX = dataset[:,0:8]Y = dataset[:,8]# split data into train and test setsX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)# fit model no training datamodel = XGBClassifier()eval_set = [(X_test, y_test)]model.fit(X_train, y_train, eval_metric="error", eval_set=eval_set, verbose=True)# make predictions for test datay_pred = model.predict(X_test)predictions = [round(value) for value in y_pred]# evaluate predictionsaccuracy = accuracy_score(y_test, predictions)print("Accuracy: %.2f%%" % (accuracy * 100.0))
运行这段代码将会在67%的数据集上训练模型,并且在每一轮迭代中使用剩下的33%数据来评估模型的性能 。

在XGBoost中通过Early Stop避免过拟合

文章插图
每次迭代都会输出分类错误,最终将会输出最后的分类准确率 。
...[89] validation_0-error:0.204724[90] validation_0-error:0.208661[91] validation_0-error:0.208661[92] validation_0-error:0.208661[93] validation_0-error:0.208661[94] validation_0-error:0.208661[95] validation_0-error:0.212598[96] validation_0-error:0.204724[97] validation_0-error:0.212598[98] validation_0-error:0.216535[99] validation_0-error:0.220472Accuracy: 77.95%
观察所有的输出,我们可以看到,在训练快要结束时测试集上的模型性能的变化是平缓的,甚至变得更差 。