逻辑模型的 RMSE(均方根误差)

机器算法验证 回归 物流 广义线性模型 网络 有效值
2022-03-09 00:44:54

我有一个关于使用 RMSE(均方根误差)比较不同逻辑模型的有效性的问题。响应是01,预测是0-之间的概率1

下面应用的方式对二进制响应也有效吗?

##### Using glmnet
require(glmnet)
load(url("https://github.com/cran/glmnet/raw/master/data/BinomialExample.RData"))
cvfit = cv.glmnet(x, y, family="binomial", type.measure="mse")
A     = predict(cvfit, newx=x, s="lambda.min", type="response")
RMSE1 = mean((y - A)^2)
# 0.05816881

##### glm
mydata      = read.csv("https://stats.idre.ucla.edu/stat/data/binary.csv")
mydata$rank = factor(mydata$rank)
mylogit     = glm(admit~gre+gpa+rank, data=mydata, family="binomial")
AAA         = predict(mylogit, newdata=mydata, type="response")
RMSE2       = mean((mydata$admit - AAA)^2)
# 0.194714
2个回答

要理解为什么“[t] 他的响应是0或者1[but] 预测是介于0-之间的概率1”,您需要了解您正在使用的模型的类型。去掉惩罚方法和交叉验证,你正在运行一个基本的逻辑回归。这些参数适合对数赔率/逻辑量表。这被称为“线性预测器”。(有关此的更多信息,它可能会帮助您在这里阅读我的答案:logit 和 probit 模型之间的差异。)如果您插入 x 值并简化,该值将是模型预测的“成功”几率的自然对数( 1)。如果您对该值取幂,您将获得模型的预测赔率的“成功”。要获得预测概率,您需要通过赔率/(1+赔率)将赔率转换为概率。(有关此的更多信息,它可能会帮助您阅读我的答案:逻辑回归中对优势比的简单预测的解释。)这仍然无法让您进入预测类别为此,您需要将预测概率与某个阈值进行比较,如果它小于阈值,则预测“失败”(0),否则“成功”(1)。最常见的默认阈值是 0.5,但这通常不是最优的。R的predict.glm()功能将允许您使用type="link",它输出线性预测器规模的预测(即,在上述所有这些转换之前),但这在这种情况下对您没有帮助。使用type="response"为您提供预测的概率。


当您尝试评估二元(例如逻辑)回归模型预测响应的效果时,您有多种选择:

  1. 第一个也是最直观的是将预测类别与观察类别进行比较并计算正确百分比。虽然直观,但也有问题。除了适当拟合模型的其他方面之外,它部分取决于阈值是否最佳。它还会丢弃大量信息(即预测概率离阈值有多远),这不是一件好事。
  2. 您的下一个选项是使用接收器操作特征 (ROC) 曲线下的面积。大多数人使用此选项;它比使用正确百分比要好得多。然而,大多数人没有意识到的关于 AUC 的事情是,它实际上是在衡量您的预测的适当顺序,而不是它们的实际准确性。也就是说,如果您预测了 的四个观测值的概率.2, .4, .6, .8,并且将 0.01 添加到所有观测值 ( .21, .41, .61, .81),则即使两组预测概率不能同样准确,AUC 也会相同。
  3. 评估模型的第三种方法是使用适当的得分函数。也许在您的上下文中最流行的得分函数是Brier score正如@fcoppens 所指出的,代码中的方法是 Brier 分数。它不仅会评估模型是否适当地预测一个观察结果比另一个观察结果更可能是“成功”,而且该模型的预测概率是否实际上是正确的。

不幸的是,Brier 分数不太为人所知和使用。虽然这些方法的相对直观性是:正确百分比 > AUC > Brier 分数,但它们的真实信息量相反:Brier 分数 > AUC > 正确百分比。如果你只想简单地衡量你的模型的性能,那么这些方法之间的区别就不那么重要了,但是如果你想用这些方法来优化模型或选择模型,使用劣质的方法会导致性能变差.

如果您的误差项呈正态分布且均值为 0,则使用 RMSE 会更有意义,但在二进制结果中则不然。因此,我认为您应该使用不同的方法来产生二元结果,例如比较可能性差异。