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

在R中使用XGBoost获取三类分类的预测概率与预测类别方法

解决XGBoost多分类预测概率矩阵与类别输出问题

问题原因解析

你看到的长度135的向量是multi:softprob目标的正常输出:它会按每个样本的类别概率依次拼接,45个测试样本×3个类别=135个元素,并非错误。但需要将其转换为矩阵才能直观查看每个样本的各类别概率。

另外,你的代码存在一个关键问题:训练模型时,xgb.train的输入矩阵包含了Species标签列,这相当于把答案喂给模型,会导致模型严重过拟合,必须修正。

修正后的完整代码

先修正训练数据的特征提取,再处理预测结果:

data("iris")
# 标签转换为0-2的数值
iris$Species <- as.numeric(as.factor(iris$Species)) - 1

# 划分数据集
indexes <- caret::createDataPartition(iris$Species, p = .7, list = F)
train_data <- iris[indexes, ]
test_data <- iris[-indexes, ]

# 注意:特征矩阵要排除标签列!
xgb.train <- xgb.DMatrix(data = as.matrix(train_data[, -5]), label = train_data$Species)
xgb.test <- xgb.DMatrix(data = as.matrix(test_data[, -5]), label = test_data$Species)

params = list("objective" = "multi:softprob", 
              "eval_metric" = "mlogloss",
              "num_class" = 3)

xgb.model <- xgboost::xgb.train(params = params, data = xgb.train, nrounds = 1000)

获取各类别预测概率矩阵

将预测的长向量转换为45行×3列的矩阵,每行对应一个样本的三个类别概率:

# 获取概率向量并转换为矩阵
prob_vector <- predict(xgb.model, newdata = xgb.test)
prob_matrix <- matrix(prob_vector, ncol = 3, byrow = TRUE)
# 可以给列命名,对应原类别
colnames(prob_matrix) <- levels(as.factor(iris$Species))
head(prob_matrix)

获取预测类别

基于概率矩阵,取每行概率最大的类别索引(对应0-2的标签):

# 预测类别(0-2)
pred_classes <- max.col(prob_matrix) - 1
# 或者转换为原类别名称
pred_class_names <- levels(as.factor(iris$Species))[pred_classes + 1]
head(pred_classes)
head(pred_class_names)

补充说明

  • type="prob"参数在xgboost的predict函数中并不生效,因为xgboost原生predict函数没有这个参数(该参数常见于caret包封装的模型),所以两次predict结果一致是正常的。
  • 修正特征矩阵后,模型才会真正学习到特征与类别的关系,避免过拟合。

内容的提问来源于stack exchange,提问作者Phoebe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:57:13