当我尝试使用朴素贝叶斯/Python进行预测时出现尺寸不匹配错误

Posted

技术标签:

【中文标题】当我尝试使用朴素贝叶斯/Python进行预测时出现尺寸不匹配错误【英文标题】:Getting dimension mismatch error when i try to predict with naive bayes / Python 【发布时间】:2018-10-05 02:17:00 【问题描述】:

我创建了一个情绪脚本并使用朴素贝叶斯对评论进行分类。我训练并测试了我的模型并将其保存在 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)

【问题讨论】:

转化后的评论有什么维度(形状)?您可以确保将 [n_samples, n_features] 传递给朴素贝叶斯。参考:scikit-learn.org/stable/modules/generated/… 转换后的评论有这样的输出(相互写入): (0, 8) 1 (0, 11) 1 (0, 26) 1 (0, 39) 1 啊,是列表吗? x_train.shapetransformed_review.shape 的结果是什么? x_train.shape (5, 129) 和transformed_review.shape (1, 129) 【参考方案1】:

您还需要保存 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://***.com/a/15463472/3374996

【讨论】:

我是在单独的文件中腌制向量还是在感性_MNB_model.pickle 中这样做?

以上是关于当我尝试使用朴素贝叶斯/Python进行预测时出现尺寸不匹配错误的主要内容,如果未能解决你的问题,请参考以下文章

当 Sklearn 朴素贝叶斯与浮点数一起使用时出现未知标签类型错误

执行朴素贝叶斯和决策树分类时出现 KeyError

python - 如何在使用朴素贝叶斯和python训练数据后进行预测?

从头开始实现朴素贝叶斯算法

文末福利 | 一文实战朴素贝叶斯算法(附python演练)

如何在 python 的朴素贝叶斯分类器中对用户输入测试集进行分类?