2017-07-16 47 views
0

有关更多上下文,请参阅question listed here带插入符号的Text2Vec分类 - 朴素贝叶斯警告消息

我试图使用text2vec构建的文档术语矩阵来训练使用caret包的朴素贝叶斯(nb)模型。但是,我得到这样的警告消息:

警告消息: 在的eval(XPR,ENVIR = ENVIR): 模型拟合失败Fold01.Rep1:usekernel = FALSE,FL = 0,调整= 1个错误NaiveBayes.default(X,Y,usekernel = FALSE,FL =参数$佛罗里达州,...): 零方差至少一类变量:

请帮我理解这条消息,并哪些步骤我需要避免模型拟合失败。我有一种感觉,我需要从DTM中删除更多的稀疏词汇,但我不确定。

代码来构建模型:

control <- trainControl(method="repeatedcv", number=10, repeats=3, savePredictions=TRUE, classProbs=TRUE) 

    Train_PRDHA_String.df$Result <- ifelse(Train_PRDHA_String.df$Result == 1, "X", "Y") 

    (warn=1) 
    (warnings=2) 

    t4 = Sys.time() 
    svm_nb <- train(x = as.matrix(dtm_train), y = as.factor(Train_PRDHA_String.df$Result), 
        method = "nb", 
        trControl=control, 
        tuneLength = 5, 
        metric ="Accuracy") 
print(difftime(Sys.time(), t4, units = 'sec')) 

代码来构建文档词矩阵(Text2Vec):

library(text2vec) 
library(data.table) 

#Define preprocessing function and tokenization fucntion 
preproc_func = tolower 
token_func = word_tokenizer 

#Union both of the Text fields - learn vocab from both fields 
union_txt = c(Train_PRDHA_String.df$MAKTX_Keyword, Train_PRDHA_String.df$PH_Level_04_Description_Keyword) 

#Create an iterator over tokens with the itoken() function 
it_train = itoken(union_txt, 
        preprocessor = preproc_func, 
        tokenizer = token_func, 
        ids = Train_PRDHA_String.df$ID, 
        progressbar = TRUE) 

#Build Vocabulary 
vocab = create_vocabulary(it_train) 

vocab 

#Dimensional Reduction 
pruned_vocab = prune_vocabulary(vocab, 
           term_count_min = 10, 
           doc_proportion_max = 0.5, 
           doc_proportion_min = 0.001) 
vectorizer = vocab_vectorizer(pruned_vocab) 

#Start building a document-term matrix 
#vectorizer = vocab_vectorizer(vocab) 

#learn vocabulary from Train_PRDHA_String.df$MAKTX_Keyword 
it1 = itoken(Train_PRDHA_String.df$MAKTX_Keyword, preproc_func, 
      token_func, ids = Train_PRDHA_String.df$ID) 
dtm_train_1 = create_dtm(it1, vectorizer) 

#learn vocabulary from Train_PRDHA_String.df$PH_Level_04_Description_Keyword 
it2 = itoken(Train_PRDHA_String.df$PH_Level_04_Description_Keyword, preproc_func, 
      token_func, ids = Train_PRDHA_String.df$ID) 
dtm_train_2 = create_dtm(it2, vectorizer) 

#Combine dtm1 & dtm2 into a single matrix 
dtm_train = cbind(dtm_train_1, dtm_train_2) 

#Normalise 
dtm_train = normalize(dtm_train, "l1") 

dim(dtm_train) 

回答

0

这意味着,当这些变量重新取样,他们只有一个独特的价值。您可以使用preProc = "zv"来摆脱警告。这将有助于为这些问题获得一个小的,可重现的例子。

+0

感谢pepo。那就是诀窍。下一次会记住一个可重复的例子! – UbuntuNewbie