朴素贝叶斯算法的基本原理建立在贝叶斯定理的基础上,它用于分类和概率估计。算法的核心思想是根据已知数据,计算不同类别的条件概率,并利用这些概率进行分类。以下是朴素贝叶斯算法的基本原理:
贝叶斯定理:朴素贝叶斯算法基于贝叶斯定理,该定理描述了在给定某些观察数据的情况下,如何计算某一事件的条件概率。数学表示如下:
P(A|B) = (P(B|A) * P(A)) / P(B)
朴素假设:朴素贝叶斯算法做出一个朴素的假设,即特征之间是相互独立的。这意味着在分类时,它假设每个特征对于类别的影响是相互独立的。尽管这个假设在实际情况中通常不成立,但它简化了计算,使算法易于实现。
学习阶段:在朴素贝叶斯的学习阶段,使用已知的训练数据来估计每个特征在不同类别下的条件概率。这包括计算每个类别的先验概率(每个类别发生的概率)以及每个特征在每个类别下的条件概率。
预测阶段:在预测阶段,算法使用已经估计的条件概率来对新的、未知的数据点进行分类。它计算每个类别的后验概率(给定数据点的情况下,每个类别发生的概率),然后选择具有最高后验概率的类别作为预测结果。
具体步骤包括计算每个特征在给定类别下的条件概率,然后将这些条件概率组合起来,使用贝叶斯定理来计算后验概率。
朴素贝叶斯算法在特征之间相关性较高的情况下可能表现不佳,因为它的独立性假设通常不成立。
样本数 | 职业 | 体型 | 女神是否喜欢 |
---|---|---|---|
1 | 程序员 | 超重 | 不喜欢 |
2 | 产品经理 | 匀称 | 喜欢 |
3 | 程序员 | 匀称 | 喜欢 |
4 | 程序员 | 超重 | 喜欢 |
5 | 美工 | 匀称 | 不喜欢 |
6 | 美工 | 超重 | 不喜欢 |
7 | 产品经理 | 匀称 | 喜欢 |
测试集 | 小明 | 产品经理 | 超重 | ??? |
---|
我们先来明确一下目标,已知小明是一个产品经理,体重超重,是否会被女神喜欢,从测试集来看,这是一个分类问题,而且还是一个二分类问题。先来解决以下的概率问题:
解决完以上的问题之后,就来解决小明的问题。
P ( A ∣ B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)⋅P(A)
文档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(C∣F1,F2,F3,F4...)=P(F1,F2,F3,F4...)P(F1,F2,F3,F4...∣C)⋅P(C)
其中C可以是不同类别,公式分为三个部分:
首先明确目标,我们要求的是P(C|Chinese,Chinese,Chinese,Tokyo,Japan),即求:P(Chinese,Chinese,Chinese,Tokyo,Japan|C),P©,P(Chinese,Chinese,Chinese,Tokyo,Japan)
拉普拉斯平滑系数是一种在统计学和机器学习中用于处理概率估计问题的技术。它的主要作用是解决在统计分析中遇到的一些问题,如零概率问题和过拟合问题。具体来说,拉普拉斯平滑系数通常用于计算一个特定事件在一个样本空间中的概率。在统计中,如果一个事件在训练数据中没有观察到,那么根据最大似然估计,其概率会被估计为零。这可能导致问题,因为零概率的事件在实际应用中可能不是完全不可能发生的,而只是未观察到而已。
简单来说,就是防止计算出的分类概率为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
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