2016-03-15 776 views
0

我使用cv.glmnet()进行交叉验证,在默认情况下10-fold套索:交叉验证用于glmnet

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 

任何指针?

+0

使用水平(trainingData $ V42)如果它是一个因子变量,并检查哪个因子水平在测试或训练集中没有观测值。 –

+0

该问题可能是您的测试或培训数据中不存在的因素水平之一 –

+0

这意味着V42存储为字符串向量。比较您的测试数据$ V42和traindata $ V42的表格。 –

回答

3

cv.glmnet默认情况下N = 10次交叉验证,N = 10。这意味着它将您的数据分成10个子集,然后在10个子集中的9个上训练模型,并在剩余的1个子集上测试它。它重复此操作,依次排除每个子集。

您的数据足够稀少,有时,培训子集将遇到此处遇到的问题(并在your previous question中)。最好的解决方案是通过组合较少的类来减少响应中的类的数量(例如,真的需要以获得spyperl的预测概率)。另外,如果您正在做glmnet交叉验证并构建模型矩阵,您可以使用我写的glmnetUtils package来简化该过程。

+0

是的,但我会尽力现在这样做。感谢您的链接:https://github.com/Hong-Revo/glmnetUtils –