使用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
相关产品推荐
相关产品推荐

