在训练和测试数据上拟合 CountVectorizer,以免遗漏任何单词

Posted

技术标签:

【中文标题】在训练和测试数据上拟合 CountVectorizer,以免遗漏任何单词【英文标题】:fit CountVectorizer on training and test data to not miss any words 【发布时间】:2021-12-26 03:42:06 【问题描述】:

我有一个我知道分类标签的训练日期集和一个我没有标签的测试数据集。

现在,我想让 Vectorizer 适合训练和测试评论的结合,以免漏掉任何单词。

from sklearn.feature_extraction.text import CountVectorizer

                                                         #

vectorizer = CountVectorizer(encoding='str', stop_words="english", analyzer='word')

df_union=pd.concat([imdb_dataset_train,reviews_test])
df_union = df_union['review']
df_union.head()

X=vectorizer.fit_transform(df_union['review'])

X_train = ?
X_test= ?

我怎样才能再次合并测试和训练数据,这样 X_train.shape[1]==X_test.shape[1]?

【问题讨论】:

【参考方案1】:

你的问题有很多困惑:

您需要一些带标签的测试集来评估模型。如果您训练一个模型并将其直接应用于未标记的测试集,那么您不知道该模型是否真的有效。这就像随机服用一些药物,却不知道它是否适合您的问题。标记测试集的替代方法是在训练集上使用 k 折交叉验证。 CountVectorizer 只是文本的一种表示(编码),您需要一种分类算法才能在其上训练模型(例如决策树)。 模型不能也不应该使用测试集中的任何东西: 首先因为这是数据泄露,这意味着评估是错误的。 第二个原因是它没有意义:模型可以从训练集中学到什么关于未出现在训练集中的单词?当然没有,因此将没有出现在训练集中的单词作为特征是完全没有意义的。

请记住,模型会尝试捕获在训练集中找到的统计模式。目标不是让词汇表尽可能完整,而是让模型能够尽可能准确地预测新实例。事实上,甚至忽略训练集中最不常见的词通常会更好地提高性能,因为它们会导致统计噪声。

【讨论】:

以上是关于在训练和测试数据上拟合 CountVectorizer,以免遗漏任何单词的主要内容,如果未能解决你的问题,请参考以下文章

过拟合及解决方案

容量欠拟合过拟合和正则化

过拟合与欠拟合

机器学习欠拟合和过拟合

机器学习欠拟合和过拟合

机器学习基础:(Python)训练集测试集分割与交叉验证