您如何报告 glmnet 逻辑回归的百分比准确度?

机器算法验证 r 回归 机器学习 物流 网络
2022-03-28 17:18:24

我正在使用glmnet我的因变量是二进制的(0 类,1 类)。我想报告模型的百分比准确度。所以我将这个predict函数用于我的测试数据集。但是,返回的值是小数,而不是 0 和 1。所以我设置了一个阈值0.5,即如果预测值 > 0.5,我认为它是 1,如果预测值 <= 0.5,我认为它是 0。下一步我通过比较测试数据的预测值和实际值来创建混淆矩阵。从这里我找到了准确性。我在下面粘贴了我的示例代码。我不确定这是否是报告glmnet预测二元因变量的模型的准确率百分比的正确方法。

data <- read.csv('datafile', header=T)
mat  <- as.matrix(data)
X    <- mat[, c(1:ncol(mat)-1)]
y    <- mat[, ncol(mat)] 
fit  <- cv.glmnet(X, y, family="binomial", type.measure="class", alpha=0.1)

t                             <- 0.2*nrow(mat) #20% of data
t                             <- as.integer(t) 
testX                         <- mat[1:t, 1:ncol(mat)-1]
predicted_y                   <- predict(fit, s=0.01, testX, type='response')
predicted_y[predicted_y>0.5]  <- 1
predicted_y[predicted_y<=0.5] <- 0
Yactual                       <- mat[1:t, ncol(mat)]
confusion_matrix              <- ftable(Yactual, predicted_y)
accuracy                      <- 100* (sum(diag(confusion_matrix)) / length(predicted_y))
3个回答

glmnet是围绕适当的准确度分数设计的,即(惩罚的)偏差。预测歧视的总结应该使用适当的分数,而不是与误报和误报成本不一致的任意分类。考虑几个公认的正确评分规则:Brier(二次)评分和对数(类偏差)评分。您可以通过多种愚蠢的方式操纵正确分类的比例。看到这一点的最简单方法是,如果,您的准确率为 0.98 Y=1Y=1

另一种说法是,通过从 0.5 的任意截止值更改为另一个任意截止值,将选择不同的特征。虚假的模型优化了不正确的评分规则。

predict函数glmnet提供了一种"class"类型,该类型将预测类而不是二项式逻辑回归的响应,从而消除了对条件的需要。您还可以cv.glmnet使用type.measure参数值"auc""class"在预测之前生成一些验证准确性度量。

一个更简单的方法是使用预测函数并找到平均误差:

mean(predicted_y!=Yactual)