我有一个基于文档的文本分类任务,我希望这些类与词频有关。由于我的应用程序的特殊性质,我的语料库会随着时间的流逝而增长,并希望在新文档到达时对其进行分类,因此我使用FeatureHasher而不是现有的TFidfVectorizer(既可矢量化又可进行调整),因为词汇量尺寸会随着新文档的增长而增长。
如此处的讨论(https://stats.stackexchange.com/questions/154660/tfidfvectorizer-should-it-be-used-on-train-only-or-traintest所示,对我来说似乎正确的是,在进行TFIDF时,术语频率应该仅相对于训练集进行计算,然后用于重新缩放测试集,而不是首先对测试集进行重新缩放。整个语料,然后分裂。这是因为将测试数据集用于频率计算违反了不应使用此信息的原则。
假设您从原始术语频率(尚未调整)的矩阵X和类的向量y开始。许多代码示例显示的典型顺序是:
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.ensemble import RandomForestClassifier
vec = TfidfTransformer()
#rescale X by its own frequencies, then split
X = vec.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
#...now fit a model
但是正确的应该是以下内容:
vec = TfidfTransformer()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
#store rescaling based on X_train frequencies alone
vec.fit(X_train)
#resacale each (transform) by the same model
X_train = vec.transform(X_train)
X_test = vec.transform(X_test)
#...now fit a model
好吧,现在是主要问题:我想进行某种交叉验证,也许使用GridSearchCV,在其中可以为它提供一组潜在的模型参数,并为每个模型进行几次数据拆分。实现此目的的典型方法是建立模型管道,然后将其输入到交叉验证实用程序中。由于管道是种很难查看其详细信息的黑匣子,因此我只想验证是否通过将TfidfTransformer作为管道的一个步骤包括在内,是否通过上述操作正确地进行了调整(如上所述)调整每个分组的训练数据。