数值错误:模型的特征数量必须与输入相匹配(sklearn)

3

我正在尝试在一些电影评论数据上运行分类器。这些数据已经分为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还比较新,如果这是一个简单的修复操作,我提前道歉。


错误信息有什么不清楚的地方吗? - Julien
1个回答

2
问题就在这里:
vectorizer = TfidfVectorizer(ngram_range=(1,2))
vectors_train = vectorizer.fit_transform(rev_train)
vectors_test = vectorizer.fit_transform(rev_test)

你需要在训练数据和测试数据上同时调用fit_transformfit_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

1
这样就有意义多了。我刚刚做出了更改,它工作了!谢谢你! - C.G
@C.G 没问题。欢迎来到 Stack Overflow! - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接