更新于
2026年7月11日
多项式贝叶斯#
在通过原始朴素贝叶斯来进行文本分类的场景中,在计算条件概率时都是将词表中的每个词以是否出现为标准进行类别化(Categorization)处理,因此如果将词频作为特征维度的取值类别,那么将会出现在测试集中特征维度的取值情况数大于训练集中的情况。
例如在训练集中“客栈”这个词出现的最大次数为10,那么模型在拟合过程中就会认为“客栈”这个维度的特征取值有10种情况,并以此进行建模;但是当测试集中的某个样本里“客栈”这个词出现的频次为11时,那么模型便会认为该维度多了一种取值情况,进而无法取到对应的条件概率。
同时,在利用词袋模型对文本进行向量化表示时词频也是一个重要的考量因素,而多项朴素贝叶斯(Multinomial Naive Bayes, MNB)算法在处理这一问题时则是将每个维度的词频在总词频中的占比来作为条件概率进行建模
示例代码#
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import classification_report
from sklearn.naive_bayes import MultinomialNB
def load_data():
x, y = load_cut_spam()
x_train, x_test, y_train, y_test = \
train_test_split(x, y, test_size=0.3, random_state=2020)
vect = TfidfVectorizer(max_features=1000)
x_train = vect.fit_transform(x_train)
x_test = vect.transform(x_test)
return x_train, x_test, y_train, y_test
if __name__ == '__main__':
x_train, x_test, y_train, y_test = load_data()
print(f"MultinomialNB 运行结果:")
model = MultinomialNB(alpha=1.)
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print(classification_report(y_pred, y_test))运行结果#
MultinomialNB 运行结果:
precision recall f1-score support
0 0.93 0.99 0.96 1418
1 0.99 0.94 0.96 1583
accuracy 0.96 3001
macro avg 0.96 0.96 0.96 3001
weighted avg 0.96 0.96 0.96 3001
阅读
--