4

我最近使用 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

2 回答 2

2

问题是 C 是您的训练集的一部分。因此,它被考虑用于模型。这意味着要对数据集进行预测,需要有 C 的值。

您的测试集没有 C。您需要添加一列,说明测试集中有 0 个 C。

于 2017-07-31T08:51:50.640 回答
1

解决这个“错误”非常好。因为正如@Felix 建议的那样,这个错误的发生仅仅是因为您在预测数据集中缺少一个变量。因此,错误是相当多余的,纠正它与拉普拉斯校正等无关。您只需要确保您的训练数据集和预测数据集中有相同的变量。这可以解决。完成:

names(trainingdata) %in% names(predictiondata)

...还有一些额外的代码

现在,我认为这个错误很有趣的原因是它触及了关于如何实际处理文本数据建模的基本讨论。因为如果您只是将缺少的变量添加到预测数据(即 C)中并用零填充单元格,您会得到一个完全冗余的变量,它只会填充空间和内存。这意味着您不妨将变量从训练数据中踢出,而不是从预测数据中踢出。

然而,解决这个问题的更好方法是基于训练数据和预测数据生成词袋,然后将数据分为训练集和预测集。这将解决您的问题,同时在理论上更“正确”,因为您根据样本总数(即文本)的更大比例生成词袋

这是我的看法。我希望它有帮助!

于 2017-07-31T09:13:37.060 回答