不使用Sklearn封装器时如何获取XGBoost模型评分?
关于原生接口是否存在直接调用的.score()方法
原生xgb.train()训练返回的Booster对象没有内置和sklearn接口一致的.score()方法,你当前调用accuracy_score(model.predict(DTest), y_test)的写法,已经是不使用sklearn封装器前提下的最简实现。
如果想要对齐sklearn的调用习惯,自己封装一个单行工具函数即可,不需要额外做复杂处理:
from sklearn.metrics import accuracy_score def xgb_booster_score(booster, d_matrix, y_true): return accuracy_score(booster.predict(d_matrix), y_true) # 后续直接调用即可 # score = xgb_booster_score(model, DTest, y_test)
关于binary:hinge和binary:logistic加0.5阈值的结果差异
你这个认知是错误的,二者存在本质区别,最终预测结果不会完全一致,核心差异点如下:
- 优化目标不同:
binary:logistic训练时优化的是对数交叉熵损失,模型学习的目标是输出样本属于正类的概率;binary:hinge训练时优化的是合页损失,模型学习的目标是最大化分类间隔,和线性SVM的优化逻辑一致。 - 预测输出逻辑不同:
binary:hinge目标训练得到的模型,调用predict()会直接返回0/1的离散分类标签;binary:logistic目标训练得到的模型,predict()默认返回0~1区间的连续概率值,必须手动做阈值判断(比如(pred > 0.5).astype(int))才能得到分类标签。即便固定0.5为分类阈值,因为两个模型的优化方向不同,学到的决策边界存在差异,最终分类结果不会完全重合。 - 灵活度不同:
binary:logistic输出的概率结果支持灵活调整分类阈值,平衡不同类别错判的成本,也可以直接输入给AUC、对数损失等需要连续值的评估指标;binary:hinge直接输出硬分类结果,不支持阈值调整,也无法直接计算概率类评估指标。
补充踩坑提示:即便是对
binary:logistic模型设置output_margin=True拿到未经过sigmoid转换的原始决策分数,以0为阈值做分类,结果依然和binary:hinge训练的模型有差异,二者损失函数的数学特性从根源上决定了模型收敛的结果不会一致。
内容的提问来源于stack exchange,提问作者Pippomuc
相关产品推荐
相关产品推荐

