XGBoost多分类问题--标签大小和预测大小不匹配。

4

我正在尝试构建一个模型,响应变量有三个选项:[0,1,2],以下是代码:

def model_jobs(X_train, X_val, y_train, y_val):
    param = {'eta': 0.3,
         'n_estimators': 600,
         'gamma': 2.0,
         'max_depth': 3,
         'min_child_weight': 1.0,
         'subsample': 0.8,
         'max_delta_step': 0.0,
         'colsample_bytree': 1.0,
         'lambda': 1.0,
         'alpha': 1.0,
         'num_class': 3,
         'eval_metric': "aucpr",
         'objective': "multi:softprob",
         'num_boost_round': 20,
         'early_stopping_rounds': 50, }
    model_fitting(X_train = X_train, y_train = y_train, X_val = X_val, y_val = y_val, tag="first", param=param)

def model_fitting(X_train, X_val, y_train, y_val, tag, param):
    dtrain = xgb.DMatrix(X_train, label=y_train)
    dval = xgb.DMatrix(X_val, label=y_val)
    watchlist = [(dtrain, "train"), (dval, "eval")]
    bst = xgb.train(
        dtrain=dtrain,
        evals=watchlist,
        params=param
    )

并且返回以下错误:

Check failed: preds.Size() == info.labels_.Size() (11122134 vs. 3707378) : label size predict size not match

我检查了所有的大小,它们完全正常。这张表格的实际大小是3707378,通过简单的数学计算,我们可以看出11122134 == 3707378 * 3。但令我困惑的是,如果我将参数中的num_class从3改为4,则会出现以下错误:
Check failed: preds.Size() == info.labels_.Size() (14829512 vs. 3707378) : label size predict size not match

14829512 == 3707378 * 4 是什么意思?我做错了什么?num_class和这个错误有什么关系?我的xgboost版本是1.1.1。

1个回答

4
问题在于eval_metric。显然multi:softprob不支持aucpr,我们需要将其更改为mlogloss。我不确定为什么会发生这种情况。
param = {'eta': 0.3,
     'n_estimators': 600,
     'gamma': 2.0,
     'max_depth': 3,
     'min_child_weight': 1.0,
     'subsample': 0.8,
     'max_delta_step': 0.0,
     'colsample_bytree': 1.0,
     'lambda': 1.0,
     'alpha': 1.0,
     'num_class': 3,
     'eval_metric': "mlogloss",
     'objective': "multi:softprob",
     'num_boost_round': 20,
     'early_stopping_rounds': 50, }

1
same for auc :/ - A.Najafi

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