xgb.train()报TypeError: float()参数不能为'DMatrix'问题求助
问题原因
仔细查看报错栈可以直接定位问题根源:你直接将sklearn的log_loss函数作为自定义评估指标传给xgb.train()的feval参数,不符合XGBoost自定义评估函数的入参规范:
- XGBoost要求
feval接收的参数顺序为 (预测值preds, 数据矩阵dmatrix) - sklearn的
log_loss接收的参数顺序为 (真实标签y_true, 预测值y_pred)
调用时XGBoost把第二个入参DMatrix对象传给了log_loss的第一个参数y_true,log_loss尝试将其转换为浮点型计算损失时触发类型错误,该问题和xgb.train()的入参格式无关。
解决方法
提供两种可直接落地的修复方案:
方案1:封装适配XGBoost规范的自定义评估函数
写一层包装函数调整参数顺序,从DMatrix中取出真实标签再调用sklearn的log_loss:
def custom_log_loss(preds, dmatrix): y_true = dmatrix.get_label() # 多分类场景需指定标签范围保证计算准确 return 'log_loss', log_loss(y_true, preds, labels=list(range(22)))
之后把xgb.train()调用中的feval=log_loss替换为feval=custom_log_loss即可。
方案2:使用XGBoost内置多分类对数损失(更推荐)
你的场景是22分类、使用multi:softprob目标函数,XGBoost原生支持多分类对数损失指标mlogloss,不需要额外引入sklearn的损失函数:
直接删除feval=log_loss参数即可,XGBoost会自动根据目标函数匹配对应的评估指标,也可以显式在params参数中添加'eval_metric': 'mlogloss',性能和兼容性更好。
内容的提问来源于stack exchange,提问作者spacedustpi
相关产品推荐
相关产品推荐

