为何XGBoost提示数据集为空但实际含数据?附代码与报错
问题解决
1. 「数据集为空/仅含正负样本」警告的原因及修复
你遇到的警告是因为在多分类任务中误用了二分类的AUC指标。XGBoost的auc指标默认针对二分类场景,当你在多分类任务(multi:softprob)中使用它时,XGBoost会对每个类别单独做二分类AUC计算。而交叉验证的fold中,可能存在某个类别样本数量为0,或者该fold里只有这类样本的情况,就会触发这个警告。
修复方法很简单:移除参数里的"auc"指标,保留多分类适用的mlogloss和merror即可:
results = xgb.cv( params, dtrain_clf, num_boost_round=n, nfold=5, metrics=["mlogloss", "merror"], # 移除auc指标 )
另外,你的代码里有个语法错误:train_test_split语句末尾多了一个方括号],需要删掉:
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, random_state=1, stratify=y_encoded)
2. 关于计算RMSE的需求
RMSE是回归任务的评估指标,你当前的任务是多分类(目标变量cut是分类类型),直接在分类任务里用RMSE不合适。如果你的实际需求是有序回归(比如cut的等级是有序的:Fair < Good < Very Good < Premium < Ideal),可以调整任务类型为回归:
回归任务调整步骤:
- 修改目标函数为回归类型,移除多分类专用的
num_class参数:
params = {"objective": "reg:squarederror", "tree_method": "hist"}
- 用
rmse作为评估指标:
results = xgb.cv( params, dtrain_clf, num_boost_round=n, nfold=5, metrics=["rmse"], )
注意:你用OrdinalEncoder对y做的序数编码,刚好适合有序回归任务,因为编码后的数值对应cut的顺序等级,回归模型可以学习这种顺序关系。
内容的提问来源于stack exchange,提问作者tang
相关产品推荐
相关产品推荐

