如何使用两个不同的数据集作为训练集和测试集?

数据挖掘 Python nlp 数据集 训练
2022-02-12 00:30:58

最近,我开始阅读更多关于 NLP 的内容并关注 Python 教程,以了解有关该主题的更多信息。我遇到的问题,现在我正在尝试制作我自己的分类算法(文本发送正面/负面消息)关于训练和测试数据集。在我发现的所有示例中,只使用了一个数据集,该数据集后来被拆分为训练/测试。我有两个数据集,我的方法是将两个数据集中的所有文本(预处理后)放在同一个语料库中,然后将语料库分成测试集和训练集。

datasetTrain = pd.read_csv('train.tsv', delimiter = '\t', quoting = 3)
datasetTrain['PN'].value_counts()

datasetTest = pd.read_csv('test.tsv', delimiter = '\t', quoting = 3)
datasetTest['PN'].value_counts()

corpus = []
y = []

# some preprocessing
    y.append(posNeg)
    corpus.append(text)

from sklearn.feature_extraction.text import TfidfVectorizer
transf = TfidfVectorizer(stop_words = stopwords, ngram_range = (1,1), min_df = 5, max_df = 0.65)
X = transf.fit_transform(corpus).toarray()

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.11, random_state = 0)

我这样做的原因是因为我正在使用词袋模型,如果我从头开始创建X_trainX_test(分别为y_trainy_test)而不使用拆分功能,我会在运行分类算法:

X_train = transf.fit_transform(corpustrain).toarray()
X_test = transf.fit_transform(corpustest).toarray()

...

classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)

ValueError: Number of features of the model must match the input. Model n_features is 2770 and input n_features is 585

我对此有点陌生,我想知道是否有人可以指导我正确的方向?

1个回答

您可能希望使用 apipeline来执行此操作。具体来说,您不想训练TFIDFVectorizer整个语料库 - 这样做可以让您的模型提示测试集中可能存在哪些特征,而这些特征可能在训练集中不存在 - 这个概念通常被称为“泄漏”或“数据”窥探”。

正确的模式是:

transf = transf.fit(X_train)
X_train = transf.transform(X_train)
X_test = transf.transform(X_test)

使用 a pipeline,您可以将TFIDFVectorizer与您的模型融合到一个对象中,该对象在一个步骤中完成转换和预测。在该模式中维护可靠的方法更容易。

在示例代码中,您在同一步骤中进行拟合和转换fit_transform,这每次都会创建不同的特征,并且是错误的根源。