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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:15:04