我正在使用cv.glmnet()执行交叉验证,默认情况下10-fold

library(Matrix)
library(tm)
library(glmnet)
library(e1071)
library(SparseM)
library(ggplot2)

trainingData <- read.csv("train.csv", stringsAsFactors=FALSE,sep=",", header = FALSE)
testingData  <- read.csv("test.csv",sep=",", stringsAsFactors=FALSE, header = FALSE)

x = model.matrix(as.factor(V42)~.-1, data = trainingData)
crossVal <- cv.glmnet(x=x, y=trainingData$V42, family="multinomial", alpha=1)
plot(crossVal)


我收到以下错误消息

Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  :
  one multinomial or binomial class has 1 or 0 observations; not allowed


但是,如下所示,我似乎对01的计数都没有观察水平。

>table(trainingData$V42)

       back buffer_overflow       ftp_write    guess_passwd            imap         ipsweep            land      loadmodule        multihop
        956              30               8              53              11            3599              18               9               7
    neptune            nmap          normal            perl             phf             pod       portsweep         rootkit           satan
      41214            1493           67343               3               4             201            2931              10            3633
      smurf             spy        teardrop     warezclient     warezmaster
       2646               2             892             890              20


有指针吗?

最佳答案

cv.glmnet默认情况下进行N折交叉验证,N = 10。这意味着它将数据分成10个子集,然后在10个子集中的9个上训练模型,并在其余1个上进行测试。重复此过程,依次忽略每个子集。

您的数据非常稀疏,有时训练子集会遇到此处(以及your previous question中)遇到的问题。最好的解决方案是通过合并较少的类来减少响应中的类数(例如,您是否真的需要获得spyperl的预测概率)。

另外,如果您正在执行glmnet交叉验证并构建模型矩阵,则可以使用我编写的glmnetUtils package简化流程。

关于r - 套索:glmnet的交叉验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36009672/

10-12 17:14