P ( C ∣ W ) = P ( W ∣ C ) P ( C ) P ( W ) P(C \mid W)=\frac{P(W \mid C) P(C)}{P(W)} P(C∣W)=P(W)P(W∣C)P(C)
注:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别
公式可以理解为:
P ( C ∣ F 1 , F 2 , … ) = P ( F 1 , F 2 , … ∣ C ) P ( C ) P ( F 1 , F 2 , … ) P(C \mid F 1, F 2, \ldots)=\frac{P(F 1, F 2, \ldots \mid C) P(C)}{P(F 1, F 2, \ldots)} P(C∣F1,F2,…)=P(F1,F2,…)P(F1,F2,…∣C)P(C)
其中c可以是不同类别。
公式分为三个部分:
P ( F 1 ∣ C ) = N i + α N + α m P(F 1 \mid C)=\frac{N i+\alpha}{N+\alpha m} P(F1∣C)=N+αmNi+α
α \alpha α 为指定的系数一般为1,m为训练文档中统计出的特征词个数
优点:
• 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
• 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
• 分类准确度高,速度快。
缺点:
• 需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
sklearn.naive_bayes.MultinomialNB
sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
• estimator.score()
• 一般最常见使用的是准确率,即预测结果正确的百分比
在分类任务下,预测结果(Predicted Condition)与正确标 记(True Condition)之间存在四种不同的组合,构成混淆 矩阵(适用于多分类)。
精确率:预测结果为正例样本中真实为正例的比例(查准率)
召回率:真实为正例的样本中预测结果为正例的比例(查全率,对 正样本的区分能力)
F1-score,反映了模型的稳健型
F 1 = 2 T P 2 T P + F N + F P = 2 ⋅ Precision ⋅ Recall Precision + Recall F 1=\frac{2 T P}{2 T P+F N+F P}=\frac{2 \cdot \text { Precision } \cdot \text { Recall }}{\text { Precision }+\text { Recall }} F1=2TP+FN+FP2TP= Precision + Recall 2⋅ Precision ⋅ Recall
sklearn.metrics.classification_report
sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
• y_true:真实目标值
• y_pred:估计器预测目标值
• target_names:目标类别名称
• return:每个类别精确率与召回率
20个新闻组数据集包含20个主题的18000个新闻组帖子
代码示例:
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import classification_report
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
def naive_bayes():
news = fetch_20newsgroups()
# 进行数据分割
X_train, X_test, y_train, y_test = train_test_split(news.data, news.target)
# 对数据集进行特征抽取
td = TfidfVectorizer()
# 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
X_train = td.fit_transform(X_train)
print(td.get_feature_names())
X_test = td.transform(X_test)
#实例化贝叶斯
nb = MultinomialNB(alpha=1)
nb.fit(X_train, y_train)
y_predict = nb.predict(X_test)
print("预测准确率为:", nb.score(X_test, y_test))
classification_report(y_test, y_predict, target_names=news.target_names)
if __name__ == '__main__':
naive_bayes()