我阅读过许多文本监督的分类教程,并为我的数据实现了tidytext、qunateda、tm、text2vec、RTextTools。到现在为止,我有一个尚未解决的谜题。关于何时标记文本数据,似乎还没有达成共识。在火车测试之前还是之后?。在一个堆栈溢出帖子中,一些人认为在拆分之前进行标记甚至是非法的。使用dfm_match函数,quanteda包看起来像是设计用来在拆分数据之后进行标记化。其他人建议在预处理后进行拆分。我看过朱莉娅·西尔奇和埃米尔·赫维特费尔特的精彩教程。
对我来说,如果我在拆分之前执行预处理步骤,就会节省很多代码行。但是,风险是什么呢?数据泄露还是什么?在分类、表现、有效性等方面,是否有比较两者的证据?
发布于 2020-09-16 14:28:53
“非法分裂”?听起来很有趣(可能也很有趣),但我从未听说过。
问题是:在什么情况下,它能产生不同的效果,以及如何产生影响?训练-测试分割文件分区。在拆分之前还是之后标记它们可能无关紧要,因为文档仍然包含相同的标记。
但是,一旦您从这些标记构造了一个矩阵,如果您在拆分之后完成了这个任务,那么您的模型矩阵的特征集可能与测试集中的特征集不同。要在测试集上进行预测,测试数据的特征必须符合训练矩阵的特征。有几种处理不匹配的可能性。
。
回到这个问题上,这怎么会有什么区别呢?我能看到的主要事情是,当文档-特征矩阵(dfm)形成并在行上拆分时,训练集中的某些特性完全为零(但在测试集中不是为零)。如果分割是以一种包含零频率特征的方式进行的,那么一些有监督的方法会平滑这一点,从而将它们的平滑值包括在内。
下面是quanteda的一个示例,它使用朴素贝叶斯分类器,默认情况下对所有特性使用+1平滑。
让我们用两个类组成一个简单的dfm。
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上执行索引切片,则将出现在训练集中。
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。
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。
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时,我们就会看到这一点:
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但如果不是这样的话,结果就会略有不同:
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朴素贝叶斯,零被认为是信息丰富的。
https://stackoverflow.com/questions/63917498
复制相似问题