在 cv.glm 中对不平衡的测试和训练数据预测模型构建时遇到错误

Runing into error while predicting the model bulid in cv.glm on unbalanced test and training data

我在训练数据集上使用 cv.glm 使用逻辑回归预测了一个模型,当我在 testdata 上预测它并尝试生成一个混淆矩阵时,它抛出了 error.The 类 的火车和 testdata 集合是不平衡的。

这是测试和训练数据集的维度。我的 traindatatestdata 都来自一个 1234 列和 60 行的大数据集,我将它随机分成两组,最后检查分类的敏感性和特异性。

> dim(traindata)
   40 1234
> dim(testdata)
[1]   20 1234

这就是我尝试过的。

Subtype   = factor(traindata$Subtype) 
CV=cv.glmnet(x=data.matrix(traindata),y=Subtype,standardize=TRUE,alpha=0,nfolds=3,family="multinomial")
response_predict=predict(CV, data.matrix(testdata),type="response")
predicted = as.factor(names(response_predict)[1:3][apply(response_predict[1:3], 1, which.max)])

这里报错为:

Error in apply(response_predict[1:3], 1, which.max) : 
  dim(X) must have a positive length

我的问题是如何使用 cv.glm 处理这种不平衡的数据集,以及如何消除上述错误。 谢谢

不平衡与此错误无关。首先,response_predict 是一个数组,不是矩阵,也不是数据框。因此,最后一行应该是

predicted <- as.factor(colnames(response_predict[, , 1])[1:3][apply(response_predict[, 1:3, 1], 1, which.max)])

也就是说,由于我们处理的是三维数组,所以我们有三个索引。 response_predict[1:3] 也意味着只有三个数字而不是三个数组列。因为 response_predict 不是数据框,所以 names 不会给你它的列名。

但实际上所有这些都可以写,假设有三个可能类,简单地说

predicted <- as.factor(colnames(response_predict)[apply(response_predict, 1, which.max)])

这样干净多了。我想你也知道

predicted <- as.factor(predict(CV, data.matrix(testdata), type = "class"))

也给出相同的结果。