机器学习:朴素贝叶斯算法对新闻分类

概率基础

概率定义:一件事情发生的可能性

1、联合概率
包含多个条件,且所有条件同时成立的概率
记作: P ( A , B ) = P ( A ) P ( B ) P(A, B) = P(A)P(B) P(A,B)=P(A)P(B)

2、条件概率
事件A在另一个事件B已经发生的条件下发生的概率
记作: P ( A ∣ B ) P(A|B) P(AB)
特性: P ( A 1 , A 2 ∣ B ) = P ( A 1 ∣ B ) P ( A 2 ∣ B ) P(A1, A2|B) = P(A1|B)P(A2|B) P(A1,A2B)=P(A1B)P(A2B)
注意:此条件概率的成立,是由于A1,A2相互独立的结果

朴素贝叶斯

特征独立

贝叶斯公式
P ( C ∣ W ) = P ( W ∣ C ) P ( C ) P ( W ) P(C|W) = \frac{P(W|C)P(C)}{P(W)} P(CW)=P(W)P(WC)P(C)

=> P ( C ∣ W ) P ( W ) = P ( W ∣ C ) P ( C ) P(C|W)P(W) = P(W|C)P(C) P(CW)P(W)=P(WC)P(C)

说明:
W为给定文档的特征值(频数统计,预测文档提供)
C为文档类别

公式理解为:
P ( C ∣ F 1 , F 2... ) = P ( F 1 , F 2... ∣ C ) P ( C ) P ( F 1 , F 2... ) P(C|F1,F2...) = \frac{P(F1,F2...|C)P(C)}{P(F1,F2...)} P(CF1,F2...)=P(F1,F2...)P(F1,F2...C)P(C)

公式分为三个部分
P ( C ) P(C) P(C) 每个文档类别的概率(某文档类别数/总文档数量)
P ( W ∣ C ) P(W|C) P(WC) 给定类别下特征(被预测文档中出现的词)的概率

计算方法: P ( F 1 ∣ C ) = N i / N P(F1|C) = Ni/N P(F1C)=Ni/N
Ni 为该F1词在C类别所有文档中出现的次数
N 为所属类别C下的文档所有词出现的次数和

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

举例:

训练集统计结果

特征  科技类(30)  娱乐类(60)  汇总(90)
商场    9           51          60
影院    8           56          64
支付宝  20          15          35
云计算  63          0           63
汇总    100         121         221

现有预测文档,出现词汇:影院支付宝云计算
计算属于科技,娱乐的类别概率

P(科技|影院,支付宝,云计算) 
= P(影院,支付宝,云计算|科技)P(科技)
= P(影院|科技)P(支付宝|科技)P(云计算|科技)P(科技)
= (8/100)(20/100)(63/100)(30/90)
= 0.0034


P(娱乐|影院,支付宝,云计算) 
= P(影院,支付宝,云计算|娱乐)P(娱乐)
= P(影院|娱乐)P(支付宝|娱乐)P(云计算|娱乐)P(娱乐)
= (56/121)(15/121)(0/121)(60/90)
= 0

娱乐的概率为0,这是不合理的

改进方法

拉普拉斯平滑系数
P(F1|C) = (Ni + a)/(N + am)
a为指定的系数,一般为1
m为训练文档中统计出的特征词个数
作用:防止分类概率为0

改进计算

P(科技|影院,支付宝,云计算) 
= ((8+1)/(100+1*4))*((20+1)/(100+1*4))*((63+1)/(100+1*4))*(30/90)
= 0.0036


P(娱乐|影院,支付宝,云计算) 
= ((56+1)/(121+1*4))*((15+1)/(121+1*4))*((0+1)/(121+1*4))*(60/90)
= 0.0003

新闻分类

20newsgroups 数据集下载地址:
http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz

如果直接拷贝pkl文件,需要注意python版本

代码示例

# -*- coding: utf-8 -*-

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

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

# 如果获取不到就下载
data = fetch_20newsgroups(subset="all")

# 数据分割
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.33, random_state=42
)

# 特征抽取
tfidf = TfidfVectorizer()

# 以训练集中的词列表对每篇文章做重要性统计
X_train = tfidf.fit_transform(X_train)
print(tfidf.get_feature_names())

X_test = tfidf.transform(X_test)

# 朴素贝叶斯算法预测,alpha是拉普拉斯平滑系数
mlt = MultinomialNB(alpha=1.0)
mlt.fit(X_train, y_train)
score = mlt.score(X_test, y_test)
print("socre: {}".format(score))
# socre: 0.83

特点:
训练误差大,结果肯定不好
不需要调参

优点:
1、朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率
2、对缺失数据不太敏感,算法也比较简单,常用于文本分类
3、分类准确度高,速度快

缺点:
假设文章中一些词语和另一些词语是独立关系,不太靠谱
由于使用了样本属性独立性的假设,所以样本属性有关联时,效果不好
训练集中进行统计词,会对结果造成干扰

文本分类
-朴素贝叶斯
-神经网络(效果更好)

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值