简介
笔者将自己编写的分类器代码封装在naive_bayes.py中,详见原理篇,也可在github下载源码。
scikit-learn包中提供了三种常用的朴素贝叶斯算法:
下文实验中用的是高斯朴素贝叶斯,主要应用于数值型特征;
另外两种为多项式朴素贝叶斯、伯努利朴素贝叶斯,主要应用于文本分类。
关于朴素贝叶斯在文本分类的应用,可阅读参考
手写完成朴素贝叶斯分类器进行文本分类
使用sklearn自带的朴素贝叶斯分类器进行文本分类
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB
例4.1
详见原理篇
import naive_bayes as na
import numpy as np
path=r'E:\PYproject\data\eg4.1.xlsx'
data=na.load_excel(path)
data=np.array(data)
X_data=data[:,:-1]
y_data=data[:,-1]
x=np.array([2,'S'])
#调用自己编写的库
clf=na.naiveBayes(lambda_=1)
clf.fit(X_data,y_data)
result1=clf.predict(x)
print('result1: ',result1)
#调用sklearn库
from sklearn.naive_bayes import GaussianNB
clf2=GaussianNB()
clf2.fit(X_data,y_data)
result2=clf2.predict(x)
print('result2: ',result2)
结果展示
调用笔者自己编写的库可正确输出结果 ,而调用sklearn库中的朴素贝叶斯算法报错TypeError。
sklearn库中的高斯朴素贝叶斯算法只能对数值型数据进行处理,不能处理字符型数据。
例4.1——修改训练数据
import numpy as np
data = np.array([[1, 0, -1], [1, 1, -1], [1, 1, 1], [1, 0, 1],
[1, 0, -1], [2, 0, -1], [2, 1, -1], [2, 1, 1],
[2, 2, 1], [2, 2, 1], [3, 2, 1], [3, 1, 1],
[3, 1, 1], [3, 2, 1], [3, 2, -1]])
X_data=data[:,:-1]
y_data=data[:,-1]
x=np.array([2,0])
#调用自己编写的库
import naive_bayes as na
clf1=na.naiveBayes(lambda_=1)
clf1.fit(X_data,y_data)
result1=clf1.predict(x)
print('result1: ',result1)
#调用sklearn库
from sklearn.naive_bayes import GaussianNB
clf2=GaussianNB()
clf2.fit(X_data,y_data)
result2=clf2.predict(x.reshape(1,-1))
print('result2: ',result2)
结果展示
将
X
(
2
)
X^{(2)}
X(2)的字符型数据换成数值型数据后,二者都可输出正确结果。
iris数据集
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris=datasets.load_iris()
X_data=iris.data
y_data=iris.target
X_train,X_test,y_train,y_test=train_test_split(X_data,y_data,test_size=0.3)#测试集占总数据集的30%
#调用自己编写的库
import naive_bayes as na
clf1=na.naiveBayes(lambda_=1)
clf1.fit(X_data,y_data)
result1=clf1.predict(X_test)
print('result1: ',result1)
#调用sklearn库
from sklearn.naive_bayes import GaussianNB
clf2=GaussianNB()
clf2.fit(X_train,y_train)
result2=clf2.predict(X_test)
print('result2: ',result2)
#计算预测准确率
count1=0
for left,right in zip(result1,y_test):
if left==right:
count1+=1
print('accuracy1: ',count1/len(y_test))
count2=0
for left,right in zip(result2,y_test):
if left==right:
count2+=1
print('accuracy2: ',count2/len(y_test))
结果展示