首页 > 解决方案 > R:插入符号包:Brier分数

问题描述

我想使用包中的train()函数执行逻辑回归caret。我的模型看起来像这样:

model <- train(Y ~.,
  data = train_data,
  family = "binomial",
  method = "glmnet")

使用生成的模型,我想做出预测:

pred <- predict(model, newdata = test_data, s = "lambda.min", type = "prob")

现在,我想评估模型预测与实际测试数据相比有多好。为此,我知道如何接收 ROC 和 AUC。不过,我也有兴趣获得 BRIER SCORE。Brier 分数的公式几乎与 MSE 相同。我面临的问题是typepredict 中的论点只允许“概率”(或我不感兴趣的“类”),它给出了一个预测的概率为 ONE(例如 0.64),以及补充概率的beeing一个零(例如 0.37)。然而,对于 Brier 分数,我需要一个包含两者信息的预测的概率估计(例如,高于 0.5 的值表示 1,低于 0.5 的值表示 0)。我还没有找到任何解决方案来接收 Brier 分数caret包裹。我知道使用该包cv.glmnet,该predict函数允许参数“响应”,这将解决我的问题。但是,出于个人喜好,我想保留该caret套餐。谢谢您的帮助!

标签: rpredictionr-caret

解决方案


如果我们按照 wiki 对 Brier 分数的定义:

Brier 评分最常见的公式是

论坛

其中 f_t 是预测的概率,o_t 是(0 或 1)的实际结果,N 是预测实例的数量。

在 R 中,如果您的标签是一个因素,那么逻辑回归将始终针对第二个级别进行预测,这意味着您只需计算概率和 0/1。例如:

library(caret)
idx = sample(nrow(iris),100)
data = iris
data$Species = factor(ifelse(data$Species=="versicolor","v","o"))
levels(data$Species)
[1] "o" "v"

在这种情况下,o 为 0,v 为 1。

train_data = data[idx,]
test_data = data[-idx,]

model <- train(Species ~.,data = train_data,family = "binomial",method = "glmnet")

pred <- predict(model, newdata = test_data)

所以我们可以看到类的概率:

head(pred)
          o          v
1 0.8367885 0.16321154
2 0.7970508 0.20294924
3 0.6383656 0.36163437
4 0.9510763 0.04892370
5 0.9370721 0.06292789

计算分数:

f_t = pred[,2]
o_t = as.numeric(test_data$Species)-1
mean((f_t - o_t)^2)
[1] 0.32

推荐阅读