贝叶斯分类是一种统计学分类方法,基于贝叶斯定理,对给定的数据集进行分类。
它的历史可以追溯到18世纪,当时英国统计学家托马斯·贝叶斯发展了贝叶斯定理,这个定理为统计决策提供了理论基础。
不过,贝叶斯分类在实际应用中的广泛使用是在20世纪80年代,当时计算机技术的进步使得大规模数据处理成为可能。
贝叶斯分类基于贝叶斯公式,通过已知样本信息来计算未知样本属于各个类别的概率,然后选择概率最大的类别作为未知样本的分类结果。
贝叶斯公式的简化公式:\(P(A|B) = \frac{P(B|A)P(A)}{P(B)}\)
其中:
贝叶斯分类就是基于这个公式扩展而来。
比如,一个具有\(n\)个特征的样本\(x = (x_1, x_2, ..., x_n)\),该样本属于K个可能的类别\(y_1,y_2,...,y_k\)。
那么,任一个样本\(x\)属于某个类别\(y_k\)的概率为:\(P(y_k|x) = \frac{P(X|y_k)P(y_k)}{P(x)}\)
根据这个模型,训练样本之后,就可以根据模型来预测某个样本属于哪个类别的概率最大。
这里讨论的贝叶斯分类算法,并没有考虑特征之间的关联关系,我们假设每个特征之间是相互独立的。
所以,这个算法也叫做朴素贝叶斯分类。
贝叶斯分类可以
这次用scikit-learn
中的样本生成器make_classification
来生成分类用的样本数据。
import matplotlib.pyplot as plt from sklearn.datasets import make_classification # 分类数据的样本生成器 X, y= make_classification(n_samples=1000, n_classes=4, n_informative=3) plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25) plt.show()
关于样本生成器的详细内容,请参考:TODO
训练之前,为了减少算法误差,先对数据进行标准化处理(将数据缩放到0~100
之间)。
from sklearn import preprocessing as pp # 数据标准化 X = pp.minmax_scale(X, feature_range=(1, 100)) y = pp.minmax_scale(y, feature_range=(1, 100))
然后,分割训练集和测试集。
from sklearn.model_selection import train_test_split # 分割训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
按照8:2的比例来划分训练集和测试集。
scikit-learn
中的朴素贝叶斯算法支持多种不同的分类器,
这些分类器基于不同的先验概率分布,适用于不同的数据类型和问题场景。
我们训练模型的时候要根据数据情况选择合适的分类器。
from sklearn.naive_bayes import ( GaussianNB, MultinomialNB, ComplementNB, BernoulliNB, CategoricalNB, ) reg_names = [ "高斯朴素贝叶斯", "多项式朴素贝叶斯", "补码朴素贝叶斯", "伯努利朴素贝叶斯", "分类朴素贝叶斯", ] # 定义 regs = [ GaussianNB(), MultinomialNB(), ComplementNB(), BernoulliNB(), CategoricalNB(min_categories=101), ] # 训练模型 for reg in regs: reg.fit(X_train, y_train)
各个分类器的简要说明:
最后验证各个分类器的模型的训练效果:
# 在测试集上进行预测 y_preds = [] for reg in regs: y_pred = reg.predict(X_test) y_preds.append(y_pred) for i in range(len(y_preds)): correct_pred = np.sum(y_preds[i] == y_test) print("【{}】 预测正确率:{:.2f}%".format(reg_names[i], correct_pred / len(y_pred) * 100)) # 运行结果 【高斯朴素贝叶斯】 预测正确率:82.50% 【多项式朴素贝叶斯】 预测正确率:75.00% 【补码朴素贝叶斯】 预测正确率:72.50% 【伯努利朴素贝叶斯】 预测正确率:22.00% 【分类朴素贝叶斯】 预测正确率:50.50%
这里虽然高斯朴素贝叶斯分类器的正确率最高,但不能就认为这种分类器是最好的。
只能说明高斯朴素贝叶斯分类器最适合分类上面随机生成的样本数据。
换成其他的样本数据,高斯朴素贝叶斯分类器的正确率就不一定是最高的了。
总的来说,贝叶斯分类是一种有效的分类方法,适用于对未知样本进行分类的问题。
它的应用范围广泛,可以处理多分类问题,也可以用于连续变量的分类。
贝叶斯分类算法的主要优势在于:
贝叶斯分类算法也有其不足之处: