机器学习——朴素贝叶斯

定义

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法 。
最为广泛的两种分类模型是决策树模型(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值