【机器学习】朴素贝叶斯算法基本原理与计算案例

朴素贝叶斯算法基本原理与计算案例

文章目录

  • 朴素贝叶斯算法基本原理与计算案例
    • 1. 朴素贝叶斯算法的基本原理
    • 2. 概率基础
    • 3. 朴素贝叶斯简单计算案例
    • 4. 朴素贝叶斯算法对文本进行分类
    • 5. 拉普拉斯平滑系数
    • 6. 案例:20类新闻分类
    • 7. 总结

1. 朴素贝叶斯算法的基本原理

朴素贝叶斯算法的基本原理建立在贝叶斯定理的基础上,它用于分类和概率估计。算法的核心思想是根据已知数据,计算不同类别的条件概率,并利用这些概率进行分类。以下是朴素贝叶斯算法的基本原理:

  1. 贝叶斯定理:朴素贝叶斯算法基于贝叶斯定理,该定理描述了在给定某些观察数据的情况下,如何计算某一事件的条件概率。数学表示如下:

    P(A|B) = (P(B|A) * P(A)) / P(B)

    • P(A|B):在给定B的条件下,事件A发生的概率。
    • P(B|A):在给定A的条件下,事件B发生的概率。
    • P(A):事件A发生的先验概率。
    • P(B):事件B发生的先验概率。
  2. 朴素假设:朴素贝叶斯算法做出一个朴素的假设,即特征之间是相互独立的。这意味着在分类时,它假设每个特征对于类别的影响是相互独立的。尽管这个假设在实际情况中通常不成立,但它简化了计算,使算法易于实现。

  3. 学习阶段:在朴素贝叶斯的学习阶段,使用已知的训练数据来估计每个特征在不同类别下的条件概率。这包括计算每个类别的先验概率(每个类别发生的概率)以及每个特征在每个类别下的条件概率。

  4. 预测阶段:在预测阶段,算法使用已经估计的条件概率来对新的、未知的数据点进行分类。它计算每个类别的后验概率(给定数据点的情况下,每个类别发生的概率),然后选择具有最高后验概率的类别作为预测结果

具体步骤包括计算每个特征在给定类别下的条件概率,然后将这些条件概率组合起来,使用贝叶斯定理来计算后验概率。

朴素贝叶斯算法在特征之间相关性较高的情况下可能表现不佳,因为它的独立性假设通常不成立。

2. 概率基础

  • 联合概率:包含多个条件,且这些条件同时成立的概率记作:P(A,B,…)
  • 条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率,记作P(A|B)
  • 相互独立:如果P(A,B)=P(A)*P(B),则称事件A和事件B相互独立

3. 朴素贝叶斯简单计算案例

  • 下面是训练集:
样本数 职业 体型 女神是否喜欢
1 程序员 超重 不喜欢
2 产品经理 匀称 喜欢
3 程序员 匀称 喜欢
4 程序员 超重 喜欢
5 美工 匀称 不喜欢
6 美工 超重 不喜欢
7 产品经理 匀称 喜欢
  • 下面是测试集:
测试集 小明 产品经理 超重 ???

我们先来明确一下目标,已知小明是一个产品经理,体重超重,是否会被女神喜欢,从测试集来看,这是一个分类问题,而且还是一个二分类问题。先来解决以下的概率问题:

  • 女神喜欢的概率?P(喜欢)=4/7
  • 职业是程序员并且体型匀称的概率?P(程序员,匀称)=1/7 联合概率
  • 在女神喜欢的条件下,职业是程序员的概率?P(程序|喜欢)=2/4=1/2 条件概率
  • 在女神喜欢的条件下,职业是程序员,体重是超重的概率?P(程序员,超重|喜欢)=1/4 联合条件概率

解决完以上的问题之后,就来解决小明的问题。

  • 目标:P(喜欢|产品经理,超重)=? and 贝叶斯公式

P ( A ∣ B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)

  • 接下来就是简单的计算,在计算的过程中,我们会发现,P(产品经理,超重)=0,回到朴素贝叶斯算法的i定义,两事件之间是相互独立的,所以P(产品经理,超重)=P(产品经理)*P(超重)=7/12,所以很大可能内女神喜欢,但是也是不实际的,因为样本量太小,而且做出了相互独立的假设。

4. 朴素贝叶斯算法对文本进行分类

