You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用xgb.cv时出现Empty dataset at worker:0警告的问题求助

解决XGBoost交叉验证时的"Empty dataset at worker"警告

问题原因

你遇到的警告根源是训练样本量远小于交叉验证折数:你的训练集仅6个样本,却设置了nfold=10,交叉验证划分时必然会出现空的fold(6个样本分到10个fold,至少4个fold没有数据),触发了XGBoost底层的空数据集检测警告。

解决方案

  • 降低交叉验证折数:设置nfold为小于等于样本数的合理值,比如nfold=3或nfold=2,确保每个fold都能分配到样本。
  • 使用分层交叉验证:若样本量允许保持较多折数,添加stratified=True参数,让XGBoost按类别比例划分fold,避免单个fold出现类别缺失或空数据集(但样本量过小时此方法也无法避免空fold)。
  • 补充训练样本:仅6个样本的情况下,模型泛化能力极差,交叉验证结果也无参考意义,补充更多数据是根本解决办法。

修改后的示例代码

import pandas as pd
import xgboost as xgb
import numpy as np

seed = 10
# 调整折数适配6个样本
nfold = 3

X = pd.DataFrame(np.random.randint(0,100,size=(6, 8)), columns=list("ABCDEFGH"))
y = pd.Series(np.array([0,0,0,1,1,1]), index = [0,1,2,3,4,5])
X_test = pd.DataFrame(np.random.randint(0,100,size=(2, 8)), columns=list("ABCDEFGH"))
X_test.index= [6,7]
y_test = pd.Series(np.array([0,1]), index = [6,7])

dtrain = xgb.DMatrix(X, label=y)
dtest = xgb.DMatrix(X_test, label = y_test)

params = {'objective':'multi:softmax'}
params['eval_metric'] = "mlogloss"
params['num_class'] = np.unique(y).size
num_boost_round = 999

default_model = xgb.train(
    params,
    dtrain,
    num_boost_round=num_boost_round,
    evals=[(dtest, "Test")],
    early_stopping_rounds=10)

# 调整折数并启用分层交叉验证
cv_results = xgb.cv(
    params,
    dtrain,
    num_boost_round=num_boost_round,
    seed=seed,
    nfold=nfold,
    metrics={'mlogloss'},
    early_stopping_rounds=10,
    stratified=True
)

内容的提问来源于stack exchange,提问作者MPTheAnt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:45:40