2016-03-15 75 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 –