scikit-learn机器学习笔记——朴素贝叶斯算法

scikit-learn机器学习笔记——朴素贝叶斯算法

  • 朴素贝叶斯算法
    • 贝叶斯公式
    • 拉普拉斯平滑
    • 朴素贝叶斯分类优缺点
    • sklearn朴素贝叶斯实现API
      • MultinomialNB
    • 分类模型评估
      • 混淆矩阵
      • 精确率(Precision)与召回率(Recall)
      • 分类模型评估API
    • 朴素贝叶斯算法实例-sklearn20类新闻分类

朴素贝叶斯算法

贝叶斯公式

P ( C ∣ W ) = P ( W ∣ C ) P ( C ) P ( W ) P(C \mid W)=\frac{P(W \mid C) P(C)}{P(W)} P(CW)=P(W)P(WC)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(CF1,F2,)=P(F1,F2,)P(F1,F2,C)P(C)
其中c可以是不同类别。

公式分为三个部分:

  • P ( C ) : P(C): P(C): 每个文档类别的概率(某文档类别词数 / 总文档词数)。
  • P ( W ∣ C ) P(W \mid C) P(WC) : 给定类别下特征(被预测文档中出现的词)的概率
    计算方法: P ( F 1 ∣ C ) = N i / N P(F 1 \mid C)=N i / N P(F1C)=Ni/N (训练文档中去计算)。
    N i N i Ni 为该F1词在C类别所有文档中出现的次数。
    N N N为所属类别C下的文档所有词出现的次数和。
  • P ( F 1 , F 2 , … ) P(F 1, F 2, \ldots) P(F1,F2,) 预测文档中每个词的概率。

拉普拉斯平滑

P ( F 1 ∣ C ) = N i + α N + α m P(F 1 \mid C)=\frac{N i+\alpha}{N+\alpha m} P(F1C)=N+αmNi+α
α \alpha α 为指定的系数一般为1,m为训练文档中统计出的特征词个数

朴素贝叶斯分类优缺点

优点:
• 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
• 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
• 分类准确度高,速度快。

缺点:
• 需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

sklearn朴素贝叶斯实现API

  • sklearn.naive_bayes.MultinomialNB

MultinomialNB

  • sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
    • 朴素贝叶斯分类
    • alpha:拉普拉斯平滑系数

分类模型评估

• estimator.score()
• 一般最常见使用的是准确率,即预测结果正确的百分比

混淆矩阵

  在分类任务下,预测结果(Predicted Condition)与正确标 记(True Condition)之间存在四种不同的组合,构成混淆 矩阵(适用于多分类)。
scikit-learn机器学习笔记——朴素贝叶斯算法_第1张图片

精确率(Precision)与召回率(Recall)

精确率:预测结果为正例样本中真实为正例的比例(查准率)

scikit-learn机器学习笔记——朴素贝叶斯算法_第2张图片
召回率:真实为正例的样本中预测结果为正例的比例(查全率,对 正样本的区分能力)
scikit-learn机器学习笔记——朴素贝叶斯算法_第3张图片
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 

分类模型评估API

  • sklearn.metrics.classification_report

  • sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
    • y_true:真实目标值
    • y_pred:估计器预测目标值
    • target_names:目标类别名称
    • return:每个类别精确率与召回率

朴素贝叶斯算法实例-sklearn20类新闻分类

  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()

你可能感兴趣的:(机器学习,python,人工智能)