对比XGBoost.cv和sklearn中的交叉验证

写在前面:已经很久很久很久没有发博客了,有点愧疚还有点难过,不写博客的实践都干嘛了,哎!!!

XGBoost有两种接口:

  1. 原生接口,比如xgboost.trainxgboost.cv
  2. sklearn接口,比如xgboost.XGBClassifierxgboost.XGBRegressor

两种接口有些许不同,比如原生接口的学习率参数是eta,sklearn接口的是learning_rate,原生接口要在traincv函数中传入num_round作为基学习器个数,而sklearn接口在定义模型时使用参数n_estimators。sklearn接口的形式与sklearn中的模型保持统一,方便sklearn用户学习。

如果要对XGBoost模型进行交叉验证,可以使用原生接口的交叉验证函数xgboost.cv;对于sklearn接口,可以使用sklearn.model_selection中的cross_val_scorecross_validatevalidation_curve三个函数。

sklearn.model_selection中的三个函数区别:

  1. cross_val_score最简单,返回模型给定参数的验证得分,不能返回训练得分
  2. cross_validate复杂一些,返回模型给定参数的训练得分、验证得分、训练时间和验证时间等,甚至还可以指定多个评价指标
  3. validation_curve返回模型指定一个参数的一系列候选值的训练得分和验证得分,可以通过判断拟合情况来调整该参数,也可以用来画validation_curve

下面分别以分类任务和回归任务展示一下四个函数的用法和输出情况。经过对比,在参数相同的条件下,四个函数的输出结果一致。发现了一个问题,validation_curvexgboost.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(N1)棵树,自然速度就慢了。

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 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值