如何查看样本外的 GLMNET LogReg 结果以构建混淆矩阵?

How to see the out of sample GLMNET LogReg results to build a confusion matrix?

在将 glmnet 逻辑回归模型与 LOOCV 结合使用时,我想从所有样本外预测中获取混淆矩阵。下面的简单示例使用具有 10 个观察值的数据框。有没有办法查看单个 10 个样本预测的结果?

根据 glmnet 手册中的红色内容,我认为我必须在 cv.glmnet 调用中使用选项“keep = TRUE”。但在那之后我不知道该怎么办。例如,我不确定代码中的最后 4 行是否给出了我想要的,因为它打印了太多的混淆矩阵。

图书馆(glmnet)
图书馆(dplyr)


set.seed(123)
x1 <- c(1, 2, 3, 4, 4, 5, 5, 6, 7, 8)
x2 <- 标准数 (10)
y <- c(0, 0, 0, 0, 1, 0, 1, 1, 1, 1)
df <- data.frame(x1, x2, y)
情节(df)

# 使用 LOOCV 为 RIDGE 找到最佳的 lambda
cv.ridge <- cv.glmnet(x=as.matrix(df[-3]), y=y, alpha=0, family="二项式",
                      nfolds=NROW(df), 标准化 = FALSE, 保持 = TRUE)

情节(cv.ridge)
cv.ridge<span class="math-container">$lambda.min
系数 (cv.ridge, cv.ridge$</span>lambda.min)


# 用 lambda.min 拟合模型
fit.ridge <- glmnet(x=as.matrix(df[-3]), y=y, alpha=0,
                    family="binomial", lambda = cv.ridge$lambda.min, 标准化 = FALSE)

打印(fit.ridge)

# 对训练数据集进行预测
概率 <- fit.ridge %>% 预测(newx = as.matrix(df[-3]),标准化 = FALSE)
predicted.classes <- ifelse(概率 > 0.5, 1, 0)

# 模型在训练数据集上的分类准确率
observed.classes <- 是
CA_min <<- 意思是(predicted.classes == observed.classes)

# 训练数据集上的混淆矩阵
table(y, predicted.classes)

# 不确定最后两行打印的混淆矩阵是什么???
cnf <- confusion.glmnet(cv.ridge<span class="math-container">$fit.preval, newy = y, family = "binomial")
最好的 <- cv.ridge$</span>index["min",]
打印(cnf[[最佳]])
打印(cnf)

如果你看 cv.ridge$fit.preval :

cv.ridge$fit.preval[,1:3]
              s0         s1         s2
 [1,]  0.2231436  0.2231436  0.2231436
 [2,]  0.2231436  0.2231436  0.2204341
 [3,]  0.2231436  0.2212310  0.2207636
 [4,]  0.2226969  0.2224932  0.2224300
 [5,] -0.2238043 -0.2238687 -0.2239393
 [6,]  0.2234414  0.2234704  0.2235023
 [7,] -0.2228107 -0.2226589 -0.2226118
 [8,] -0.2231436 -0.2212451 -0.2207812
 [9,] -0.2231436 -0.2231436 -0.2200512
[10,] -0.2231436 -0.2231436 -0.2231436

这 returns 你是一个预测矩阵,以对数优势比表示,每一列代表一个 lambda 值。要从对数优势比转换为概率(检查类似 notes 的内容):

logodds_to_probability = function(x){
return(exp(x)/(1+exp(x)))
}

既然你对 lambda min 感兴趣,那么你可以看到我们得到了相同的混淆矩阵:

ix = cv.ridge$index["min",]
prob = logodds_to_probability(cv.ridge$fit.preval[,ix])
pred = as.numeric(prob>0.5)

    y
pred 0 1
   0 3 2
   1 2 3

cnf[[best]]
         True
Predicted 0 1 Total
    0     3 2     5
    1     2 3     5
    Total 5 5    10

 Percent Correct:  0.6