"subsample": 0.01,
}

ops = {"num_boost_round": 2000, "early_stopping_rounds": 10}

print("start training")
bst = xgb.train(
    params.items(),
    dtrain,
    num_boost_round=ops["num_boost_round"],
    evals=[(dtest, "eval"), (dtrain, "train")],
    early_stopping_rounds=ops["early_stopping_rounds"],
)

# dump model
bst.dump_model("xgboost_round_%s_%s.txt" % (ops["num_boost_round"], ops["early_stopping_rounds"]))
bst.save_model("xgboost_round_%s_%s.model" % (ops["num_boost_round"], ops["early_stopping_rounds"]))

# load test (valid) set
dtest = xgb.DMatrix(test_xs)

# predict
ypred = bst.predict(dtest, ntree_limit=bst.best_ntree_limit)
test_ys_preds = np.array(ypred)

# metrics
print(multiclass_log_loss(test_ys, test_ys_preds))
print(multiclass_accuracy(test_ys, test_ys_preds))

# import ipdb; ipdb.set_trace()
    bst = xgb.train(params.items(),
                    dtrain,
                    num_boost_round=ops['num_boost_round'],
                    evals=[(dtest, 'eval'), (dtrain, 'train')],
                    early_stopping_rounds=ops['early_stopping_rounds'])

    # load test (valid) set
    dtest = xgb.DMatrix(test_xs)

    # predict
    ypred = bst.predict(dtest, ntree_limit=bst.best_ntree_limit)
    test_ys_preds = np.array(ypred)

    # metrics
    log_loss = multiclass_log_loss(test_ys, test_ys_preds)
    print(log_loss)
    print(multiclass_accuracy(test_ys, test_ys_preds))

    # dump model
    bst.dump_model('xgboost_sorted_round_%s_%s_%s_%s_%s_%s_%s.txt'
                   % (ops['num_boost_round'],
                      ops['early_stopping_rounds'],
                      params['bst:max_depth'],
                      params['bst:eta'],
                      params['subsample'],
                      params['bst:colsample_bytree'],
                      log_loss))
    bst.save_model('xgboost_sorted_round_%s_%s_%s_%s_%s_%s_%s.model'
                   % (ops['num_boost_round'],
                      ops['early_stopping_rounds'],