xgboost error: Check failed: !auc_error AUC: the dataset only contains pos or neg samples'
xgboost error: Check failed: !auc_error AUC: the dataset only contains pos or neg samples'
我运行下面的代码没有问题:
churn_dmatrix = xgb.DMatrix(data = class_data.iloc[:, :-1], label = class_data.Churn)
params = {'objective' : 'binary:logistic' , 'max_depth' : 4}
cv_results = xgb.cv(dtrain = churn_dmatrix, params = params, nfold = 4, num_boost_round = 1, metrics = 'error', \
as_pandas = True)
print(cv_results)
train-error-mean train-error-std test-error-mean test-error-std
0 0.395833 0.108253 0.375 0.414578
但是,当我将指标更改为 'auc' 时,我收到一条错误消息:
cv_results = xgb.cv(dtrain = churn_dmatrix, params = params, nfold = 4, num_boost_round = 5, metrics = 'auc', \
as_pandas = True)
---------------------------------------------------------------------------
XGBoostError Traceback (most recent call last)
<ipython-input-102-ea99ef0705b5> in <module>()
----> 1 cv_results = xgb.cv(dtrain = churn_dmatrix, params = params, nfold = 4, num_boost_round = 5, metrics = 'auc', as_pandas = True)
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\training.py in cv(params, dtrain, num_boost_round, nfold, stratified, folds, metrics, obj, feval, maximize, early_stopping_rounds, fpreproc, as_pandas, verbose_eval, show_stdv, seed, callbacks, shuffle)
405 for fold in cvfolds:
406 fold.update(i, obj)
--> 407 res = aggcv([f.eval(i, feval) for f in cvfolds])
408
409 for key, mean, std in res:
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\training.py in <listcomp>(.0)
405 for fold in cvfolds:
406 fold.update(i, obj)
--> 407 res = aggcv([f.eval(i, feval) for f in cvfolds])
408
409 for key, mean, std in res:
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\training.py in eval(self, iteration, feval)
220 def eval(self, iteration, feval):
221 """"Evaluate the CVPack for one iteration."""
--> 222 return self.bst.eval_set(self.watchlist, iteration, feval)
223
224
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\core.py in eval_set(self, evals, iteration, feval)
953 dmats, evnames,
954 c_bst_ulong(len(evals)),
--> 955 ctypes.byref(msg)))
956 res = msg.value.decode()
957 if feval is not None:
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\core.py in _check_call(ret)
128 """
129 if ret != 0:
--> 130 raise XGBoostError(_LIB.XGBGetLastError())
131
132
XGBoostError: b'[14:27:23] src/metric/rank_metric.cc:135: Check failed: !auc_error AUC: the dataset only contains pos or neg samples'
似乎所有的预测都是正面的或负面的。我对么?有什么我可以做的吗?
当 xgboost 尝试拆分为 train/validation 并且在其中一个拆分中它没有负样本或正样本(在训练集或验证集中)时,问题就出现了。
我看到了 2 种可以采取的快速方法:
- 你可以看看你有多少正例和负例
有,并获得更多你错过的例子。它甚至会 更容易而且
faster 为你复制你缺少的那些例子。例如,如果您有 99% 的负面示例和 1% 的正面示例,您可能希望将每个正面示例复制 99 次(这是
99/1
的乘积)。
- 您可以自己创建交叉验证,从而获得对拆分的控制,并为每个拆分强制使用负例和正例。
我运行下面的代码没有问题:
churn_dmatrix = xgb.DMatrix(data = class_data.iloc[:, :-1], label = class_data.Churn)
params = {'objective' : 'binary:logistic' , 'max_depth' : 4}
cv_results = xgb.cv(dtrain = churn_dmatrix, params = params, nfold = 4, num_boost_round = 1, metrics = 'error', \
as_pandas = True)
print(cv_results)
train-error-mean train-error-std test-error-mean test-error-std
0 0.395833 0.108253 0.375 0.414578
但是,当我将指标更改为 'auc' 时,我收到一条错误消息:
cv_results = xgb.cv(dtrain = churn_dmatrix, params = params, nfold = 4, num_boost_round = 5, metrics = 'auc', \
as_pandas = True)
---------------------------------------------------------------------------
XGBoostError Traceback (most recent call last)
<ipython-input-102-ea99ef0705b5> in <module>()
----> 1 cv_results = xgb.cv(dtrain = churn_dmatrix, params = params, nfold = 4, num_boost_round = 5, metrics = 'auc', as_pandas = True)
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\training.py in cv(params, dtrain, num_boost_round, nfold, stratified, folds, metrics, obj, feval, maximize, early_stopping_rounds, fpreproc, as_pandas, verbose_eval, show_stdv, seed, callbacks, shuffle)
405 for fold in cvfolds:
406 fold.update(i, obj)
--> 407 res = aggcv([f.eval(i, feval) for f in cvfolds])
408
409 for key, mean, std in res:
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\training.py in <listcomp>(.0)
405 for fold in cvfolds:
406 fold.update(i, obj)
--> 407 res = aggcv([f.eval(i, feval) for f in cvfolds])
408
409 for key, mean, std in res:
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\training.py in eval(self, iteration, feval)
220 def eval(self, iteration, feval):
221 """"Evaluate the CVPack for one iteration."""
--> 222 return self.bst.eval_set(self.watchlist, iteration, feval)
223
224
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\core.py in eval_set(self, evals, iteration, feval)
953 dmats, evnames,
954 c_bst_ulong(len(evals)),
--> 955 ctypes.byref(msg)))
956 res = msg.value.decode()
957 if feval is not None:
C:\ProgramData\Anaconda3\lib\site-packages\xgboost\core.py in _check_call(ret)
128 """
129 if ret != 0:
--> 130 raise XGBoostError(_LIB.XGBGetLastError())
131
132
XGBoostError: b'[14:27:23] src/metric/rank_metric.cc:135: Check failed: !auc_error AUC: the dataset only contains pos or neg samples'
似乎所有的预测都是正面的或负面的。我对么?有什么我可以做的吗?
当 xgboost 尝试拆分为 train/validation 并且在其中一个拆分中它没有负样本或正样本(在训练集或验证集中)时,问题就出现了。
我看到了 2 种可以采取的快速方法:
- 你可以看看你有多少正例和负例
有,并获得更多你错过的例子。它甚至会 更容易而且
faster 为你复制你缺少的那些例子。例如,如果您有 99% 的负面示例和 1% 的正面示例,您可能希望将每个正面示例复制 99 次(这是
99/1
的乘积)。 - 您可以自己创建交叉验证,从而获得对拆分的控制,并为每个拆分强制使用负例和正例。