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


26

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

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

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%(范围的中心)附近?

因此,我被困在似乎应该是一个简单的问题上,希望有人可以将我指向一种资源或方法,以计算逻辑回归模型的静态精度。


我认为范围示例:(0-.25,.25-.50,.50-.75,.75-1.0)很有意义。如果缩小范围会有所帮助吗?例如:0-.03,.03-.06,.06-.09,.....,即每.03。这对于具有许多数据点的区域可能很有用。
mac

Answers:


18

ROC曲线的AUC(通常是用于验证逻辑回归的一种方法)(针对1种特异性的敏感度图-如果需要,可以在google上输入相关术语)。从本质上讲,这将评估阈值的整个范围。

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


1
暂时搁置AUC,我是否认为ROC曲线的构造是这样?对于prob_value_is_true的每个离散值,通过使用离散值作为阈值来创建一个列联表。然后记录每个列联表的正确率和错误率。在散点图上绘制所有连续性表的费率,您应该看到ROC曲线吗?听起来对吗?
约翰·里德

我组合了一些代码来执行此操作,只是提供随机值作为概率和实际值,这是一条直线。我假设AUC在测量“曲线”与拟合模型的偏差,再来衡量“线”或随机性吗?
约翰·里德

关于中华民国:是的,这是正确的。有一些变体(或多或少地进行了平滑处理;考虑到了选择阈值时预测的概率与否)。请注意(取决于所使用的软件/选择的语言),已经有许多工具可以提供此功能。Wrt AUC:它不大于或小于ROC曲线下的实际面积。ROC曲线不是完美的随机预测变量,而是从(0,0)到(1,1)的直线,因此AUC为0.5。AUC有一些很好的解释,(甚至可以看Google或Wikipedia :
Nick Sabbe 2011年

8

您担心的是正确分类的比例,因为它主要反映了任意边界的影响。我建议两种措施。一个是索引或ROC区域,如其他人所描述的。这种解释比考虑ROC曲线更简单,并且是对纯预测歧视的一种度量。其次,估计连续的校准曲线,而无需任何数据合并。如果要在独立的数据集上评估预测,则可以使用离群值检测处于关闭状态来估计预测概率与实际Prob [Y = 1]之间的关系。R 包中的函数将完成这两项操作。中的其他功能clowessval.probrmsrms 使用重新采样消除过度拟合的影响,对于内部验证也将如此。


6

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

通常,您在此处完成的任务很困难。这是因为,通过逻辑回归,您正在处理两种不同的事物。模型的预测是一个潜在变量,而您观察到的响应变量(虽然可能是由潜在变量生成)却不是。当然,人们经常会想知道预测的响应是什么,这是完全合理的。这只是生活不公平的情况之一。

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

考虑模型中有多少信息的更全面的方法是对每个可能的阈值准确度进行积分。这是@Nick Sabbe讨论的模型接收机工作特性(ROC)曲线下的面积(AUC)。请记住,没有用于逻辑回归的。有所谓的“伪 ”,但是AUC(或一致性,一个同义词)可能是思考此问题的最佳方法。 (0,1)R2R2c


好答案!因此,在所有案例中有30%为1的示例中,特定案例的预测概率0.31就像该案例相对于其他案例的“等级”,即与1的接近程度(越大,则接近)?并且不应该将这种特殊情况视为1的预测概率吗?
mac

1
我不确定是否跟随您,@ JunchiGuo。所述意味着作为预测概率是。您可以将观测值相对于其预测的概率进行排名,但是,排名将高于,例如。y^i=.311.31.31.25
gung-恢复莫妮卡

3

我认为您可以建立一个阈值(例如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的概率值。您实际上课的频率(actual_value)是多少?


2

您可能需要看一下我的软件包softclassval(在softclassval.r-forge.r-project.org上,您还可以找到关于该软件包背后思想的两个口头陈述)。

我写的是一个稍微不同的问题,即参考文献(例如病理学家)是否“拒绝”给出清晰的课堂。但是,您可以将其与“常规”硬类一起使用,并且避免定义用于强化最初的连续预测的阈值 -因此您无需评估0.8。

但是,我建议将它与ROC或特异性敏感性图一起使用:由于“我的”方法会对已经很小的偏差进行惩罚(例如0.9而不是1会给我带来0.1的差异)​​,结果通常看起来非常糟糕。 ,但所有低于0.9的阈值都会忽略此设置)。实际上,我认为这是一个优势:缺乏敏感性和较小的偏差是使用诸如准确性,敏感性,召回率等“强化”措施的主要批评点之一。

此外,通过比较均值绝对误差(MAE)和均方根误差RMSE,您可以发现您是有小的偏差还是少了严重误判的样本。


1

这是我的快速建议:由于您的因变量是二进制的,因此可以假定它遵循伯努利分布,并且概率由逻辑回归。Pri=invlogit(a+bxi)

现在,设置一个模拟如下: y.rep[i]Bernoulli(p[i])

然后,运行此模拟,例如100次。您将拥有一个矩阵,其中包含n行(n是主题数)和k列(在这种情况下,k = 100,即模拟数)。在r代码中:

for (j  in 1:100)
  mat.y.rep[,j] <- Bernoulli ( p) # p is a vector with a probability for each subject

现在,您可以计算每个模拟中的预测值与观察值之间的差异。计算完此差异后,只需计算每行(每个主题)的正阳性和假阳性平均数,然后绘制直方图即可。或为每列计算两者(模拟),然后绘制直方图(我更喜欢这样做)。

希望能帮助到你...


1

有许多方法可以估算此类预测的准确性,而最佳选择实际上取决于估算将实现的目的。

例如,如果您打算为昂贵的随访研究选择一些高分命中率,则可能要在高分时使准确性最大化。另一方面,如果后续研究比较便宜,您可能希望以较低的分数来最大程度地提高召回率(敏感性)。如果您要比较其他方法等,则ROC AUC可能适用。

在实际方面,RROCR软件包包含2个有用的功能

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

这些函数可以一起计算广泛的精度度量,包括全局标量值(例如“ auc”)和依赖于得分的向量,以绘制全率和ROC曲线(“ prec”“ rec”“ tpr”“ fpr”等)


1

您需要定义“准确性”的含义。您想知道的是,请您口口相传,是您的模型适合训练数据的程度,更重要的是,该模型可以“概括”到不在训练数据中的样本的程度。尽管ROC曲线对于分析各种阈值的精度和查全率之间的权衡关系很有用,但我建议在工具箱中添加均方误差或Brier分数。它很容易计算,当应用于训练数据时,您可以立即了解特征更改是否会影响模型的拟合。由于在这种情况下可能会过度拟合,因此您的工作不在此处完成。要评估泛化性能,或者评估未处理数据的性能,这是“ 足以看您在训练样本上的表现。当然,您的模型很擅长于此,因为它们是您用来确定逻辑系数的值。您需要预留一些样本用于测试数据。您在该集合上的MSE表现应根据Hoeffding不等式设定您的一般化期望。最大泛化误差将取决于模型中的特征数量以及用于计算测试统计量的样本数量。请注意,您需要窃取一些训练样本作为测试样本。我建议进行10倍交叉验证,在此进行混洗,选择90%进行训练,选择10%进行测试,然后进行测量,重复并平均所有测量。因为它们是您用来确定物流系数的值。您需要预留一些样本用于测试数据。您在该集合上的MSE表现应根据Hoeffding不等式设定您的一般化期望。最大泛化误差将取决于模型中的特征数量以及用于计算测试统计量的样本数量。请注意,您需要窃取一些训练样本作为测试样本。我建议进行10倍交叉验证,在此进行混洗,选择90%进行训练,选择10%进行测试,然后进行测量,重复并平均所有测量。因为它们是您用来确定物流系数的值。您需要预留一些样本用于测试数据。您在该集合上的MSE表现应根据Hoeffding不等式设定您的一般化期望。最大泛化误差将取决于模型中的特征数量以及用于计算测试统计量的样本数量。请注意,您需要窃取一些训练样本作为测试样本。我建议进行10倍交叉验证,在此进行混洗,选择90%进行训练,选择10%进行测试,然后进行测量,重复并平均所有测量。您在该集合上的MSE表现应根据Hoeffding不等式设定您的一般化期望。最大泛化误差将取决于模型中的特征数量以及用于计算测试统计量的样本数量。请注意,您需要窃取一些训练样本作为测试样本。我建议进行10倍交叉验证,在此进行混洗,选择90%进行训练,选择10%进行测试,然后进行测量,重复并平均所有测量。您在该集合上的MSE表现应根据Hoeffding不等式设定您的一般化期望。最大泛化误差将取决于模型中的特征数量以及用于计算测试统计量的样本数量。请注意,您需要窃取一些训练样本作为测试样本。我建议进行10倍交叉验证,在此进行混洗,选择90%进行训练,选择10%进行测试,然后进行测量,重复并平均所有测量。


1

0log(1p^)01log(p^)1

这不会受到任意阈值的影响。度量越小越好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.