首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们应该在火车/测试分割之前还是之后对文本数据进行预处理?

我们应该在火车/测试分割之前还是之后对文本数据进行预处理?
EN

Stack Overflow用户
提问于 2020-09-16 09:53:15
回答 1查看 1.2K关注 0票数 0

我阅读过许多文本监督的分类教程,并为我的数据实现了tidytext、qunateda、tm、text2vec、RTextTools。到现在为止,我有一个尚未解决的谜题。关于何时标记文本数据,似乎还没有达成共识。在火车测试之前还是之后?。在一个堆栈溢出帖子中,一些人认为在拆分之前进行标记甚至是非法的。使用dfm_match函数,quanteda包看起来像是设计用来在拆分数据之后进行标记化。其他人建议在预处理后进行拆分。我看过朱莉娅·西尔奇和埃米尔·赫维特费尔特的精彩教程。

对我来说,如果我在拆分之前执行预处理步骤,就会节省很多代码行。但是,风险是什么呢?数据泄露还是什么?在分类、表现、有效性等方面,是否有比较两者的证据?

EN

回答 1

Stack Overflow用户

发布于 2020-09-16 14:28:53

“非法分裂”?听起来很有趣(可能也很有趣),但我从未听说过。

问题是:在什么情况下,它能产生不同的效果,以及如何产生影响?训练-测试分割文件分区。在拆分之前还是之后标记它们可能无关紧要,因为文档仍然包含相同的标记。

但是,一旦您从这些标记构造了一个矩阵,如果您在拆分之后完成了这个任务,那么您的模型矩阵的特征集可能与测试集中的特征集不同。要在测试集上进行预测,测试数据的特征必须符合训练矩阵的特征。有几种处理不匹配的可能性。

  • 特性在训练集中,但不在测试集中。在quanteda.textmodels,中有一个(方便!)选项使预测矩阵自动与训练矩阵相一致,这意味着测试集将添加此功能,但计算为零。这是合理的,因为考虑到该特性向培训数据添加了信息,并且它的缺失可以在测试数据中被视为信息。

  • 特性不在训练集中,而是在测试集中。大多数情况下,您都希望完全忽略这个特性。为什么?因为在经过训练的模型中没有关于它的信息,所以它的效果要么是未知的,要么完全是平滑的。

回到这个问题上,这怎么会有什么区别呢?我能看到的主要事情是,当文档-特征矩阵(dfm)形成并在行上拆分时,训练集中的某些特性完全为零(但在测试集中不是为零)。如果分割是以一种包含零频率特征的方式进行的,那么一些有监督的方法会平滑这一点,从而将它们的平滑值包括在内。

下面是quanteda的一个示例,它使用朴素贝叶斯分类器,默认情况下对所有特性使用+1平滑。

让我们用两个类组成一个简单的dfm。

代码语言:javascript
复制
library("quanteda")
## Package version: 2.1.1

txt <- c(
  d1 = "a a b b d",
  d2 = "a a a b b",
  d3 = "a b d d d",
  d4 = "a a b c d"
)
y <- c("black", "black", "white", NA)
train <- c(TRUE, TRUE, TRUE, FALSE)
test <- !train

现在先标记,然后再分裂。注意,对于整个三个培训集文档,特性c为零,但是如果在这个组合的dfm上执行索引切片,则将出现在训练集中。

代码语言:javascript
复制
dfmat1 <- tokens(txt) %>%
  dfm()
dfmat1
## Document-feature matrix of: 4 documents, 4 features (25.0% sparse).
##     features
## docs a b d c
##   d1 2 2 1 0
##   d2 3 2 0 0
##   d3 1 1 3 0
##   d4 2 1 1 1

在标记化和形成dfm之前进行切片时,不包含功能c

代码语言:javascript
复制
dfmat2 <- tokens(txt[train]) %>%
  dfm()
dfmat2
## Document-feature matrix of: 3 documents, 3 features (11.1% sparse).
##     features
## docs a b d
##   d1 2 2 1
##   d2 3 2 0
##   d3 1 1 3

测试矩阵看起来是这样的,它有更多的“白色”-associated a,而不是“黑色”-associated d

代码语言:javascript
复制
dfmattest <- tokens(txt[test]) %>%
  dfm()
dfmattest
## Document-feature matrix of: 1 document, 4 features (0.0% sparse).
##     features
## docs a b c d
##   d4 2 1 1 1

现在,当我们训练一个模型并进行预测时,当包含c时,我们就会看到这一点:

代码语言:javascript
复制
library("quanteda.textmodels")

tmod1 <- textmodel_nb(dfmat1, y)
coef(tmod1)
##        black     white
## a 0.42857143 0.2222222
## b 0.35714286 0.2222222
## d 0.14285714 0.4444444
## c 0.07142857 0.1111111
predict(tmod1, newdata = dfmattest, force = TRUE, type = "prob")
##        black     white
## d4 0.5526057 0.4473943

但如果不是这样的话,结果就会略有不同:

代码语言:javascript
复制
tmod2 <- textmodel_nb(dfmat2, y[train])
coef(tmod2)
##       black white
## a 0.4615385  0.25
## b 0.3846154  0.25
## d 0.1538462  0.50
predict(tmod2, newdata = dfmattest, force = TRUE, type = "prob")
## Warning: 1 feature in newdata not used in prediction.
##        black     white
## d4 0.6173551 0.3826449

警告信息告诉我们,测试集特性c没有用于预测结果,因为它不在训练集中。

所以,要问的问题是,你是否希望缺少一个功能被认为是信息丰富的?对于默认的多项式朴素Bayes,如果您在从所有特性形成dfm后进行拆分,则可以通过平滑来建模缺额,或者如果您首先拆分并分别创建每个dfm,则可以忽略它。答案取决于您如何对待零以及它们在您的问题中的意义。它也在一定程度上取决于您的模型,因为(例如)对于Bernoulli朴素贝叶斯,零被认为是信息丰富的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63917498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档