原始xgboost(学习API)和sklearn XGBClassifier(Scikit-Learn API)之间的区别

18

我使用以下的xgboost sklearn接口来创建和训练xgb模型-1。

clf = xgb.XGBClassifier(n_estimators = 100, objective= 'binary:logistic',)
clf.fit(x_train, y_train,  early_stopping_rounds=10, eval_metric="auc", 
    eval_set=[(x_valid, y_valid)])

然后可以通过原始的xgboost创建xgboost模型,如下所示的model-2:

param = {}
param['objective'] = 'binary:logistic'
param['eval_metric'] = "auc"
num_rounds = 100
xgtrain = xgb.DMatrix(x_train, label=y_train)
xgval = xgb.DMatrix(x_valid, label=y_valid)
watchlist = [(xgtrain, 'train'),(xgval, 'val')]
model = xgb.train(plst, xgtrain, num_rounds, watchlist, early_stopping_rounds=10)

我认为模型1和模型2之间的所有参数都是相同的。但是验证分数不同。那么模型1和模型2之间有什么区别吗?


2
我也遇到了同样的问题。我花费了几个小时阅读所有的文档和代码,设置了所有的参数,然后进行了训练。但是,我发现 xgb.XGBClassifier 的 AUC 值只有 0.51,而 xgb.train 的 AUC 值却是 0.84。我不知道为什么会这样。 - Little Bobby Tables
2
sklearn 接口缺少一些选项。例如,DMatrix 类的 set_group 方法对于排名至关重要,在 sklearn 接口中没有类似的功能。 - xolodec
3个回答

9

@gofr1:关键是两个实现具有不同的默认参数。我也提供了一个例子。问候, - Du Phan

3

结果应该是相同的,因为XGBClassifier只是一个sklearn的接口,最终调用了xgb库。

您可以尝试在两种方法中都添加相同的seed以获得相同的结果。例如,在您的sklearn接口中:

clf = xgb.XGBClassifier(n_estimators = 100, objective= 'binary:logistic',seed=1234)

我已经尝试过了,但仍然没有运气。请查看问题的评论! - Little Bobby Tables

2
在我的情况下,我在sklearn的XGVRegressor中为n_esetimators(即原始xgboost的num_boost_round)设置了10,并且两者都显示了相同的结果,尽管它是线性回归。其他参数设置为默认值。
#1
param = {
    'objective': 'reg:squarederror'
}
bst = xgb.train(param, dtrain)

#2
sk_xgb = xgb.XGBRegressor(objective="reg:squarederror", n_estimators=10)

# #1 and #2 result same

我的环境是conda 4.9.2上的xgboost 1.3.0和scikit-learn 0.24.1。

试一下吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接