朴素贝叶斯的原理
贝叶斯定理
- 贝叶斯定理:
其中:
- P(A|B)为B发生后A发生的概率即A的后验概率
P(A)为A发生的概率即A的先验概率
P(B|A)为A发生后B发生的概率即B的后验概率
P(B)为B发生的概率即B的先验概率
- 分类问题概率模型
- 概率模型分类器是一个条件概率模型
- 独立的类别变量C,条件依赖于若干特征变量
- 根据贝叶斯定理,得到
朴素贝叶斯概率模型
- 不关心分母,因为分母不依赖于类别变量C而且特征F是给定的,等价于
- 只需要关心分子即可
- 假定样本每个特征与其他特征都不相关(特征的独立性),即样本所包含的属性在判定其是否为某一类时的概率分布上是独立的
- 分子等价于
- 上式中的每一项都可以从训练样本中计算出,由此可以得到某个样本在每个类别对应的概率,从中取出最大概率的那个类就是其预测分类
朴素贝叶斯分类器的特征
朴素贝叶斯分类器一般具有以下特点
- 构建分类器的简单方法,不是训练分类器的单一算法,二十一系列基于相同原理的算法
- 尽管有着这些朴素思想和过于简单的假设,但朴素贝叶斯分类器在很多复杂的现实情况中仍能取得相当好的结果
- 根据特征分布的假设
- Gaussian Naive Bayes(高斯模型),适用于特征是连续的。
- Multinomial Naive Bayes(多项式模型),适用于特征是离散的。
- Bernoulli Naive Bayes(伯努利模型),适用于离散特征的情况,且每个特征的取值只能是1和0
使用朴素贝叶斯模型对鸢尾花数据进行分类并与kNN近邻算法以及决策树算法进行对比
数据预处理,划分训练集和测试集
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
print('特征名称:',iris.feature_names)
print('类别:',iris.target_names)
X = iris.data
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=1/4,random_state=0)
print('数据集样本数:{},训练样本数:{},测试集样本数:{}'.format(len(X),len(X_train),len(X_test)))
输出结果:
特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
类别: ['setosa' 'versicolor' 'virginica']
数据集样本数:150,训练样本数:112,测试集样本数:38
建立模型
knn_model = KNeighborsClassifier(n_neighbors=5)
dt_model = DecisionTreeClassifier(max_depth=5)
gnb_model = GaussianNB()
models = {
'kNN':knn_model,
'DT':dt_model,
'GNB':gnb_model
}
训练模型,测试模型
for model_name,model in models.items():
model.fit(X_train,y_train)
acc = model.score(X_test,y_test)
print('{}测试准确率:{:.3f}'.format(model_name,acc))
测试结果:
kNN测试准确率:0.974
DT测试准确率:0.974
GNB测试准确率:1.000
针对于鸢尾花数据我们可以看出朴素贝叶斯的测试准确率是最高的,不过在其他情况下也会有不同的测试结果。比如在属性个数比较多或者属性之间相关性较大时,分类效果就会不好。而且由于是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
朴素贝叶斯也是有他的优点的,如:易于实现,对小规模的数据表现得很好而且对于缺失数据不太敏感,那我们要根据所需要处理的数据来选择适合它的模型才能达到最好的效果。
在之后员工流失预测实战中我们可以来对比一下所有的分类模型。
好啦关于朴素贝叶斯模型就讲这么多啦,如果有问题可以在评论区提出哦,作者是一个小白,旨在整理博客来获得进步,一起加油!