机器学习十大经典算法之朴素贝叶斯(学习笔记整理)

一、算法概述

朴素贝叶斯分类器是基于概率论的分类模型,其思想是先计算样本的先验概率,然后利用贝叶斯公式测算未知样本属于某个类别的后验概率,最终以最大后验概率对应的类别作为未知样本的预测类别。之所以叫"朴素",是因为整个形式化过程只做最简单、最原始的假设。

优点:运算简单高效,分类效率稳定,对缺失值和异常值不太敏感
缺点:对输入数据的方式比较敏感,模型的前提条件在实际中很难满足
适用数据类型:标称型数据

二、理论基础

1.条件概率公式: P ( B ∣ A ) = P ( A B ) P ( A ) P(B|A)=\frac{P(AB)}{P(A)} P(BA)=P(A)P(AB)
2.全概率公式: P ( A ) = ∑ i = 1 n P ( A B i ) = ∑ i = 1 n P ( B i ) P ( A ∣ B i ) P(A)=\sum_{i=1}^{n}{P(AB_i)}=\sum_{i=1}^{n}{P(B_i)P(A|B_i)} P(A)=i=1nP(ABi)=i=1nP(Bi)P(ABi)
3.由条件概率公式可以得到概率的乘法公式: P ( A B ) = P ( A ) P ( B ∣ A ) = P ( B ) P ( A ∣ B ) P(AB)=P(A)P(B|A)=P(B)P(A|B) P(AB)=P(A)P(BA)=P(B)P(AB)进而可以推导出贝叶斯公式: P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B)=\frac{P(B|A)P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)贝叶斯公式描述了先验概率和后验概率两个条件概率之间的关系,是贝叶斯分类器的理论基础。
4.贝叶斯分类器的核心是计算在已知X的情况下,样本属于某个类别的概率,即: P ( C i ∣ X ) = P ( C i X ) P ( X ) = P ( C i ) P ( X ∣ C i ) ∑ i = 1 k P ( C i ) P ( X ∣ C i ) P(C_i|X)=\frac{P(C_iX)}{P(X)}=\frac{P(C_i)P(X|C_i)}{\sum_{i=1}^{k}{P(C_i)P(X|C_i)}} P(CiX)=P(X)P(CiX)=i=1kP(Ci)P(XCi)P(Ci)P(XCi)其中Ci表示样本所属的某个类别,因变量一共包含k个类别。由于分母 ∑ i = 1 k P ( C i ) P ( X ∣ C i ) {\sum_{i=1}^{k}{P(C_i)P(X|C_i)}} i=1kP(Ci)P(XCi)是常量,P(Ci)一般以Ci的频率代替,所以计算概率的最大值就变成了计算P(X|Ci)的最大值。假设一共有p个自变量,则 P ( X ∣ C i ) = P ( x 1 , x 2 , . . . , x p ∣ C i ) P(X|C_i)=P(x_1,x_2,...,x_p|C_i) P(XCi)=P(x1,x2,...,xpCi)显然条件联合概率值的计算在p较大时是很复杂的,为了提高分类器的运算速度,提出了一个假设前提,即自变量是相互独立的,于是 P ( x 1 , x 2 , . . . , x p ∣ C i ) = P ( x 1 ∣ C i ) P ( x 2 ∣ C i ) . . . P ( x p ∣ C i ) P(x_1,x_2,...,x_p|C_i)=P(x_1|C_i)P(x_2|C_i)...P(x_p|C_i) P(x1,x2,...,xpCi)=P(x1Ci)P(x2Ci)...P(xpCi)在实际运用中是很难满足这个假设条件的,所以自变量之间的独立性越强,贝叶斯分类器的效果就越好。

三、常用贝叶斯分类器

1.高斯贝叶斯分类器

