ValueError:模型的特征数量必须与输入匹配(sklearn)

时间:2018-10-23 22:17:16

标签: python machine-learning scikit-learn sklearn-pandas tfidfvectorizer

我正在尝试对一些电影评论数据运行分类器。数据已经分为reviews_train.txtreviews_test.txt。然后,我将数据加载到其中,并将其分别分为评论和标签(正数(0)或负数(1)),然后对这些数据进行矢量化处理。这是我的代码:

from sklearn import tree
from sklearn.metrics import accuracy_score
from sklearn.feature_extraction.text import TfidfVectorizer
#read the reviews and their polarities from a given file

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,labels

rev_train,labels_train=loadData('reviews_train.txt')
rev_test,labels_test=loadData('reviews_test.txt')

#vectorizing the input
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)

#prediction
pred=clf.predict(vectors_test)
#print accuracy

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来说还很陌生,所以如果这是一个简单的解决方法,我先向您道歉。

1 个答案:

答案 0 :(得分:0)

问题就在这里

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) # Change here