Получение ошибки несоответствия размеров при попытке предсказать наивный байес / Python - PullRequest
0 голосов
/ 24 апреля 2018

Я создал сценарий настроения и использую Наивный Байес для классификации обзоров. Я обучил и протестировал свою модель и сохранил ее в объекте Pickle. Теперь я хотел бы выполнить прогноз на новом наборе данных, но всегда получаю следующее сообщение об ошибке

raise ValueError('dimension mismatch') ValueError: dimension mismatch

Появляется в этой строке:

preds = nb.predict(transformed_review)[0]

Может кто-нибудь сказать мне, если я делаю что-то не так? Я не понимаю ошибку.

Это мой сценарий:

sno = SnowballStemmer("german")
stopwords = [word.decode('utf-8-sig') for word in stopwords.words('german')] 

ta_review_files = glob.glob('C:/users/Documents/review?*.CSV')
review_akt_doc = max(ta_review_files, key=os.path.getctime

ta_review = pd.read_csv(review_akt_doc) 
sentiment_de_class= ta_review

x = sentiment_de_class['REV']
y = sentiment_de_class['SENTIMENT']

def text_process(text):
    nopunc = [char for char in text.decode('utf8') if char not in string.punctuation]
    nopunc = ''.join(nopunc)
    noDig = ''.join(filter(lambda x: not x.isdigit(), nopunc)) 

    ## stemming
    stemmi = u''.join(sno.stem(unicode(x)) for x in noDig)

    stop = [word for word in stemmi.split() if word.lower() not in stopwords]
    stop = ' '.join(stop)

    return [word for word in stemmi.split() if word.lower() not in stopwords]


######################
# Matrix
######################
bow_transformer = CountVectorizer(analyzer=text_process).fit(x)
x = bow_transformer.transform(x)

######################
# Train and test data
######################
x_train, x_test, y_train, y_test = train_test_split(x,y, random_state=101)


print 'starting training ..'

######################
## first use
######################
#nb = MultinomialNB().fit(x_train,y_train)
#file = open(sentiment_MNB_path + 'sentiment_MNB_model.pickle', 'wb')
## dump information to that file
#pickle.dump(nb, file)

######################
## after train
######################
file = open(sentiment_MNB_path + 'sentiment_MNB_model.pickle', 'rb')
nb = pickle.load(file)

predis = []
######################
# Classify 
######################
cols = ['SENTIMENT_CLASSIFY']

for sentiment in sentiment_de_class['REV']:
    transformed_review = bow_transformer.transform([sentiment])
    preds = nb.predict(transformed_review)[0]  ##right here I get the error
    predis.append(preds)

df = pd.DataFrame(predis, columns=cols)

1 Ответ

0 голосов
/ 25 апреля 2018

Вам необходимо сохранить объект CountVectorizer так же, как вы сохраняете nb.

Когда вы звоните

CountVectorizer(analyzer=text_process).fit(x)

вы переучиваете CountVectorizer на новых данных, поэтому найденные им функции (словарный запас) будут отличаться от используемых во время обучения, и, следовательно, сохраненные nb, которые были обучены на более ранних функциях, жалуются на несоответствие размеров.

Лучше выбрать их в разных файлах, но при желании вы можете сохранить их в одном файле.

Чтобы засолить оба в одном объекте:

file = open(sentiment_MNB_path + 'sentiment_MNB_model.pickle', 'wb')
pickle.dump(bow_transformer, file)  <=== Add this
pickle.dump(nb, file)

Чтобы прочитать оба в следующем звонке:

file = open(sentiment_MNB_path + 'sentiment_MNB_model.pickle', 'rb')
bow_transformer = pickle.load(file)
nb = pickle.load(file)

Пожалуйста, посмотрите на этот ответ более подробно: https://stackoverflow.com/a/15463472/3374996

...