ValueError: количество функций модели должно соответствовать входным данным (sklearn)

Я пытаюсь запустить классификатор для некоторых данных обзора фильмов. Данные уже были разделены на reviews_train.txt и reviews_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, поэтому заранее извиняюсь, если это простое исправление.


person C.G    schedule 23.10.2018    source источник
comment
Что непонятно в сообщении об ошибке?   -  person Julien    schedule 24.10.2018


Ответы (1)


Проблема именно здесь:

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
person rayryeng    schedule 23.10.2018
comment
Это имеет гораздо больше смысла. Только что внес изменения и все работает! Благодарю вас! - person C.G; 24.10.2018
comment
@C.G Никаких проблем. Добро пожаловать и добро пожаловать в Stack Overflow! - person rayryeng; 24.10.2018