分类算法----朴素贝叶斯算法
贝叶斯公式:
P(C)
:每个文档类别的概率
(
某文档类别词数/总文档词数
)
P(W│C)
:给定类别下特
征(被预测文档中出现的词)的概
率
计算方法:𝑃𝐹1𝐶=𝑁𝑖/𝑁方法:P(F1│C)=Ni/N (训练文档中去计算)
𝑁𝑖为该𝐹1词Ni为该F1词在C类别所有文档中出现的次数
N为所属类别C下的文档所有词出现的次数和
𝑃
𝐹
1,
𝐹
2,…
预测文档
中
每个词
的
概率 P(F1,F2,…) 预测文档中每个词的概率
例如:求一篇文章是属于科技还是属于娱乐,分别求他的朴素贝叶斯值进行判别属于哪一类别:
特征\统计 | 科技 | 娱乐 | 汇总(求和) |
“影院” | 8 | 56 | 64 |
“支付宝” | 20 | 15 | 35 |
“云计算” | 63 | 0 | 63 |
汇总(求和) | 100 | 121 | 221 |
科技: P(影院,支付宝,云计算 │科技)∗P(科技)=8/100∗20/100∗63/100∗(100/221) =0.00456109
娱乐: P(影院,支付宝,云计算│娱乐)∗P(娱乐)=56/121∗15/121∗0/121∗(121/221)=0
上面显示娱乐概率为0,这显然不合理,为解决这个问题,我们需要新的方法-----拉普拉斯平滑
拉普拉斯平滑:
P(F1│C)=(Ni+α)/(N+αm)
𝛼为指定的系数α为指定的系数一般为1,m为训练文档中统计出的特征词个数
API:
sklearn.naive_bayes.MultinomialNB
(
alpha = 1.0
)
朴素贝叶斯分类
alpha
:拉普拉斯平滑系数
算法:
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
def naviebayes():
"""朴素贝叶斯"""
# 获取数据
news = fetch_20newsgroups(subset="all")
# 进行数据分割 特征值 = 文章,目标值 = 文章匪类
train_x, test_x, train_y, test_y = train_test_split(news.data, news.target, test_size=0.25)
# 特征抽取
tf = TfidfVectorizer()
# 以训练集中的词的列表进行每篇文章的重要性统计
train_x = tf.fit_transform(train_x)
# 因为都是以训练集进行统计,所以测试集只需要统计训练集中的关键词就可以啦
test_x = tf.transform(test_x)
# 进行朴素贝叶斯计算
# 实例化贝叶斯
mlt = MultinomialNB(alpha=1.0)
# 对训练集进行训练
mlt.fit(train_x, train_y)
# 测试集进行结果判断,得出预测类别
y_predict = mlt.predict(test_x)
print("预测类别:", y_predict)
# 准确率,模型的准确率
print(mlt.score(test_x, test_y))
if __name__ == '__main__':
naviebayes()
•
优点:
•
朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
•
对缺失数据不太敏感,算法也比较简单,常用于文本分类。
•
•
分类准确度高,速度快
•
缺点:
•
需要知
道先验概率P(F1,F2,…|C),因此
在某些时候会由于假设的先验
模型的原因导致预测效果不佳。