写在前面:已经很久很久很久没有发博客了,有点愧疚还有点难过,不写博客的实践都干嘛了,哎!!!
XGBoost有两种接口:
- 原生接口,比如
xgboost.train
,xgboost.cv
- sklearn接口,比如
xgboost.XGBClassifier
,xgboost.XGBRegressor
两种接口有些许不同,比如原生接口的学习率参数是eta
,sklearn接口的是learning_rate
,原生接口要在train
或cv
函数中传入num_round
作为基学习器个数,而sklearn接口在定义模型时使用参数n_estimators
。sklearn接口的形式与sklearn中的模型保持统一,方便sklearn用户学习。
如果要对XGBoost模型进行交叉验证,可以使用原生接口的交叉验证函数xgboost.cv
;对于sklearn接口,可以使用sklearn.model_selection
中的cross_val_score
,cross_validate
,validation_curve
三个函数。
sklearn.model_selection
中的三个函数区别:
cross_val_score
最简单,返回模型给定参数的验证得分,不能返回训练得分cross_validate
复杂一些,返回模型给定参数的训练得分、验证得分、训练时间和验证时间等,甚至还可以指定多个评价指标validation_curve
返回模型指定一个参数的一系列候选值的训练得分和验证得分,可以通过判断拟合情况来调整该参数,也可以用来画validation_curve
下面分别以分类任务和回归任务展示一下四个函数的用法和输出情况。经过对比,在参数相同的条件下,四个函数的输出结果一致。发现了一个问题,validation_curve
和xgboost.cv
的输出结果大部分相同,但是前者的耗时却比后者多了好几倍。(暂时还找到原因,网上也没找到相同的问题,打算到stackoverflow上问一下,如果有答案的话再回来补充)
20200402补充:初步怀疑是热启动的问题,在使用xgboost.cv
进行交叉验证时,可以通过热启动的方式训练模型,此时只需要训练 N N N棵树;而把XGBRegressor
传入validation_curve
进行交叉验证,此时XGBRegressor
不能设置热启动(而sklearn的GBDT和随机森林都可以设置热启动),那就需要训练 1 + 2 + . . . + N = N ∗ ( N − 1 ) 2 1+2+...+N = \frac{N*(N-1)}{2} 1+2+...+N=2N∗(N−1)棵树,自然速度就慢了。
P.S. 下面代码是用Jupyter Notebook写的,懒得合并了。
import numpy as np
import xgboost as xgb
from sklearn.datasets import make_regression
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_validate
from sklearn.model_selection import KFold
from sklearn.model_selection import validation_curve
# 回归问题
X, y = make_regression(n_samples=10000, n_features=10)
# sklearn接口
n_estimators = 50
params