定义
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法 。
最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier,或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。
公式
P(A|y=1)=(A的个数+λ) / (y=1的个数+len{特征数量}λ)
数据
X1,X2,Y
1,S,-1
1,M,-1
1,M,1
1,S,1
1,S,-1
2,S,-1
2,M,-1
2,M,1
2,L,1
2,L,1
3,L,1
3,M,1
3,M,1
3,L,1
3,L,-1
代码如下
import pandas as pd
# 定义写key的函数,比如产生 'X1=3|Y=1'
def tokey(col_name, category, y):
return "{}={}|Y={}".format(col_name, category, y)
# 西瓜数据集标签有X1,X2,Y
df = pd.read_csv("../../datas/bayes_lihang.txt")
# 平滑因子
lam = 1
# 用于存储所有概率的字典
P = {}
# 获取类别种类的list,形成[1, -1]的列表为后面的第一层循环做准备
Y = list(set(df.Y))
# 获取特征列名(X1,X2)
col_names = df.columns[:-1]
# 建模过程========================
# 遍历每个类别(第一层for循环Y的值但没有重复)
for y in Y:
# 获取当前类别下的DF(每类的样本)
df2 = df[df.Y == y]
# 计算先验概率(这个是计算每种样本占总样本的概率,并加上平滑因子)
p = (len(df2)+lam)/(len(df)+lam*len(Y))
# 将先验概率加入P,[]里是key
P[y] = p
# 遍历每个特征 col_names = [X1,X2]
for col_name in col_names:
# 获取每个特征下特征值种类的list categorys=[1, 2, 3]每个特征值下的值(1,2,3)(M,S,L)
categorys = list(set(df2[col_name]))
# 遍历每个特征值
for category in categorys:
# 计算在某类别下,特征=某特征的条件概率
p = (len(df2[df2[col_name] == category])+lam)/(len(df2)+lam*len(categorys))
# 将条件概率加到P
P[tokey(col_name,category,y)] = p
# 建模过程========================
# 待测数据
X = [2, "S"]
# 用于存储属于某一类别的后验概率
res = []
# 遍历类别
for y in Y:
# 获取先验概率
p = P[y]
# 遍历特征
for i in range(len(X)):
# 获取条件概率
p *= P[tokey(col_names[i], X[i], y)]
# 将后验概率加入res
res.append([p,y])
# 返回最大的后验概率对应的类别
res.sort()
print(res[-1][-1])
效果展示
-1