适用条件:自变量X均为连续的数值型
假设条件:自变量X服从高斯正态分布
自变量X的条件概率 P ( x j ∣ C i ) = 1 2 π σ j i e x p ( − ( x j − μ j i ) 2 2 σ j i 2 ) P(x_j|C_i)=\frac{1}{\sqrt{2\pi}\sigma_{ji}}exp(-\frac{(x_j-\mu_{ji})^2}{2\sigma_{ji}^2}) P(xjCi)=2π σji1exp(2σji2(xjμji)2)其中xj为第j个自变量的取值, μ j i \mu_{ji} μji为训练集中自变量xj属于类别Ci的均值, σ j i \sigma_{ji} σji为训练集中自变量xj属于类别Ci的标准差。

2.多项式贝叶斯分类器

适用条件:自变量X均为离散型变量
假设条件:自变量X的条件概率服从多项式分布
自变量X的条件概率 P ( x j = x j k ∣ C i ) = N i k + α N i + n α P(x_j=x_{jk}|C_i)=\frac{N_{ik}+\alpha}{N_i+n\alpha} P(xj=xjkCi)=Ni+nαNik+α其中xjk为自变量xj的第k个取值,Nik表示因变量为类别Ci时自变量xj取值xjk的样本个数,Ni为类别Ci的样本个数, α \alpha α为平滑系数(防止条件概率等于0,通常取1)。

3.伯努利贝叶斯分类器

适用条件:自变量X均为0-1二元变量
假设条件:自变量X的条件概率服从伯努利分布
自变量X的条件概率 P ( x j ∣ C i ) = p x j + ( 1 − p ) ( 1 − x j ) P(x_j|C_i)=px_j+(1-p)(1-x_j) P(xjCi)=pxj+(1p)(1xj)其中xj为第j个自变量,其取值为0或1;p表示类别为Ci时自变量取1的概率,可以用经验频率代替 p = P ( x j = 1 ∣ C i ) = N i 1 + α N i + n α p=P(x_j=1|C_i)=\frac{N_{i1}+\alpha}{N_{i}+n\alpha} p=P(xj=1Ci)=Ni+nαNi1+αNi1表示在类别Ci时自变量xj取1的样本量。

四、代码实现

1.高斯贝叶斯分类器

import pandas as pd
from sklearn import model_selection,naive_bayes,metrics
import matplotlib.pyplot as plt

data=pd.read_excel(r'C:\Users\Administrator\Desktop\Skin_Segment.xlsx')
#拆分为训练集和测试集
#设置正例和负例,便于后面画ROC曲线
data.y=data.y.map({2:0,1:1})
x_train,x_test,y_train,y_test=model_selection.train_test_split(data.iloc[:,:3],data.y,
                                                               test_size=0.25,random_state=1234)
#调用高斯朴素贝叶斯
gnb=naive_bayes.GaussianNB()
gnb.fit(x_train,y_train)
gnb_pred=gnb.predict(x_test)
#显示预测结果,各类别的预测数量
print('prediction:\n',pd.Series(gnb_pred).value_counts())

#模型检验
print('模型的准确率为:',metrics.accuracy_score(y_test,gnb_pred))
print('模型的评估报告:\n',metrics.classification_report(y_test,gnb_pred))
#绘制ROC曲线
y_score=gnb.predict_proba(x_test)[:,1]
fpr,tpr,threshold=metrics.roc_curve(y_test,y_score)
roc_auc=metrics.auc(fpr,tpr)
plt.stackplot(fpr,tpr,color='steelblue',alpha=0.5,edgecolor='black')
plt.plot(fpr,tpr,color='black',lw=1)
plt.plot([0,1],[0,1],color='red',linestyle='--')
plt.text(0.5,0.3,'ROC Curve (area=%0.2f)' % roc_auc)
plt.xlabel('l-Specificity')
plt.ylabel('Sensitivity')
plt.show()

2.多项式贝叶斯分类器

import pandas as pd
from sklearn import model_selection,naive_bayes,metrics
import matplotlib.pyplot as plt

data=pd.read_csv(r'C:\Users\Administrator\Desktop\mushrooms.csv')
#使用factorize函数将字符型数据做因子化处理,将其转换为整数型数据
#factorize函数返回的是两个元素的元组,第一个元素为转换成的数值,第二个元素为数值对应的字符水平
columns=data.columns[1:]
for column in columns:
    data[column]=pd.factorize(data[column])[0]

