在一个样本外的数据集上使用词袋分类器

4

我最近使用了词袋分类器来制作一个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%。然而,当我使用这个cart模型对一个样本外的数据集进行预测时,会出现错误。

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"中的 "can't find C"。我不知道应该怎么做才能解决这个问题。在这里使用拉普拉斯平滑会有帮助吗?

4
由于我们没有“comments.csv”文件,这个错误无法被重现。请参考嵌入链接以获取创建完整且最小化可重现示例的提示,以便我们更轻松地帮助您。 - MrFlick
2个回答

2
问题在于C是你的训练集的一部分,因此会被考虑到模型中。这意味着要对数据集进行预测,需要有C的值。
而你的测试集中没有C。你需要添加一列,表明测试集中没有C。

1
非常好,这个“错误”被解决了。因为正如@Felix所建议的那样,这个错误只是因为在预测数据集中缺少一个变量。因此,这个错误相当多余,纠正它与拉普拉斯校正等无关。您只需要确保训练数据集和预测数据集中有相同的变量。可以使用以下方法之一:names(trainingdata) %in% names(predictiondata)。... 和一些额外的代码。现在,我认为这个错误有趣的原因是它触及了一个根本性的讨论,即如何实际处理文本数据建模。因为如果您只是添加缺失的变量到预测数据(即C)并用零填充单元格,则会得到一个完全多余的变量,只是填充空间和内存。这意味着您可能会将该变量从训练数据而不是预测数据中删除。
然而,更好的解决问题的方法是基于训练数据和预测数据生成词袋模型,然后将数据分成训练集和预测集。这样可以解决您的问题,并且在理论上更“正确”,因为您基于更大比例的总样本(即文本)生成了词袋模型。
那就是我的看法。希望有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接