在XGBoost中通过Early Stop避免过拟合( 三 )


从第二张图可以得到相似的结果,大概在40轮迭代时效果比较理想 。
在中进行Early Stop
提供了在指定轮数完成后提前停止训练的功能 。
除了提供用于评估每轮迭代中的评价指标和数据集之外,还需要指定一个窗口大小,意味着连续这么多轮迭代中模型的效果没有提升 。这是通过s参数来设置的 。
例如,我们可以像下面这样设置连续10轮中对数损失都没有提升:
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)
如果同时指定了多个评估数据集和多个评价指标,s将会使用数组中的最后一个作为依据 。
下面提供了一个使用s的详细例子:
# early stoppingfrom 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 setsseed = 7test_size = 0.33X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)# fit model no training datamodel = XGBClassifier()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)# 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))
运行这段代码将得到如下的输出(部分):
...[35] validation_0-logloss:0.487962[36] validation_0-logloss:0.488218[37] validation_0-logloss:0.489582[38] validation_0-logloss:0.489334[39] validation_0-logloss:0.490969[40] validation_0-logloss:0.48978[41] validation_0-logloss:0.490704[42] validation_0-logloss:0.492369Stopping. Best iteration:[32] validation_0-logloss:0.487297
我们可以看到模型在迭代到42轮时停止了训练,在32轮迭代后观察到了最好的效果 。
通常将s设置为一个与总训练轮数相关的函数(本例中是10%),或者通过观察学习曲线来设置使得训练过程包含拐点,这两种方法都是不错的选择 。
总结
在这篇博客中你发现了如何监控模型的表现以及怎么做Early Stop 。
你学会了:
关于Early Stop或者这篇博客你还有什么想问的问题吗?欢迎在下方的评论区留言,我将尽我最大的努力来解答 。