朴素贝叶斯公式
- “朴素”指的是不同特征间条件独立,即每个特征发生的概率互不影响。
- C表示类别的集合,W是不同特征的集合。
- P(C|W)表示,有W这些特征发生,属于C类别的概率。
- P(W|C)表示,在C类别已经发生的情况下,W特征发生的概率。
- P(C)表示在所有数据中,判定为C类别的概率。
- P(W)表示在所有数据中,W特征发生的概率。
- 朴素贝叶斯会根据特征计算属于每个类别的概率,概率最大的即为最终分类。
贝叶斯公式例题
为了方便理解贝叶斯公式,一起看一下下面的例题。
上面是在221篇文档中,统计出了科技类和娱乐类文档的关键词(也就是特征)及出现的次数。现有一篇文档,出现了”影院“、”支付宝“、”云计算“这几个关键词,使用贝叶斯公式求出此文档属于科技类还是娱乐类。
根据贝叶斯公式可得:
P(科技) = P(科技|影院,支付宝,云计算) = P(影院,支付宝,云计算|科技)*P(科技) / P(影院,支付宝,云计算)
P(娱乐) = P(娱乐|影院,支付宝,云计算) = P(影院,支付宝,云计算|娱乐)*P(娱乐) / P(影院,支付宝,云计算)
因为最终比较的是P(科技)和P(娱乐)的大小,两个算式分母相同,可以不计算。所以最终计算结果为:
P(科技) = P(影院,支付宝,云计算|科技)*P(科技) = (8/100) x (20/100) x (63/100) x (100/221) = 0.00456109
P(娱乐) = P(影院,支付宝,云计算|娱乐)*P(娱乐) = (56/121) x (15/121) x (0/121) x (121/221) = 0
所以最终的结果为科技类。
贝叶斯算法优化
在上面的例题中,我们可以看到,属于娱乐类的概率是0,这显然是不合理的。如果有多个特征出现的频率是0,那么可能就会出现多个类别的概率是0。为了避免这种情况,我们引入了拉普拉斯平滑系数。
F1表示特征,C表示类别。α表示平滑系数,一般指定为1,Ni表示C类别中F1特征出现的次数,N表示C类别下所有特征出现的次数总和。
贝叶斯的使用
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB
一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。
代码实现:
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
def bayes():
# 加载数据,data_home指定数据下载地址
news = fetch_20newsgroups(data_home=r'D:\学习资料\机器学习资料\fetch数据集', subset='all')
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 提取重要特征
tf = TfidfVectorizer()
x_train = tf.fit_transform(x_train)
x_test = tf.transform(x_test)
# alpha即拉普拉斯平滑系数
mlt = MultinomialNB(alpha=1.0)
mlt.fit(x_train, y_train)
y_predict = mlt.predict(x_test)
print('准确率为:', mlt.score(x_test, y_test))
print('精确率和召回率为:', classification_report(y_test, y_predict))
return None
if __name__ == '__main__':
bayes()
朴素贝叶斯优缺点
- 基于古典数学理论,分类效率稳定。
- 算法简单,对缺失数据不敏感,常用于文档分类。
- 分类准确度高,效率快。
- 缺点:贝叶斯使用的前提是假设所有特征之间条件独立,如果特征之间有关联,会影响分类效果。
- 注意使用朴素贝叶斯算法时,需要对文本类型的特征进行特征值化。