如何查看样本外的 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
在将 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