我试图理解为什么XGBoostClassifier()和xgb.train使用相同的数据和参数给出不同的结果。
我不使用虹膜数据集,但是它也在这里发生,因此我用它来说明问题。 我知道我应该进行train_test拆分,但是由于数据很少,所以我想以这种方式进行处理(使用train来查看错误)。如果我在train_test中拆分,则会发生在我的数据上,但是不幸的是,这是私人数据,我无法共享。
他们应该给出相同的结果,但他们却没有(我已经阅读了很多次文档,但找不到答案)。我尝试指定尽可能多的参数(实际上是XGBClassifier返回的所有参数),因此默认情况下没有参数被覆盖/放置
# -*- coding: utf-8 -*-
import xgboost as xgb
from sklearn.metrics import accuracy_score
from sklearn import datasets
import numpy as np
iris=datasets.load_iris()
X=iris.data
y=iris.target
dtrain = xgb.DMatrix(X,label = y)
dtest = xgb.DMatrix(X, label = y)
params={'base_score': 0.5,
'booster': 'gbtree',
'tree_method': 'auto',
'colsample_bylevel': 1,
'colsample_bynode': 1,
'colsample_bytree': 1,
'gamma': 0,
'learning_rate': 0.1,
'max_delta_step': 0,
'max_depth': 2,
'min_child_weight': 1,
'missing': None,
'n_estimators': 100,
'n_jobs': 1,
'nthread': 2,
'objective': 'multi:softprob',
'random_state': 0,
'reg_alpha': 0,
'reg_lambda': 1,
'scale_pos_weight': 1,
'seed': 0,
'silent': 1,
'subsample': 1,
'verbosity': 1,
'eta': 0.1,
'num_class': 5}
skboost = xgb.XGBClassifier(params=params).fit(X,y)
skpred=np.argmax(skboost.predict_proba(X),axis=1)
print("XGBClassifier (wrapper)===>",accuracy_score(skpred,y))
booster = xgb.train(params, dtrain)
pred=np.argmax(booster.predict(dtest),axis=1)
print("xgb.train===>",accuracy_score(pred,y))
booster2 = xgb.train(skboost.get_xgb_params()["params"], dtrain)
pred=np.argmax(booster2.predict(dtest),axis=1)
print("xgb.train with wrapper.get_xgb_params()===>",accuracy_score(pred,y))
我得到的输出是
XGBClassifier (wrapper)===> 1.0
xgb.train===> 0.9733333333333334
xgb.train with wrapper.get_xgb_params()===> 0.9733333333333334
有什么想法吗?
预先感谢