XGBoost в Python не дает аналогичного результата, как это было в R - PullRequest
0 голосов
/ 26 сентября 2018

Я разработал модель в R, используя XGBoost.Мои данные сильно разбалансированы по отношению к переменной класса, то есть 5% против 95%.Несмотря на это, я получил хорошие результаты в отношении AUC-ROC & AUC_Precision в R на тестовых данных.Это были 90% и 61%.Сейчас я перевожу код R на python для развертывания в производстве.Там нет R там.Я пытался сохранить те же гиперпараметры, что и в R, но результаты очень разные.AUC находится в диапазоне 86%, но точность составляет около 28% по данным испытаний.Я использую пакет XGBoost, а не XGBClassifier от sklearn.Причина тому: у меня много зависимых переменных, установленных как монотонные.В XGBClassifier нет опции, которую я могу установить 'monotone_constraint'.Вот фрагменты кода из R:

xgb.model <- xgb.train(data =xgb.data.train, params= list(objective='binary:logistic',
                                                          eta=0.3, max.depth=6, subsample=0.8,
                                                          gamma=5,
                                                          monotone_constraints=c(0,-1,-1,-1,-1,0,1,1,1),
                                                          eval_metric='auc',eval_metric='aucpr',
                                                          verbose = 1),
                       watchlist=list(test=xgb.data.test), nrounds=400, max.delta.step=10) 

И код из Python:

feature_monotones = [0,-1,-1,-1,-1,0,1,1,1]
eval_metric = ['auc','aucpr']
params = {objective='binary:logistic'
          'max_depth': 6,
          'eta': 0.3,
          #'silent': 1,
          #'nthread': 2,
          'subsample': 0.8,
          'gamma': 5,
          'seed': 1234,
          'eval_metric': eval_metric,
          'max_delta_step':10,
          'monotone_constraints': '(' + ','.join([str(m) for m in feature_monotones]) + ')'
         }

evallist  = [(dtrain, 'train'), (dtest, 'eval')]
evals_result = {}
bst = xgb.train(params, dtrain, num_boost_round = 1000, evals_result = evals_result, evals = evallist,  verbose_eval = True)

Я сохранил гиперпараметры схожими, за исключением nrounds = 400 в R и num_boost_round = 1000в питоне.В python нет совпадений с nrounds для R.Но я предполагаю, что nrounds похож на num_boost_round.

Есть идеи, почему так много разных результатов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...