错误:xgboost 0.7 上的“base_score > 0.0f && base_score < 1.0f base_score 必须在 (0,1) 中以实现逻辑损失

Posted

技术标签:

【中文标题】错误:xgboost 0.7 上的“base_score > 0.0f && base_score < 1.0f base_score 必须在 (0,1) 中以实现逻辑损失”【英文标题】:Error: "base_score > 0.0f && base_score < 1.0f base_score must be in (0,1) for logistic loss" on xgboost 0.7 【发布时间】:2018-07-11 16:28:38 【问题描述】:

我有一个二元分类问题,我想尝试:XGBoost 模型,因为我在同一数据集上使用 GradientBoosting (sklearn) 模型取得了不错的结果。

import xgboost as xgb

XGB = xgb.XGBClassifier()
model = XGB.fit(X_train, y_train)

但是我有一个我不明白的错误

XGBoostError: b'[11:52:35] src/objective/regression_obj.cc:48: Check failed: base_score > 0.0f && base_score < 1.0f base_score must be in (0,1) for logistic loss

Stack trace returned 10 entries:
[bt] (0) /home/ilb/anaconda3/lib/python3.6/site-packages/xgboost/./lib/libxgboost.so(_ZN4dmlc15LogMessageFatalD1Ev+0x29) [0x7f3bd4d15299]
[bt] (1) /home/ilb/anaconda3/lib/python3.6/site-packages/xgboost/./lib/libxgboost.so(_ZN7xgboost3obj18LogisticRegression12ProbToMarginEf+0x7e) [0x7f3bd4d9116e]
[bt] (2) /home/ilb/anaconda3/lib/python3.6/site-packages/xgboost/./lib/libxgboost.so(_ZN7xgboost11LearnerImpl13LazyInitModelEv+0x264) [0x7f3bd4d204a4]
[bt] (3) /home/ilb/anaconda3/lib/python3.6/site-packages/xgboost/./lib/libxgboost.so(XGBoosterUpdateOneIter+0x4a) [0x7f3bd4e69afa]
[bt] (4) /home/ilb/anaconda3/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so(ffi_call_unix64+0x4c) [0x7f3ee8db6550]
[bt] (5) /home/ilb/anaconda3/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so(ffi_call+0x1f5) [0x7f3ee8db5cf5]
[bt] (6) /home/ilb/anaconda3/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so(_ctypes_callproc+0x3dc) [0x7f3ee8dad83c]
[bt] (7) /home/ilb/anaconda3/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so(+0x9da3) [0x7f3ee8da5da3]
[bt] (8) /home/ilb/anaconda3/bin/../lib/libpython3.6m.so.1.0(_PyObject_FastCallDict+0x9e) [0x7f3f1f69792e]
[bt] (9) /home/ilb/anaconda3/bin/../lib/libpython3.6m.so.1.0(+0x147d1b) [0x7f3f1f773d1b]

【问题讨论】:

您是否尝试过重新安装 xgboost 软件包? 是的,我试过了,还是一样的错误 【参考方案1】:

经过两个小时的搜索,我通过将LC_ALL 环境变量设置为en_US.UTF-8 解决了这个问题:

vim ~/.bashrc
export LC_ALL=en_US.UTF-8
source ~/.bashrc

问题出在我在 XGBoost 之前使用 PySpark 时。据我所知,问题的根源是 JVM 启动。

我想指出,修复这个问题不需要应用尚未合并的补丁。原始补丁问题强调根本原因是参数解析的区域设置相关代码。 0.5 被解析为 0,因为在某些语言环境(例如,俄语)下,输入预计为 0,5。您可以通过强制执行 en_US 语言环境(尤其是 LC_NUMERIC)来避免此错误:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

在这样的设置下构建会顺利通过。在我的情况下,语言环境溜进来了 由于 SendEnv LANG LC,通过 ssh 会话在另一台主机上_ 在 /etc/ssh/ssh_config* 中设置

来源:@frenzykryger 在这里回答:Github Issue: xgboost for JVM has test failures

【讨论】:

【参考方案2】:

这可能是 xgboost 0.7.0 版本中的错字。我错误地将“objective”输入为“objectve”,我的代码运行良好。但是当我改回正确的单词后,就出现了这个错误。

【讨论】:

【参考方案3】:

请试试这个,如果有帮助,请告诉我:

param0 = [
    ('max_depth', 3),
    ('eta', 0.025),
    ('objective', 'binary:logistic'),
    ('min_child_weight', 4),
    ('silent', 1),
    ('eval_metric', 'auc'),
    ('subsample', 0.75),
    ('colsample_bytree', 0.75),
    ('gamma', 0.75),
]

dtrain = xgb.DMatrix(X_train, label=y_train)
watchlist = [(dtrain, "trn")]
num_round = 100
bst = xgb.train(param0, dtrain, num_round, evals=watchlist)

【讨论】:

【参考方案4】:

我通过将 xgboost 包从 xgboost 0.7 降级到 xgboost 0.6a2 解决了这个问题。

【讨论】:

以上是关于错误:xgboost 0.7 上的“base_score > 0.0f && base_score < 1.0f base_score 必须在 (0,1) 中以实现逻辑损失的主要内容,如果未能解决你的问题,请参考以下文章

无法在 conda-forge 上安装 xgboost

为啥 Xgboost 中的功能不匹配错误

使用 XGBoost 绘制树返回 Graphviz 错误

关于数值变量和标签的 xgboost 错误消息

插入符号上的 R xgboost 尝试执行分类而不是回归

XGBoost 设置错误