更新于 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
阅读 --

7.4 多项式朴素贝叶斯原理与实现

在上一节内容中,我们详细介绍了一种常见的朴素贝叶斯算法,也被称之为Categorical Naive Bayes。但实际上,”朴素贝叶斯“算法远不止这一种,而它们之间的主要区别在于对条件概率的处理上[3],即式(7-10)中的部分。因此在接 …