如何从 cv.glmnet 中提取具有成本函数的实际分类错误率,以便与 cv.glm 进行比较?

Posted

技术标签:

【中文标题】如何从 cv.glmnet 中提取具有成本函数的实际分类错误率,以便与 cv.glm 进行比较?【英文标题】:How to extract actual classification error rate with cost function from cv.glmnet, so I can compare with cv.glm? 【发布时间】:2016-07-07 09:06:20 【问题描述】:

二项式回归的cv.glmnetcvm 实际上是二项式偏差。如何提取cv.glmnet 对象的交叉验证分类错误率?我需要它来比较来自cv.glm 的交叉验证错误率。

【问题讨论】:

【参考方案1】:

cv.glmnet 提供二项式 deviance 而cv.glm 提供分类错误。为了能够进行比较,您需要预测cv.glmnet 的输出类并取分类错误的平均值:

cv2.2.lasso=cv.glmnet(x2.2, y2, alpha=1, family="binomial")
mean(predict(cv2.2.lasso, x2.2, s=cv2.2.lasso$lambda.1se, type="class") != y2)

但是,使用上面的代码,您将使用所有数据计算拟合模型的分类误差,而不是交叉验证分类误差。如果您没有过度拟合,则值应该足够接近,至少在数量级上,但不能真正具有可比性。如果你真的需要比较两者,你应该自己运行交叉验证循环,可能是这样的:

errors <- vector(mode="list", number_of_folds)
rand <- floor(runif(dim(input_data)[1], min=0, max=number_of_folds))

for (fold in 0:(number_of_folds-1)) 
  print(paste("fold", fold))

  folds.x <- model.matrix(formula, data=input_data)
  folds.x.train <- folds.x[rand != fold,]
  folds.x.test <- folds.x[rand == fold,]
  folds.y.train <- input_data[rand != fold, results_column_name]
  folds.y.test <- input_data[rand == fold, results_column_name]

  folds.fit <- glmnet(folds.x.train, folds.y.train, alpha=1, family="binomial")
  folds.fit.test <- predict(folds.fit, folds.x.test, type="class")
  errors[[step+1]] <- apply(folds.fit.test != y2, 2, sum)

列表errors 的每个元素每折叠包含每个 lambda 值的错误总数。然后,对于每个 lambda,您需要计算平均值,然后选择 lambda 与其他模型进行比较。

希望对你有帮助。

【讨论】:

【参考方案2】:

另一种方法是做:

cv.glmnet(x2.2, y2, alpha=1, family="binomial", type.measure = "class")

【讨论】:

以上是关于如何从 cv.glmnet 中提取具有成本函数的实际分类错误率,以便与 cv.glm 进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

从 cv.glmnet 得到混淆矩阵

在 R 中加载 Lime 包时出现错误“对象‘coef.cv.glmnet’不是由‘namespace:glmnet’导出”-

r ggplot.cv.glmnet

从神经网络的不同成本函数和激活函数中进行选择

变量的顺序改变了 glmnet 中的估计系数

变量选择——lassoSCADMCP的实现(R语言)