分类算法----朴素贝叶斯算法
贝叶斯公式:
计算方法:𝑃𝐹1𝐶=𝑁𝑖/𝑁方法:P(F1│C)=Ni/N (训练文档中去计算)
𝑁𝑖为该𝐹1词Ni为该F1词在C类别所有文档中出现的次数
N为所属类别C下的文档所有词出现的次数和
例如:求一篇文章是属于科技还是属于娱乐,分别求他的朴素贝叶斯值进行判别属于哪一类别:
特征\统计 |
科技 |
娱乐 |
汇总(求和) |
“影院” |
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:
算法:
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()
模型的原因导致预测效果不佳。