Sklearn学习之朴素贝叶斯算法

分类算法之朴素贝叶斯算法。

理论基础

朴素贝叶斯-贝叶斯公式

image-20200831080919995

w为给定文档的特征值(频数统计,预测文档提供),c为文档类别

公式可以理解为:

image-20200831081031016

其中c可以是不同类别。

公式分为三个部分:

  • P(C):每个文档类别的概率(某文档类别词数/总文档词数)

  • P(W│C):给定类别下特征(被预测文档中出现的词)的概率

计算方法:P(F1│C)=Ni/N (训练文档中去计算)

  • Ni为该F1词在C类别所有文档中出现的次数

  • N为所属类别C下的文档所有词出现的次数和

P(F1,F2,…) 预测文档中每个词的概率

应用举例

训练集统计结果(指定统计词频):

特征\统计 科技 娱乐 汇总(求和)
“商场” 9 51 60
“影院” 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,合适吗?

拉普拉斯平滑

问题:从上面的例子我们得到娱乐概率为0,这是不合理的,如果词频列表里面

有很多出现次数都为0,很可能计算结果都为零

解决方法:拉普拉斯平滑系数

image-20200831081624099

α为指定的系数一般为1,m为训练文档中统计出的特征词个数

sklearn朴素贝叶斯实现API

sklearn.naive_bayes.MultinomialNB

sklearn.naive_bayes.MultinomialNB(alpha = 1.0)

  • 朴素贝叶斯分类

  • alpha:拉普拉斯平滑系数

朴素贝叶斯分类优缺点

优点:

  • 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

  • 对缺失数据不太敏感,算法也比较简单,常用于文本分类。

  • 分类准确度高,速度快

缺点:

  • 需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from sklearn.datasets import load_iris, fetch_20newsgroups, load_boston
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.ensemble import RandomForestClassifier
import pandas as pd

ef naviebayes():
"""
朴素贝叶斯进行文本分类
:return: None
"""
news = fetch_20newsgroups(subset='all')

# 进行数据分割
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)

# 对数据集进行特征抽取
tf = TfidfVectorizer()

# 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
x_train = tf.fit_transform(x_train)

print(tf.get_feature_names())

x_test = tf.transform(x_test)

# 进行朴素贝叶斯算法的预测
mlt = MultinomialNB(alpha=1.0)

print(x_train.toarray())

mlt.fit(x_train, y_train)

y_predict = mlt.predict(x_test)

print("预测的文章类别为:", y_predict)

# 得出准确率
print("准确率为:", mlt.score(x_test, y_test))

print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names))

return None
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2020 WuXei Si
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信