sklearn 的 naive_bayes 模块提供了 3 种朴素贝叶斯算法,分别是高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯。这 3 种算法适用于不同的场景,应该根据特征变量的不同选择不同的算法。
- 高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,如人的身高、物体的长度。
- 多项式朴素贝叶斯:特征变量是离散变量,符合多项式分布。例如,在文档分类中,特征变量体现在一个单词出现的次数或者单词的 TF-IDF 值等。
- 伯努利朴素贝叶斯:特征变量是布尔变量,符合 0/1 分布,如在文档分类中特征是单词是否出现。
# 导入必要的库
import numpy as np
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
# 转换数据并划分
X ,Y= [],[]
fr = open("./knn.txt")
for line in fr.readlines():
line = line.strip().split()
X.append([int(line[0]),int(line[1])])
Y.append(int(line[-1]))
X=np.array(X) #转换成 NumPy 数组,X 是特征属性集
Y=np.array(Y)
train_X,test_X,train_y,test_y=train_test_split(X, Y, test_size=0.16)
# 是用模型进行预测
model = GaussianNB()
model.fit(train_X, train_y)
print(model) #输出模型的参数
expected = test_y #实际类别值
predicted = model.predict(test_X) #预测的类别值
print(metrics.classification_report(expected, predicted)) #输出分类信息
label = list(set(Y)) #去重复,得到标签类别
print(metrics.confusion_matrix(expected, predicted, labels=label))
GaussianNB()
precision recall f1-score support
2 1.00 1.00 1.00 1
3 1.00 1.00 1.00 1
accuracy 1.00 2
macro avg 1.00 1.00 1.00 2
weighted avg 1.00 1.00 1.00 2
[[0 0 0]
[0 1 0]
[0 0 1]]
# 分类结果可视化
import matplotlib as mpl
N, M = 90, 90 #网格采样点的个数
t1 = np.linspace(0, 25, N) #生成采样点的横坐标值
t2 = np.linspace(0,12, M) #生成采样点的纵坐标值
x1, x2 = np.meshgrid(t1, t2) #生成网格采样点
x_show = np.stack((x1.flat, x2.flat), axis=1) #将采样点作为测试点
y_show_hat = model.predict(x_show) # 预测值
y_show_hat = y_show_hat.reshape(x1.shape) # 使之与输入的形状相同
cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
plt.pcolormesh(x1, x2, y_show_hat, cmap=cm_light,alpha=0.8)
plt.scatter(train_X[train_y==1,0],train_X[train_y==1,1],color='red',marker='o')
plt.scatter(train_X[train_y==2,0],train_X[train_y==2,1],color='green',marker='x')
plt.scatter(train_X[train_y==3,0],train_X[train_y==3,1],color='blue',marker='d')
plt.show()