【问题标题】:XGBoost Error info.labels.size() != 0U (0 vs. 0)XGBoost 错误 info.labels.size() != 0U (0 vs. 0)
【发布时间】:2018-12-13 16:40:55
【问题描述】:

我正在尝试使用 XGBOOST 在 python 上运行回归问题:

    import xgboost
    global clf
    clf = XGBRegressor(n_estimators = 500, 
                       learning_rate = 0.05,
                       max_depth=6,
                       n_jobs=4,
                       alpha = 0.1)

    clf.fit(X_train, y_train, 

            early_stopping_rounds = 5,
            eval_set = validation, verbose=False)

    predicted_test_tr = np.round(clf.predict(X_test))

但经过几次迭代,它会引发以下错误:

XGBoostError: b'[10:56:23] src/objective/regression_obj.cc:43: Check failed: info.labels_.size() != 0U (0 vs. 0) label set cannot be empty\n\nStack trace returned 7 entries:\n[bt] (0) 0   libxgboost.dylib                    0x0000001a1971b7a1 dmlc::StackTrace() + 305\n[bt] (1) 1   libxgboost.dylib                    0x0000001a1971b52f dmlc::LogMessageFatal::~LogMessageFatal() + 47\n[bt] (2) 2   libxgboost.dylib                    0x0000001a19792d21 xgboost::obj::RegLossObj<xgboost::obj::LinearSquareLoss>::GetGradient(xgboost::HostDeviceVector<float>*, xgboost::MetaInfo const&, int, xgboost::HostDeviceVector<xgboost::detail::GradientPairInternal<float> >*) + 257\n[bt] (3) 3   libxgboost.dylib                    0x0000001a19717496 xgboost::LearnerImpl::UpdateOneIter(int, xgboost::DMatrix*) + 1014\n[bt] (4) 4   libxgboost.dylib                    0x0000001a1973369f XGBoosterUpdateOneIter + 79\n[bt] (5) 5   libffi.6.dylib                      0x0000000110308884 ffi_call_unix64 + 76\n[bt] (6) 6   ???                                 0x00007ffee1b29950 0x0 + 140732684998992\n\n'

我尝试将输入和输出转换为:

.apply(pd.to_numeric)

但是仍然报同样的错误;怎么解决?

【问题讨论】:

  • 我认为你应该明确的对象功能。它可能有助于解决您的问题。在带有 multi 标签的分类中,如果你指定 binary loss 作为代价,你会得到类似的错误
  • 我正在尝试解决回归问题;
  • 我知道,我只是举了一个示例,其中我遇到了与您的错误相似的错误。我的观点是:如果可以的话,在 XGBRegressor 的调用中明确成本函数
  • 我试图在参数部分明确指定函数:objective = "reg:linear";但它报告了同样的错误。
  • 错误是否在clf = XGBRegressor(...clf.fit(... 引发?

标签: python machine-learning label regression xgboost


【解决方案1】:

这段代码运行没有任何问题:

from xgboost import XGBRegressor
clf = XGBRegressor(n_estimators = 500, 
                       learning_rate = 0.05,
                       max_depth=6,
                       n_jobs=1,
                       alpha = 0.1)

import numpy as np
X_train = np.random.uniform(size=(100,10))
y_train = np.zeros(100)
clf.fit(X_train, y_train, verbose=False)

请注意,我没有在 clf.fit 中设置 am eval。你的变量validation 是什么?它应该是 xgboost.DMatrix 和字符串的元组,例如:

dval = xgb.DMatrix(X_val, label=y_val)
validation = (dval, "validation")

【讨论】:

  • 我将验证集定义为我的测试集的一个子集:X_test = X[t:] y_test = y[t:] validation = [(X_test, y_test)]
  • 如果我运行代码: dval = xgboost.DMatrix(X_test, label=y_test) validation = (dval, "validation") ,它会引发:“'DMatrix' 对象不支持索引"
【解决方案2】:

请确保您的训练集和验证集都有所有输入 (x) 的标签 (y)。您可以以 DMatrix 的形式存储输入和标签,然后将它们传递给模型。这些是评估目的所必需的。

【讨论】:

    【解决方案3】:

    在我的情况下,当我在数据框中包含非 ascii 字符时会出现同样的问题。如果您已将其删除,它将起作用。或者试试 lightboost gbm,它会抛出一个确切的错误。

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多