我在尝试使用Python和scikit-learn对一系列示例运行多项式朴素贝叶斯分类器,但结果总是将所有示例分类为负例。训练集略微偏向于负例,P(负例)约为0.75。我查看了文档,但没有找到如何偏向于正例的方法。
from sklearn.datasets import load_svmlight_filefrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import accuracy_scorefrom sklearn.metrics import recall_scorefrom sklearn.metrics import precision_scoreX_train, y_train= load_svmlight_file("POS.train")x_test, y_test = load_svmlight_file("POS.val")clf = MultinomialNB()clf.fit(X_train, y_train)preds = clf.predict(x_test)print('accuracy: ' + str(accuracy_score(y_test, preds)))print('precision: ' + str(precision_score(y_test, preds)))print('recall: ' + str(recall_score(y_test, preds)))
回答:
设置先验概率来处理这个问题并不是一个好方法,这样做会导致一些本不该被分类为正例的负例被错误分类。你的数据是0.25/0.75的比例,因此设置0.5/0.5的先验概率是一个很差的选择。
相反,可以通过计算精确率和召回率的调和平均数来生成F分数,这有助于正确处理像这样的偏倚数据:
from sklearn.metrics import f1_score
然后可以使用F1分数来评估模型的质量。接着,你可以进行模型调优和交叉验证,以找到更适合分类你的数据的模型,即最大化F1分数的模型。
另一种方法是随机剪除数据中的负例,使分类器在0.5/0.5的数据上进行训练。这样,预测步骤应该能给出更合适的分类结果。