测量基于逻辑回归的模型的准确性

机器算法验证 回归 物流 r平方
2022-02-15 09:09:42

我有一个训练有素的逻辑回归模型,我将其应用于测试数据集。因变量是二进制(布尔值)。对于测试数据集中的每个样本,我应用逻辑回归模型来生成因变量为真的概率百分比。然后我记录实际值是真还是假。我正在尝试像在线性回归模型中一样或调整后R2R2

这给了我测试集中每个样本的记录,例如:

prob_value_is_true         acutal_value
   .34                          0
   .45                          1
   .11                          0
   .84                          0
    ....                        ....          

我想知道如何测试模型的准确性。我的第一次尝试是使用列联表并说“如果prob_value_is_true> 0.80,猜测实际值是正确的”,然后测量正确分类与不正确分类的比率。但我不喜欢这样,因为感觉更像是我只是在评估 0.80 作为边界,而不是模型作为一个整体和所有prob_value_is_true值的准确性。

然后我尝试只查看每个 prob_value_is_true 离散值,例如,查看prob_value_is_true= 0.34 的所有样本并测量实际值为真的样本的百分比(在这种情况下,如果样本的百分比这是真的 = 34%)。我可以通过对每个离散值的差求和来创建模型准确度分数prob_value_is_true但是样本量在这里是一个很大的问题,特别是对于极端情况(接近 0% 或 100%),这样实际值的平均值并不准确,因此使用它们来衡量模型的准确性似乎并不正确。

我什至尝试创建很大的范围以确保足够的样本量(0-.25、.25-.50、.50-.75、.75-1.0),但如何衡量实际价值百分比的“好坏”让我感到困惑. 假设所有prob_value_is_true介于 0.25 和 0.50 之间的样本的平均值acutal_value为 0.45。既然在范围内,那很好吗?不好,因为它不接近 37.5%(范围的中心)?

所以我被困在一个看似简单的问题上,希望有人能指出我的资源或方法来计算逻辑回归模型的准确度统计。

4个回答

一种经常用于验证逻辑回归的度量是ROC 曲线的 AUC (对 1 特异性的敏感性图 - 如果需要,只需谷歌搜索这些术语)。这实质上是评估整个阈值范围。

不利的一面:评估整个​​阈值范围可能不是您所追求的,因为这(通常)包括导致大量假阴性或假阳性的阈值。有一些版本的 AUC 可以解决这个问题(部分 AUC),所以如果这对你来说是个问题,你可以调查一下。

您担心正确分类为主要反映任意边界的影响的比例是正确的。我推荐两个措施。一个是其他人所描述这具有比考虑 ROC 曲线更简单的解释,并且是纯预测歧视的度量。其次,估计没有任何数据分箱的连续校准曲线。如果在独立数据集上评估预测,您可以使用关闭异常值检测来估计预测和实际 Prob[Y=1] 之间的关系。R 包中的函数将完成这两件事。中的其他功能clowessval.probrmsrms将对内部验证做同样的事情,使用重采样来消除过度拟合的影响。

如果您的数据按值分组,您可以计算模型预测值及其相关的置信区间,并查看观察到的百分比是否在该范围内。例如,如果您在 x=10 处有 10 个观察值,x处有10 个 obs,在处有 10 个 obs ,等等,那么,等将产生可以与预测进行比较的百分比。请记住,即使模型是完美的,一些观察到的百分比也会在 95% CI 之外反弹,就像在 OLS 回归中一样。的范围对数据进行分箱来形成自己的组xx=10x=20x=30mean(y[x==10]==1)mean(y[x==20]==1)x变量,正如你所建议的。这并不完全有效,因为它取决于 bin 的选择,可以作为探索模型的一种方式。

一般来说,你在这里给自己的任务是困难的。那是因为,使用逻辑回归,您正在处理两种不同类型的事情。模型的预测是潜在变量,而您观察到的响应变量(可能由潜在变量生成)不是。当然,人们通常会想知道预测的反应是什么,这是完全合理的;这只是生活不公平的案例之一。

如果您确实想预测结果,则需要决定要最大化什么。如果您只有 1 个案例,并且您希望您的预测最有可能是正确的,那么您应该预测,如果(这很直观。)另一方面,如果你想最大化你的总样本(或任何其他组)的整体准确度,你应该预测,如果 . 例如,假设在您的样本中,所有案例中有 30% 是 1,那么如果,您应该预测将为,即使它y=1y^.5y=1y^p(y=1)y^=.31y1<.5. 这是违反直觉的,很多人在这里绊倒,但这种算法将最大限度地提高您的准确性。

考虑模型中有多少信息的更全面的方法是整合每个可能的阈值给您的准确度。这是@Nick Sabbe 讨论的模型接收者操作特征 (ROC) 的曲线下面积 (AUC)。请记住,逻辑回归没有有所谓的“伪 ”,但 AUC(或索引,,同义词)可能是考虑这个问题的最佳方式。 (0,1)R2R2c

我认为您可以建立一个阈值(例如 0.5),因此当您的概率等于或大于该阈值时,您的预测类别将为 1,否则为 0。然后,您可以通过这种方式来衡量您的准确性:

confusion_matrix <- ftable(actual_value, predicted_value)
accuracy <- sum(diag(confusion_matrix))/number of events*100

鉴于您的概率是给定数据 (x) 的概率,并且使用您的模型,您的类值 (y) 等于 1,我不明白为什么您总是获得低于 0.5 的概率值。您实际上课的频率是多少(实际值)?