我正在尝试对一些电影评论数据运行分类器。这批数据已经被分成reviews_train.txt
和reviews_test.txt
。我随后加载了数据,并将每个文件分成评论和标签(正面(0)或负面(1)),然后对这些数据进行向量化。以下是我的代码:
from sklearn import treefrom sklearn.metrics import accuracy_scorefrom sklearn.feature_extraction.text import TfidfVectorizer#从给定文件中读取评论及其极性def loadData(fname): reviews=[] labels=[] f=open(fname) for line in f: review,rating=line.strip().split('\t') reviews.append(review.lower()) labels.append(int(rating)) f.close() return reviews,labelsrev_train,labels_train=loadData('reviews_train.txt')rev_test,labels_test=loadData('reviews_test.txt')#对输入进行向量化vectorizer = TfidfVectorizer(ngram_range=(1,2))vectors_train = vectorizer.fit_transform(rev_train)vectors_test = vectorizer.fit_transform(rev_test)clf = tree.DecisionTreeClassifier()clf = clf.fit(vectors_train, labels_train)#预测pred=clf.predict(vectors_test)#打印准确率print (accuracy_score(pred,labels_test))
然而,我不断收到这个错误:
ValueError: Number of features of the model must match the input.Model n_features is 118686 and input n_features is 34169
我刚开始学习Python,如果这是一个简单的修复,我提前道歉。
回答:
问题就在这里:
vectorizer = TfidfVectorizer(ngram_range=(1,2))vectors_train = vectorizer.fit_transform(rev_train)vectors_test = vectorizer.fit_transform(rev_test)
你对训练数据和测试数据都调用了fit_transform
。fit_transform
同时创建存储在vectorizer
中的模型,然后使用该模型创建向量。因为你调用了两次,发生的情况是vectors_train
首先被创建并生成输出特征向量,然后你用对测试数据的第二次fit_transform
调用覆盖了模型。这导致了向量大小的差异,因为你用与测试数据不同长度的特征训练了决策树。
在进行测试时,你必须用用于训练的相同模型转换数据。因此,不要对测试数据调用fit_transform
– 只需使用transform
来使用已创建的模型:
vectorizer = TfidfVectorizer(ngram_range=(1,2))vectors_train = vectorizer.fit_transform(rev_train)vectors_test = vectorizer.transform(rev_test) # 此处更改