【问题标题】:NLP - Bag of words classificationNLP - 词袋分类
【发布时间】:2018-11-07 08:23:42
【问题描述】:

问题:

我很困惑为什么我们使用适合我们的训练数据的 CountVectorizer 来转换我们的测试数据以进行词袋分类。

为什么我们不创建一个新的 CountVectorizer 并将测试数据拟合到此并让分类器在测试 CountVectorizer 上进行预测?

看这里:How to standardize the bag of words for train and test?

摘自答案:

LabeledWords=pd.DataFrame(columns=['word','label'])

LabeledWords.append({'word':'Church','label':'Religion'} )

vectorizer = CountVectorizer()

Xtrain,yTrain=vectorizer.fit_transform(LabeledWords['word']).toarray(),vectorizer.fit_transform(LabeledWords['label']).toarray()
forest = RandomForestClassifier(n_estimators = 100) 
clf=forest.fit(Xtrain,yTrain)

for each_word,label in Preprocessed_list:
    test_featuresX.append(vectorizer.transform(each_word),toarray())
    test_featuresY.append(label.toarray())

clf.score(test_featuresX,test_featuresY) 

我们可以看到用户创建了一个 CountVectorizer 并将其拟合到训练数据中。然后将分类器拟合到这个 CountVectorizer。之后,用户只需使用适合训练数据的 CountVectorizer 转换测试数据,并将其输入分类器。这是为什么呢?

我想要完成的工作: 我正在尝试实现视觉词袋。它使用相同的概念,但我不确定应该如何创建训练集和测试集以进行分类。

【问题讨论】:

  • 因为您不想使用训练模型中没有的词。

标签: python machine-learning nlp


【解决方案1】:

您希望您的测试数据与您的训练数据通过相同的管道,以使 测试和训练 之间的差异尽可能类似于 现实世界和您的模型之间的差异。在您的数据中进行测试和训练拆分的全部目的是帮助验证您的模型是否具有泛化能力,并允许来自测试集的额外数据泄漏到在您的训练集上训练的模型中,这会阻止您准确了解泛化能力.

此外,正如@Juanpa.arrivillaga 所说,文本处理在预测分析的标准经验规则之上打开了蠕虫罐。通过使用两个不同的计数矢量化器,您将训练一个模型(在本例中为随机森林)以期望第一个坐标对应于诸如“apple”之类的单词,然后为其输入诸如“grape”之类的单词。在这种情况下您可能取得的任何成功都纯属偶然。

【讨论】:

  • 这很有意义!我假设这适用于所有分类问题?我之前做的是为我的测试集制作一个新的密码本(功能包),并试图对此进行预测,结果却很糟糕。我相信这个过程在执行 BOVW 时是一样的?
  • @Kevin 根据经验,是的,这适用于所有分类问题和 BOVW。在某些情况下它不适用(例如,如果您将模型用于预测以外的其他事情并且不关心它的泛化能力),因此重要的是要考虑您对数据的了解以及您的目标是,但它们是例外而不是规则。
猜你喜欢
  • 2011-02-20
  • 2014-09-28
  • 2012-12-02
  • 1970-01-01
  • 2019-02-28
  • 2018-02-09
  • 1970-01-01
  • 2016-02-16
  • 2016-08-28
相关资源
最近更新 更多