r语言 - 如何使用成本函数从cv.glmnet中提取实际分类错误率,以便我可以与cv.glm进行比较



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

cv.glmnet提供

二项式偏差,而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。

希望对您有所帮助。

另一种方法是:

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

最新更新