在 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
集合是不平衡的。
这是测试和训练数据集的维度。我的 traindata
和 testdata
都来自一个 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"))
也给出相同的结果。
我在训练数据集上使用 cv.glm 使用逻辑回归预测了一个模型,当我在 testdata
上预测它并尝试生成一个混淆矩阵时,它抛出了 error.The 类 的火车和 testdata
集合是不平衡的。
这是测试和训练数据集的维度。我的 traindata
和 testdata
都来自一个 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"))
也给出相同的结果。