XGBoost全称是eXtreme Gradient Boosting,由陈天奇所设计,和传统的梯度提升算法相比,XGBoost进行了许多改进,它能够比其他使用梯度提升的集成算法更加快速。关于xgboost的使用教程以及推导过程可以参考之前写的文章。
本文主要介绍xgb算法的调参过程,xgb本质上是boosting方法,即通过在数据上逐一构建多个弱评估器,经过多次迭代逐渐累积多个弱评估器的方法。xgb中的每个分类器是cart树,因此树模型对变量交叉会有较好的效果,但因此也容易产生过拟合。调参的步骤网上有很多教程,参数搜索的过程可以用网格搜索和贝叶斯优化(有空研究)。下面采用波士顿房产数据集,对xgb中调参做简单的学习介绍。
首先,建模并查看各类参数。
from xgboost import XGBRegressor as XGBR
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.linear_model import LinearRegression as LinearR
from sklearn.datasets import load_boston
from sklearn.model_selection import KFold, cross_val_score as CVS, train_test_split as TTS
from sklearn.metrics import mean_squared_error as MSE
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from time import time
import datetime
data = load_boston()
X = data.data
y = data.target
Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420)
#写明参数
param = {
'silent':True #默认为False,通常要手动把它关闭掉
,'objective':'reg:linear'
,"eta":0.1}
num_round = 180 #n_estimators
#类train,可以直接导入的参数是训练数据,树的数量,其他参数都需要通过params来导入
bst = xgb.train(param, dtrain, num_round)
#接口predict
preds = bst.predict(dtest)
xgb建模可以使用xgboost库,或者是使用sklearnAPI调用。实际情况中xgboost库本身训练模型效果会更优秀,且本身调参也方便许多。Xgboost自身有xgboost.cv()方法调参,如果是skleanAPI的话有GridSearchCV()方法进行调参。下面就用xgboost库建模,用xgboost.cv()的方法进行调参。
首先从设定默认参数开始,观察默认参数下交叉验证曲线的形状。
dfull = xgb.DMatrix(X,y)
param1 = {
'silent':True
,'obj':'reg:linear'
,"subsample":1
,"max_depth":6
,"eta":0.3
,"gamma":0
,"lambda":1
,"alpha":0
,"colsample_bytree":1
,"colsample_bylevel":1
,"colsample_bynode":1
,"nfold":5}
num_round = 200
cvresult1 = xgb.cv(param1, dfull, num_round)
fig,ax = plt.subplots(1,figsize=(15,8))
ax.set_ylim(top=5)
ax.grid()
ax.plot(range(1,201),cvresult1.iloc[:,0],c="red",label="train,original")
ax.plot(range(1,201),cvresult1.iloc[:,2],c="orange",label="test,original")
ax.legend(fontsize="xx-large")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgBINfyj-1598229157502)(https://imgkr2.cn-bj.ufileos.com/bd1f050b-54dd-4ae4-b16c-34d52612d26e.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=6NaIiGfVLWbLu%252BiFTwTX0k2ti58%253D&Expires=1598275140)]
从曲线上可以看出模型处于过拟合状态,需要进行剪枝。剪枝的目的是训练集和测试集的结果尽量接近,即上图中训练集的曲线上升,测试集的曲线下降。
下面用三组曲线展示调参结果,一组是原始数据的结果,一组是上一个参数调节结束的结果,还有一组是现在在调节参数的结果。
param1 = {
'silent'