3

我最近使用Bag-of-Words分類器以96%的條件製作文檔矩陣。然後,我用一個決策樹按模型訓練輸入的單詞,以預測句子是否重要。該模型在測試數據集上的表現非常好,但是當我使用了一個超出樣本的數據集時,它無法預測。相反,它會給出錯誤。在樣本外數據集中使用詞袋分類器

下面是我中的R

library('caTools') 
library('tm') 
library('rpart') 
library(rpart.plot) 
library(ROCR) 

data= read.csv('comments.csv', stringsAsFactors = FALSE) 
corpus = Corpus(VectorSource(data$Word)) 

# Pre-process data 
corpus <- tm_map(corpus, tolower) 
corpus <- tm_map(corpus, stemDocument) 

# Create matrix 
dtm = DocumentTermMatrix(corpus) 

# Remove sparse terms 
#dtm = removeSparseTerms(dtm, 0.96) 
# Create data frame 
labeledTerms = as.data.frame(as.matrix(dtm)) 

# Add in the outcome variable 
labeledTerms$IsImp = data$IsImp 

#Splitting into train and test data using caTools 

set.seed(144) 

spl = sample.split(labeledTerms$IsImp , 0.60) 

train = subset(labeledTerms, spl == TRUE) 
test = subset(labeledTerms, spl == FALSE) 

#Build CART Model 
CART = rpart(IsImp ~., data=train, method="class") 

這工作對測試數據集,其83%左右的精度完全好做模型。但是,當我使用此購物車模型預測出樣本數據集外,這會給我帶來錯誤。

head(train) 
terms A B C D E F..............(n terms) 
Freqs 0 1 2 1 3 0..............(n terms) 

head(test) 
terms A B C D E F..............(n terms) 
Freqs 0 0 1 1 1 0..............(n terms) 


data_random = read.csv('comments_random.csv', stringsAsFactors = FALSE) 

head(data_random) 
terms A B D E F H..............(n terms) 
Freqs 0 0 1 1 1 0..............(n terms) 

我得到的錯誤是在data_random 「無法找到C」。我不知道該怎麼做才能做到這一點。拉帕斯在這裏平滑的方式?

+4

因爲我們沒有「comments.csv」,所以這個錯誤不是[可重現](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。查看內聯鏈接,獲取有關創建完整,最少重複性示例的提示,這樣可以更輕鬆地爲您提供幫助。 – MrFlick 2014-10-08 19:49:37

回答

1

問題是C是你訓練集的一部分。因此它被考慮用於該模型。這意味着要對數據集進行預測,需要C的值。

您的測試集沒有C.您需要添加一列,說明測試集中有0個C.

0

這個「錯誤」被強調是非常好的。因爲@Felix建議發生這種錯誤的原因很簡單,因爲您在預測數據集中缺少一個變量。因此,錯誤是相當多餘的,並且糾正它與拉普拉斯校正等無關。您只需確保在訓練數據集和預測數據集中具有相同的變量。這可以fx。可以用做:

names(trainingdata) %in% names(predictiondata)

...和一些額外的代碼現在

,爲什麼我認爲錯誤是有趣的原因是因爲它觸及到如何從根本上討論實際上處理文本數據的建模。因爲如果只是將缺少的變量添加到預測數據(即C)並用零填充單元格,則會得到一個完全冗餘的變量,它只填充空間和內存。這意味着您不妨將變量踢出訓練數據而不是預測數據。

但是,解決這個問題的更好方法是根據訓練數據和預測數據生成詞袋,然後將數據分成訓練集和預測集。這將照顧你的問題,同時在理論上更「正確」,因爲你基地的樣本總人口中的更大比例(即文本)產生你的書包

這是我的在上面。我希望它有幫助!