#拆分为训练集和测试集
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[columns],data.type,
                                                               test_size=0.25,random_state=1234)
#调用多项式朴素贝叶斯
mnb=naive_bayes.MultinomialNB()
mnb.fit(x_train,y_train)
mnb_pred=mnb.predict(x_test)
#显示预测结果,各类别的预测数量

#模型检验
print('模型的准确率为:',metrics.accuracy_score(y_test,mnb_pred))
print('模型的评估报告:\n',metrics.classification_report(y_test,mnb_pred))
#绘制ROC曲线
y_score=mnb.predict_proba(x_test)[:,1]
fpr,tpr,threshold=metrics.roc_curve(y_test.map({'edible':0,'poisonous':1}),y_score)
roc_auc=metrics.auc(fpr,tpr)
plt.stackplot(fpr,tpr,color='steelblue',alpha=0.5,edgecolor='black')
plt.plot(fpr,tpr,color='black',lw=1)
plt.plot([0,1],[0,1],color='red',linestyle='--')
plt.text(0.5,0.3,'ROC Curve (area=%0.2f)' % roc_auc)
plt.xlabel('l-Specificity')
plt.ylabel('Sensitivity')
plt.show()

3.伯努利贝叶斯分类器

import pandas as pd
from sklearn import model_selection,naive_bayes,metrics
from sklearn.feature_extraction.text import CountVectorizer
import matplotlib.pyplot as plt
import jieba

data=pd.read_excel(r'C:\Users\Administrator\Desktop\Contents.xlsx')
#数据清洗
data.Content=data.Content.str.replace('[0-9a-zA-Z]','')

#加载自定义词库
jieba.load_userdict(r'C:\Users\Administrator\Desktop\all_words.txt')
#读入停用词
with open(r'C:\Users\Administrator\Desktop\mystopwords.txt',encoding='utf-8') as words:
    stop_words=[i.strip() for i in words.readlines()]
#构造切词的自定义函数,在切词过程中删除停用词
def cut_word(centence):
    words=[i for i in jieba.lcut(centence) if i not in stop_words]
    result=' '.join(words)
    return(result)
#调用函数切词
words=data.Content.apply(cut_word)

#计算每个词出现的次数,并将稀疏度99%以上的词删除
counts=CountVectorizer(min_df=0.01)
#文档词条矩阵
dtm_counts=counts.fit_transform(words).toarray()
#文档的列名称
columns=counts.get_feature_names()
#形成x变量,y变量
x=pd.DataFrame(dtm_counts,columns=columns)
y=data.Type

#拆分为训练集和测试集
x_train,x_test,y_train,y_test=model_selection.train_test_split(x,y,test_size=0.25,random_state=1234)
#调用伯努利朴素贝叶斯
bnb=naive_bayes.BernoulliNB()
bnb.fit(x_train,y_train)
bnb_pred=bnb.predict(x_test)
#显示预测结果,各类别的预测数量

#模型检验
print('模型的准确率为:',metrics.accuracy_score(y_test,bnb_pred))
print('模型的评估报告:\n',metrics.classification_report(y_test,bnb_pred))
#绘制ROC曲线
y_score=bnb.predict_proba(x_test)[:,1]
fpr,tpr,threshold=metrics.roc_curve(y_test.map({'Negative':0,'Positive':1}),y_score)
roc_auc=metrics.auc(fpr,tpr)
plt.stackplot(fpr,tpr,color='steelblue',alpha=0.5,edgecolor='black')
plt.plot(fpr,tpr,color='black',lw=1)
plt.plot([0,1],[0,1],color='red',linestyle='--')
plt.text(0.5,0.3,'ROC Curve (area=%0.2f)' % roc_auc)
plt.xlabel('l-Specificity')
plt.ylabel('Sensitivity')
plt.show()

参考文献:
[1]Peter Harrington.《机器学习实战》.人民邮电出版社,2013-6
[2]刘顺祥.《从零开始学Python数据分析与挖掘》.清华大学出版社,2018

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值