发布时间:2024-03-15 16:01
最近在读西瓜书,查阅了多方资料,恶补了数值代数、统计概率和线代,总算是勉强看懂了西瓜书中的公式推导。但是知道了公式以后还是要学会应用的,几经摸索发现python下的sklearn包把机器学习中经典的算法都封装好了,因此,打算写几篇博客记录一下sklearn包下的常用学习算法的使用,防止自己以后忘了,嘿嘿。
朴素贝叶斯算法可以说是机器学习中的经点算法了。它采用了概率论中的贝叶斯学派的观点,使用条件概率的理论来导出并最小化误分类的概率。
在一个分类问题中,不论总类别数的多少,一共有两种分类结果,即分类正确或者分类错误。我们使用贝叶斯学派的理论,认为分类错误是在“已知样本属性,把样本分在了错误的类别”,这是个条件概率的问题,即认为条件风险为:R(c|x),我们研究分类问题,即研究最小化条件风险的问题: h ∗ = a r g m i n R ( c ∣ x ) h^*=argminR(c|x) h∗=argminR(c∣x),我们称 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(ci∣x)=∑j=1NλijP(cj∣x),其中,仅当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(ci∣x)=1−P(ci∣x).接下来我们就可以使用最大似然法来得到相关参数的最优值。结合样本的相关分布,我们就能得到最小化条件损失,以达到正确分类的目的。由于详细的推导篇幅很长,不是本文的重点,所以在此略去。总而言之,贝叶斯分类器的工作流程为:
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))
运行结果:
由性结果可知,GaussianNB分类器和BernoulliNB分类器在测试集上都达到了百分百的预测准确率(当然,达到百分百是因为数据集还是太小,但是也说明效果确实不错),但是由于样本的属性是连续的,所以Multinomial的预测结果不理想,在属性离散时可以选用这个分类器,效果还是不错的。
OceanBase 3.2.3 发版|HTAP引擎全面升级,TPC-H性能10倍提升~
Java项目:校园宿舍管理系统(java+Springboot+Vue+maven+redis+Mysql)
Matching Networks for One Shot Learning 论文笔记
美股数据获取 python_几行Python代码,轻松获取美股阿里巴巴的交易数据
MATLAB机械臂轨迹规划:在关节空间中生成多项式轨迹以及 jtraj函数(内容超详细讲解)
ruby on rails_Ruby on Rails快速创新性能的终极指南