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

时间:2016-03-21 00:01:14

标签: r statistics classification cross-validation glmnet

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

2 个答案:

答案 0 :(得分:2)

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来与其他模型进行比较。

希望它有所帮助。

答案 1 :(得分:1)

另一种方法是:

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