朴素贝叶斯基础学习

朴素贝叶斯

联合概率和条件概率:
1.联合概率:
联合概率是包含多个条件,且所有的条件同时成立的概率。这种概率计算的方式有专门的公式,记作P(AB),其中P(A)表示A这个特征出现的概率,同理P(B)也是,在特征条件独立的情况下存在公式P(AB)=P(A)*P(B) 。

2.条件概率:
条件概率就是事件A在另外一个事件B已经发生的前提下发生的概率。(事件B已经发生的前提下,就是此时B作为全集)计算的公式为: P(A|B) ,如果有多个条件,那记作P(A1,A2|B)=P(A1|B)P(A2|B) 。

注意:以上的计算公式,是在以各个特征是条件独立的基础之上才成立的!(朴素就是条件之间没有任何关联)

朴素贝叶斯公式:
P(A|B)=P(B|A)P(A) / P(B) 等价于 P(A|B)P(B)=P(B|A)P(A)

因为在概率论中有一个乘法定理(已知条件)
P(AB) = P(A|B)*P(B)
这个公式同样适合B在A条件下发生的概率,因此:
P(AB) = P(B|A)*P(A)
以上两个等式相等,所以
P(A|B) = P(B|A)*P(A)/P(B)

文档分类:

一般朴素贝叶斯经常用到文档分类上,文档分类是根据已经分类的文档中提取关键词,在以后遇到新的文档分类的时候,就从这些关键词中预测是属于哪个类别。在文档分类中可以把贝叶斯公式改成以下:
P(C|W)= (W|C)P(C) / P(W)
等价于
P(C|W)P(W)=P(W|C)P(C)
针对每个进行一个讲解:
1. P(C|W) : 某个关键词属于某个分类的概率。
2. P(W|C) : 某个分类下,某个关键词出现的概率。
3. P(C ): 某个类别的概率(某个类别的文档个数/总文档数)。
4. P(W) : 这个关键词在需要预测的文档中出现的概率。
朴素贝叶斯预测文档分类的原理是:根据以上公式,可以计算出某篇文档下出现得比较多的词,然后把这些词去每个分类下求下概率,在哪个分类下的概率高,那么就意味着这篇文章是属于哪个分类。

拉普拉斯平滑系数:

因此为了避免出现概率为0的情况,可以使用拉普拉斯系数,以为关键词可能为0,这样计算出来的概率为0,严重影响了分类效果, 因此使用拉普拉斯平滑系数: 将P(W|C)改为如下: P(W|C)=(Ni+a)/(N+am)
其中:
1. Ni为该W词在C类别所有文档中出现的次数。
2. N为所属类别C下的文档所有词出现的次数和。
3. a就是为指定的系数,a一般为1.
4. m为训练文档中统计出的特征词个数。
(该过程使得P(W|C)不为0,一般会是一个很小的数,可能会是1/(N+am),不会影响最终的结果)
这样计算出来虽然结果稍微有些不同,但是不会影响每个词对文档分类的概率大小,大小没改变,那么分类结果也不公被改变。

from sklearn.feature_extraction.text import CountVectorizer
word1='I love python,it makes me succeed,it'
word2='life is short,I need python,python'
vect=CountVectorizer()
words=vect.fit_transform([word1,word2])
names=vect.get_feature_names()
print(names)    #  ['is', 'it', 'life', 'love', 'makes', 'me', 'need', 'python', 'short', 'succeed']
print(words.toarray())  #  [[0 2 0 1 1 1 0 1 0 1]    word1根据 names 中抽取的单词出现的次数
                        #   [1 0 1 0 0 0 1 2 1 0]]   word2 
print(type(words))  # sparse矩阵    稀疏矩阵
['is', 'it', 'life', 'love', 'makes', 'me', 'need', 'python', 'short', 'succeed']
[[0 2 0 1 1 1 0 1 0 1]
 [1 0 1 0 0 0 1 2 1 0]]
<class 'scipy.sparse.csr.csr_matrix'>
# 文本分类实现
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB   # 朴素贝叶斯中的多项式模型 MultinomialNB   
newsgroup=fetch_20newsgroups(data_home='./newsgroup.csv')
newsgroup.target_names
['alt.atheism',
 'comp.graphics',
 'comp.os.ms-windows.misc',
 'comp.sys.ibm.pc.hardware',
 'comp.sys.mac.hardware',
 'comp.windows.x',
 'misc.forsale',
 'rec.autos',
 'rec.motorcycles',
 'rec.sport.baseball',
 'rec.sport.hockey',
 'sci.crypt',
 'sci.electronics',
 'sci.med',
 'sci.space',
 'soc.religion.christian',
 'talk.politics.guns',
 'talk.politics.mideast',
 'talk.politics.misc',
 'talk.religion.misc']
X_train,X_test,y_train,y_test=train_test_split(newsgroup.data,newsgroup.target,test_size=0.25)
news_vect=CountVectorizer()
# fit_transform : fit是提取特征,transform是转化为稀疏矩阵
X_train=news_vect.fit_transform(X_train)  # 把X_train文本数据转换为X_train稀疏矩阵
X_test=news_vect.transform(X_test)  # 不需要再fit,上一步已经提取
nb=MultinomialNB()
nb.fit(X_train,y_train)   # 只需要提取训练集的特征值,不需要训练
nb.score(X_test,y_test)   # 0.8303287380699894
0.8282078472958643

朴素贝叶斯模型:

针对不同的数据,我们有不同的朴素贝叶斯模型来进行分类。如果特征是离散型数据,比如文本这些,那么推荐使用多项式模型来实现;如果特征是连续型数据,比如具体的数字,那么推荐使用高斯模型实现:如果特征是连续型数据并且值只有0和1两种情况,那么推荐使用伯努利模型。虽然模型不同,但是原理都是朴素贝叶斯公式,只不过不同的模型,在计算概率的时候采用的方式不一样,比如高斯模型,那么是通过高斯分布函数来计算而已。

# 心脏病数据集,连续数据使用高斯函数(根据特征值选择合适的模型)
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
import pandas as pd
heart=pd.read_csv('heart.csv')
heart.head()
agesexcptrestbpscholfbsrestecgthalachexangoldpeakslopecathaltarget
063131452331015002.30011
137121302500118703.50021
241011302040017201.42021
356111202360117800.82021
457001203540116310.62021
features=heart.drop(columns=['target'],axis=0)
targets=heart['target']
X_train,X_test,y_train,y_test=train_test_split(features,targets,test_size=0.25)
gus=GaussianNB()
gus.fit(X_train,y_train)
gus.score(X_test,y_test)  # 0.8289473684210527 
0.8289473684210527
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值