朴素贝叶斯分类方法是一种基于贝叶斯定理的统计学习分类算法。它假设所有特征之间相互独立,且每个特征对于类别的影响是等价的,因此被称为“朴素”。该方法通过先验概率和观测数据的条件概率来计算后验概率,然后将待分类样本分配到具有最大后验概率的类别中。在文本分类、垃圾邮件过滤、情感分析等领域具有广泛应用。
举例:根据以下数据,此时如果一个男生向女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?
包含多个条件,且所有条件同时成立的概率
记作:P(A,B)
特性:P(A, B) = P(A)P(B)
事件A在另外一个事件B已经发生条件下的发生概率
记作:P(A|B)
特性:P(A1,A2|B) = P(A1|B)P(A2|B)
注意:此条件概率的成立,是由于A1,A2相互独立的结果(记忆)
# 由于分母 P(W) 相同,所以直接比较分子
科技:
P(科技|影院,支付宝,云计算)
= (影院,支付宝,云计算|科技)∗P(科技)
= (8/100)∗(20/100)∗(63/100)∗(30/90)
= 0.00456109
娱乐:
P(娱乐|影院,支付宝,云计算)
= (影院,支付宝,云计算|娱乐)∗P(娱乐)
= (56/121)∗(15/121)∗(0/121)∗(60/90)
= 0
是否为娱乐类别的计算概率为0,这显然不合适,所以用拉普拉斯平滑系数来防止计算概率为0
P(娱乐|影院,支付宝,云计算)
= P(影院,支付宝,云计算|娱乐)P(娱乐)
= P(影院|娱乐)*P(支付宝|娱乐)*P(云计算|娱乐)P(娱乐)
= (56+1/121+4)(15+1/121+4)(0+1/121+1*4)(60/90) = 0.00002
# alpha:拉普拉斯平滑系数
sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
数据来源于 sklearn,大约有 20000 个新闻组文档,通过 sklearn.datasets.fetch_20newsgroups(subset='all')
来获取。
步骤:
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
news = fetch_20newsgroups(subset='all')
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.3)
# 对于文本数据,进行特征抽取
tf = TfidfVectorizer()
x_train = tf.fit_transform(x_train)
# 不能调用fit_transform
x_test = tf.transform(x_test)
# estimator估计器流程
mlb = MultinomialNB(alpha=1.0)
mlb.fit(x_train, y_train)
# 进行预测
y_predict = mlb.predict(x_test)
print("预测每篇文章的类别:", y_predict[:100])
print("真实类别为:", y_test[:100])
print("预测准确率为:", mlb.score(x_test, y_test))
优点:
缺点: