我可以同时在测试和训练数据上使用 CountVectorizer 还是需要将其拆分?
Posted
技术标签:
【中文标题】我可以同时在测试和训练数据上使用 CountVectorizer 还是需要将其拆分?【英文标题】:Can i use CountVectorizer on both test and train data at the same time or do I need to split it up? 【发布时间】:2019-06-26 18:22:48 【问题描述】:我目前有一个 SVM 模型,可以将文本分为两个不同的类别。我目前正在使用 CountVectorizer 和 TfidfTransformer 来创建我的“词向量”。
问题是,当我先转换所有文本然后将其拆分时,我认为我可能会以错误的顺序进行操作。
我的问题是,如果我先进行 train_test_split 然后仅对训练数据进行 fit_transform 然后对测试数据进行转换,会有什么不同吗?
正确的做法是什么?
提前非常感谢,编码愉快!
count_vect = CountVectorizer(stop_words='english')
X_counts = count_vect.fit_transform(textList)
tfidf_transformer = TfidfTransformer()
X_tfidf = tfidf_transformer.fit_transform(X_counts)
X_train, X_test, y_train, y_test = train_test_split(X_tfidf, correctLabels, test_size=.33, random_state=17)
【问题讨论】:
【参考方案1】:首先拆分训练集和测试集,然后只适合训练集并转换测试集
如果你反过来做,你是leaking information 从测试集到训练集。这可能会导致过度拟合,从而使您的模型无法很好地泛化到新的、看不见的数据。
测试集的目标是测试您的模型在新数据上的表现。在文本分析的情况下,这可能意味着它以前从未见过的词,并且对词的重要性或出现的新分布一无所知。如果您第一次使用您的CountVectorizer
和TfIdfTransformer
,您将不知道它是如何响应的:毕竟,所有数据都已被转换器看到。问题:你认为你已经建立了一个性能很好的模型,但是当它投入生产时,准确率会低很多。
【讨论】:
感谢您的回复。我以为是这样的。那么正确的做法是什么?像这样? X_train, X_test, y_train, y_test = train_test_split(textList, correctLabels, test_size=.33, random_state=17) count_vect = CountVectorizer(stop_words='english') X_counts = count_vect.fit_transform(X_train) tfidf_transformer = TfidfTransformer() X_tfidf = tfidf_transformer。 fit_transform(X_counts) X_counts = count_vect.transform(X_test) tfidf_transformer = TfidfTransformer() X_tfidf = tfidf_transformer.fit_transform(X_counts) 我现在已经按照你说的把它分开了。性能和以前完全一样,不知道为什么:/数据集是4000,每个类2000。 您不应覆盖转换后的训练集的结果。现在,X_tfidf
只包含测试集。你现在打算如何训练你的分类器?
你是对的,我忘记在这个例子中更改名称,现在一切正常,谢谢!以上是关于我可以同时在测试和训练数据上使用 CountVectorizer 还是需要将其拆分?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用不同的数据集进行 GridSearchCV 训练和测试?