文档ID 文档中的词 属于c=China类
训练集 1 Chinese Beijing Chinese Yes
2 Chinese Chinese Shanghai Yes
3 Chinese Macao Yes
4 Tokyo Japan Chinese No
测试集 5 Chinese Chinese Chinese Tokyo Japan

如果朴素贝叶斯公式用在文章分类的场景中,我们可以这样看:
P ( C ∣ F 1 , F 2 , F 3 , F 4... ) = P ( F 1 , F 2 , F 3 , F 4... ∣ C ) ⋅ P ( C ) P ( F 1 , F 2 , F 3 , F 4... ) P(C|F1,F2,F3,F4...) = \frac{P(F1,F2,F3,F4...|C) \cdot P(C)}{P(F1,F2,F3,F4...)} P(CF1,F2,F3,F4...)=P(F1,F2,F3,F4...)P(F1,F2,F3,F4...∣C)P(C)
其中C可以是不同类别,公式分为三个部分:

  • P©:每个文档类别的概率(某文档类别数/总文档数量)
  • P(W|C):给定类别下特征(被预测文档中出现的词)的概率,计算方法:P(F1|C)=Ni/N(训练文档中去计算,Ni为该F1词在C类别所有文档中出现的次数,N为所需类别C下的文档所有词出现次数和)
  • P(F1,F2,F3,…):预测文档中每个词的概率

首先明确目标,我们要求的是P(C|Chinese,Chinese,Chinese,Tokyo,Japan),即求:P(Chinese,Chinese,Chinese,Tokyo,Japan|C),P©,P(Chinese,Chinese,Chinese,Tokyo,Japan)

  • 根据朴素贝叶斯算法,假设每一个事件相互独立所以:P(Chinese,Chinese,Chinese,Tokyo,Japan|C)=P(Chinese|C)^3*P(Tokyo|C)*P(Japan|C),我们可以算出P(Chinese|C)=5/8,而在算P(Tokyo|C)和P(Japan|C)的时候发现为0,这会对结果产生很大的影响,发生这种情况的原因就是样本量太小了,那么如何避免这情况呢?这就要用到拉普拉斯平滑系数了。

5. 拉普拉斯平滑系数

拉普拉斯平滑系数是一种在统计学和机器学习中用于处理概率估计问题的技术。它的主要作用是解决在统计分析中遇到的一些问题,如零概率问题和过拟合问题。具体来说,拉普拉斯平滑系数通常用于计算一个特定事件在一个样本空间中的概率。在统计中,如果一个事件在训练数据中没有观察到,那么根据最大似然估计,其概率会被估计为零。这可能导致问题,因为零概率的事件在实际应用中可能不是完全不可能发生的,而只是未观察到而已。

简单来说,就是防止计算出的分类概率为0
P ( F 1 ∣ C ) = N i + α N + α m P(F1|C) = \frac{Ni+α}{N+αm} P(F1∣C)=N+αmNi+α
α为指定系数一般为1,m为训练文档中统计出的特征词个数,例如:

P(Chinese|C)=(5+1)/(8+1*6)=3/7
P(Tokyo|C)=(0+1)/(8+1*6)=1/14
P(Japean|C)=(0+1)/(8+1*6)=1/14

6. 案例:20类新闻分类

  • sklearn.naive_bayes.MultinomialNB(alpha=1.0)
    • 朴素贝叶斯分类
    • alpha:拉普拉斯平滑系数
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split

def nb_news_demo():
    """
    用朴素贝叶斯算法对新闻进行分类
    1.获取数据
    2.划分数据集
    3.特征工程,文本特征抽取-tfidf
    4.朴素贝叶斯算法预估器
    5.模型评估
    :return:
    """
    news = fetch_20newsgroups(subset= "all")
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)
    transfer = TfidfVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    estimator = MultinomialNB()
    estimator.fit(x_train, y_train)
    # 模型评估,方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:", score)
    return None
y_predict:
 [ 4 15  9 ...  4  0  6]
直接比对真实值和预测值:
 [ True False  True ... False False  True]
准确率为: 0.8499575551782682

7. 总结

  • 优点:朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率;对缺失数据不太敏感,算法比较简单,常用于文本分类;分类准确率高,速度快。
  • 缺点:由于使用了样本属性独立性的假设,所以如果特征属性有关联时效果不好。

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