我目前有一个支持向量机(SVM)模型,用于将文本分类为两个不同的类别。我现在使用CountVectorizer和TfidfTransformer来创建我的“词向量”。
问题是我认为我在转换所有文本的顺序上可能做错了,先转换所有文本然后再进行分割。
我的问题是,如果我先进行train_test_split,然后只对训练数据进行fit_transform,再对测试数据进行transform,会有什么不同吗?
正确的做法是什么?
非常感谢,祝 coding 愉快!
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)
回答:
首先将数据分为训练集和测试集,然后只在训练集上进行拟合,并在测试集上进行转换
如果你反过来做,你就会从测试集中泄露信息到训练集中。这可能会导致过拟合,使你的模型无法很好地泛化到新的、未见过的数据上。
测试集的目的是测试你的模型在新数据上的表现如何。在文本分析的情况下,这可能意味着模型之前从未见过的单词,并且不知道这些单词的重要性,或者单词出现的新分布。如果你首先使用CountVectorizer
和TfIdfTransformer
,你将不知道它如何应对这些情况:毕竟,所有的数据都被转换器见过了。问题在于:你认为你已经构建了一个表现优秀的模型,但当它投入生产时,准确率会大大降低。