我有二进制分类问题,我想尝试: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]
答案 0 :(得分:1)
请尝试这个并告诉我它是否有帮助:
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)
答案 1 :(得分: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 :(得分:0)
我通过将xgboost软件包从xgboost 0.7降级到xgboost 0.6a2来解决了这个问题。
答案 3 :(得分:0)
它可能是xgboost 0.7.0版本中的拼写错误。我错误地将'客观'称为'反对',我的代码运作良好。但在我改回正确的词之后,这个错误显示出来了。