训练集中不存在关键字时如何处理朴素贝叶斯分类器

How to handle Naive Bayes Classifier when keywords are not present in training set

我正在尝试实现一个简单的 Naive Bayes Classifier,在训练中我观察到如果关键字(预测)同样属于两者 class 那么 classifier 为两者分配相同的概率classes,如果训练数据中不存在关键字(预测),那么它也会为 class.

分配相同的概率

很难区分这两种情况。我相信这是因为 1 的拉普拉斯平滑而发生的,而情况 3 中的概率 0.5 是因为 class 的概率,但我不确定。我可以做一些技巧来确保如果训练数据中不存在关键字,那么 classifier 分配的概率为零。由于训练数据较少是可能的还是我应该为这种情况寻找其他选择。

Fruit probability: 0.50 Veggie probability: 0.50

Fruit probability: 0.50 Veggie probability: 0.50

Fruit probability: 0.50 Veggie probability: 0.50

代码

from nltk.classify import NaiveBayesClassifier, accuracy

dataFruits = ['Apple', 'Banana', 'Cherry', 'Grape', 'Guava', 
              'Lemon', 'Mangos', 'Orange', 'Strawberry', 'Watermelon']

dataVeggies = ['Potato', 'Spinach', 'Carrot', 'Onion', 'Cabbage', 
               'Broccoli', 'Tomato', 'Pea', 'Cucumber', 'Eggplant']

def basket_features(basket): 
    basket_items = set(basket) 
    features = {}
    for item in allFeatures:
        features['contains({})'.format(item)] = (item in basket_items)
    return features

def test(basket):
    lst = basket_features(basket)
    prob_dist = classifier.prob_classify(lst)
    print('\nFruit probability: {:.2f}\tVeggie probability: {:.2f}'.format(prob_dist.prob('fruit'), prob_dist.prob('veggie')))

allFeatures = dataFruits + dataVeggies

class1= [(basket_features([item]), 'fruit') for item in dataFruits]
class2 = [(basket_features([item]), 'veggie') for item in dataVeggies]

train_set = class1[:] + class2

# Train
classifier = NaiveBayesClassifier.train(train_set)

# Predict
test(['Apple', 'Banana', 'Potato', 'Spinach'])
test(['Apple', 'Banana', 'Potato', 'Spinach', 'Strawberry', 'Pea'])
test(['Hello', 'World'])

听起来朴素贝叶斯分类器正在做正确的事情,即在给定一些输入特征时尝试估计 类 的(条件)概率分布。如果没有任何与您的训练数据匹配的输入特征(您的案例 3),那么输出(条件)概率分布是平坦的是正确的。在您的情况下,这意味着情况 3(没有可用的输入特征)等同于情况 1(存在输入特征,但根本不区分水果和蔬菜)。 如果您想区分这两种情况,查看输入特征的先验概率可能会有所帮助 - 这将表明情况 1 看起来比情况 3 更像您的训练数据,而情况 3 可能与您的特征没有共同之处训练数据。根据 NBC 的构建方式,先验概率可能严格为零,或者分配一些小值以避免计算奇异的对数概率的风险。