XGBoost(Extreme Gradient Boosting)是一种集成学习算法,属于3类常用的集成方法(bagging、boosting、stacking)中的boosting算法类别。
另外,XGBoost属于梯度提升决策树(gradient boosting decision tree,GBDT)模型的范畴,如果能找到模型的较为优质的参数进行训练,就可以让模型在梯度下降过程中,更快地收敛,以及更好找到更小的损失值。
下面只是针对参数调优进行的实验,因此我们选择小一点的鸢尾花数据集,具体Python示例如下:
from sklearn import datasets
from sklearn.model_selection import train_test_split # 导入数据分割接口
from sklearn.model_selection import GridSearchCV # 导入网格搜索接口
import xgboost as xgb
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
'''
由于逻辑回归的分类标签只能在[0,1],所以我们选取鸢尾花前两个类别的数据进行试验
注意:鸢尾花数据集的分类数据是有序的
- 第1个样本到第50个属于第0类,对应 setosa(山鸢尾)
- 第51到第100个样本属于第1类,对应 versicolor(杂色鸢尾)
- 第101个样本到150个样本属于第2类,对应 virginica(维吉尼亚鸢尾)
'''
# 方式一:
X_select = X[y != 2, :]
y_select = y[y != 2]
# 方式二:
# X_s = X[:100,:]
# y_s = y[:100]
# 数据分割:测试集占30%
X_train,X_test,y_train,y_test = train_test_split(X_select,y_select,test_size=0.3,random_state=0)
# 定义交叉验证函数
def model_cv(model, X, y, cv_folds=5, early_stopping_rounds=50, seed=0):
'''
:param model: 模型估计器
:param X: 训练集特征数组
:param y: 训练集目标数组
:param cv_folds: 交叉验证的份数
:param early_stopping_rounds: 在多少次迭代 metrics 没有变好的情况下提前结束
:param seed: 随机种子
:return: 此参数组下最佳的迭代次数(n_estimators)
'''
# 获取 xgboost 特定参数
xgb_param = model.get_xgb_params()
# 构建XGBoost中使用的数据矩阵 data matrix
# DMatrix 是 XGBoost 使用的内部数据结构,它针对内存效率和训练速度进行了优化
xgb_train = xgb.DMatrix(data=X, label=y)
# 在给定的参数下进行交叉验证,xgboost.cv()函数返回交叉验证的评价历史信息
'''
xgboost.cv()函数的参数
num_boost_round ---> boosting 迭代的次数
metric ---> 评价指标
callback ---> 在每次迭代结束时应用的回调函数列表。 可以通过使用 Callback API 来使用预定义的回调。
例如:[xgb.callback.LearningRateScheduler(custom_rates)。
这里xgb.callback.EvaluationMonitor()函数的作用是打印每次迭代的评估结果
'''
cv_result = xgb.cv(params=xgb_param, dtrain=xgb_train, metrics='auc'