活用西瓜书——sklearn包中的朴素贝叶斯分类器

发布时间:2024-03-15 16:01

引言

最近在读西瓜书,查阅了多方资料,恶补了数值代数、统计概率和线代,总算是勉强看懂了西瓜书中的公式推导。但是知道了公式以后还是要学会应用的,几经摸索发现python下的sklearn包把机器学习中经典的算法都封装好了,因此,打算写几篇博客记录一下sklearn包下的常用学习算法的使用,防止自己以后忘了,嘿嘿。

1.朴素贝叶斯

朴素贝叶斯算法可以说是机器学习中的经点算法了。它采用了概率论中的贝叶斯学派的观点,使用条件概率的理论来导出并最小化误分类的概率。
在一个分类问题中,不论总类别数的多少,一共有两种分类结果,即分类正确或者分类错误。我们使用贝叶斯学派的理论,认为分类错误是在“已知样本属性,把样本分在了错误的类别”,这是个条件概率的问题,即认为条件风险为:R(c|x),我们研究分类问题,即研究最小化条件风险的问题: h ∗ = a r g m i n R ( c ∣ x ) h^*=argminR(c|x) h=argminR(cx),我们称 h ∗ h^* h为贝叶斯最优分类器。
接下来,我们再对R(c|x)做变形: R ( c i ∣ x ) = ∑ j = 1 N λ i j P ( c j ∣ x ) R(c_i|x)=\sum_{j=1}^{N} λ_ij P(c_j|x) R(cix)=j=1NλijP(cjx),其中,仅当i=j时才是分类正确,否则分类错误,即i=j时 λ i j λ_ij λij为0,否则 λ i j λ_ij λij为1,由于每个样本只能属于一类,所以显然 λ i j λ_ij λij只有一项等于0,其余全是1,于是条件风险变为: R ( c i ∣ x ) = 1 − P ( c i ∣ x ) R(c_i|x)=1-P(c_i|x) R(cix)=1P(cix).接下来我们就可以使用最大似然法来得到相关参数的最优值。结合样本的相关分布,我们就能得到最小化条件损失,以达到正确分类的目的。由于详细的推导篇幅很长,不是本文的重点,所以在此略去。总而言之,贝叶斯分类器的工作流程为:

  1. 得到条件损失公式。
  2. 由条件损失公式得到待优化问题: a r g m a x P ( c ) P ( x ∣ c ) argmaxP(c)P(x|c) argmaxP(c)P(xc)
  3. 假设x属性之间相互独立来简化问题: a r g m a x P ( c ) ∏ i = 1 d P ( x i ∣ c ) argmaxP(c)\prod_{i=1}^{d}P(x_i|c) argmaxP(c)i=1dP(xic),(d是属性规模)。
  4. 由大数定律来估计P©,假设P(x|c)服从某种分布(如正态分布)便可由极大似然估计法求出正态分布率中的参数。
  5. 将P©与P(x_i|c)代入3中的优化问题,得出最优分类。

2.sklearn下的贝叶斯分类器

sklearn模块为我们封装好了贝叶斯分类器算法。sklearn.naive_bayes下有三个分类器:GaussianNB是假设样本服从正态分布(以高斯分布为先验分布),Multinomial使用多项式分布为先验分布,BernoulliNB使用伯努利分布为先验分布。如果样本的属性是连续的,我们推荐使用GaussianNB,在属性是离散值时推荐使用Multinomial或者BernoulliNB,实际应用时我们可以结合三种分布的特性来进行分类器的选择。分类器的使用非常简单,接下来我们还以iris数据集为例来测试贝叶斯分类器的分类效果。

代码演示

#本代码使用sklearn包下的朴素贝叶斯分类器完成对iris数据集的分类
from sklearn import datasets
from pandas import DataFrame
import pandas as pd
import  numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB#这种分类器使用高斯分布为先验分布
from sklearn.naive_bayes import MultinomialNB#这种分类器使用多项式分布为先验分布
from sklearn.naive_bayes import BernoulliNB#这种分类器使用伯努利分布为先验分布
iris=datasets.load_iris()
df=DataFrame(iris.data,columns=iris.feature_names)
pd.set_option('display.width',None)
df['target']=list(iris.target)
# print(df)
X=df.iloc[:,0:4].values
Y=df.iloc[:,4].values
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.3,random_state=0)#划分测试集与训练集
sc=StandardScaler()
sc.fit(X)
standard_train=sc.transform(X_train)
standard_test=sc.transform(X_test)
#由于iris的属性是连续值,我们优先使用正态分布作为先验分布,即使用GaussianNB
GaussianClassifier=GaussianNB()
GaussianClassifier.fit(standard_train,Y_train)
result=GaussianClassifier.predict(standard_test)
print("测试集合的y值:",list(Y_test))
print("高斯先验朴素贝叶斯预测的的y值:",list(result))
print("预测的正确率为:",GaussianClassifier.score(standard_test,Y_test))
# 我们顺带着测试多项式分布作为先验分布的分类器(实测发现,多项式分布中自变量不允许出现负数,所以不能使用标准化的数据,只能使用原数据)
mc=MultinomialNB()
mc.fit(X_train,Y_train)
result=mc.predict(X_test)
print("测试集合的y值:",list(Y_test))
print("多项式先验朴素贝叶斯预测的的y值:",list(result))
print("预测的正确率为:",GaussianClassifier.score(X_test,Y_test))
#测试伯努利分布作为先验分布的分类器
bc=BernoulliNB()
bc.fit(standard_train,Y_train)
result=bc.predict(standard_test)
print("测试集合的y值:",list(Y_test))
print("伯努利先验朴素贝叶斯预测的的y值:",list(result))
print("预测的正确率为:",GaussianClassifier.score(standard_test,Y_test))

运行结果:
活用西瓜书——sklearn包中的朴素贝叶斯分类器_第1张图片由性结果可知,GaussianNB分类器和BernoulliNB分类器在测试集上都达到了百分百的预测准确率(当然,达到百分百是因为数据集还是太小,但是也说明效果确实不错),但是由于样本的属性是连续的,所以Multinomial的预测结果不理想,在属性离散时可以选用这个分类器,效果还是不错的。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号