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

How to extract actual classification error rate with cost function from cv.glmnet, so I can compare with cv.glm?

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

的交叉验证错误率

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

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)

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

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 与另一个模型进行比较。

希望对您有所帮助。

另一种方法是:

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