朴素贝叶斯不调包超详细python代码实现

朴素贝叶斯种类

  • GaussianNB:高斯朴素贝叶斯就是先验为高斯分布(正态分布)的朴素贝叶斯。公式为:

    P ( X j = x j ∣ Y = C k ) = 1 2 π σ k 2 exp ⁡ ( − ( x j − μ k ) 2 2 σ k 2 ) P\left(X_{j}=x_{j} | Y=C_{k}\right)=\frac{1}{\sqrt{2 \pi \sigma_{k}^{2}}} \exp \left(-\frac{\left(x_{j}-\mu_{k}\right)^{2}}{2 \sigma_{k}^{2}}\right) P(Xj=xjY=Ck)=2πσk2 1exp(2σk2(xjμk)2)

  • MultinomialNB就是先验为多项式分布的朴素贝叶斯,例如某个特征表示某个词语出现的次数。公式为
    P ( X j = x j l ∣ Y = C k ) = x j l + λ m k + n λ P\left(X_{j}=x_{j l} | Y=C_{k}\right)=\frac{x_{j l}+\lambda}{m_{k}+n \lambda} P(Xj=xjlY=Ck)=mk+nλxjl+λ

  • BernoulliNB就是先验为伯努利分布的朴素贝叶斯。假设特征的先验概率为二元伯努利分布,即如下式:
    P ( X j = x j l ∣ Y = C k ) = P ( j ∣ Y = C k ) x j l + ( 1 − P ( j ∣ Y = C k ) ( 1 − x j l ) P\left(X_{j}=x_{j l} | Y=C_{k}\right)=P\left(j | Y=C_{k}\right) x_{j l}+\left(1-P\left(j | Y=C_{k}\right)\left(1-x_{j l}\right)\right. P(Xj=xjlY=Ck)=P(jY=Ck)xjl+(1P(jY=Ck)(1xjl)

      - 一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。
     
      - 如果如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较合适。
     
      - 而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。
    

2.高斯朴素贝叶斯python代码实现

主要代码:

def gnb_classify(train,test):
    labels = train.iloc[:,-1].value_counts().index #提取训练集的标签种类
    mean =[] #存放每个类别的均值
    std =[] #存放每个类别的方差
    result = [] #存放测试集的预测结果
    for i in labels:  # labels:['Iris-versicolor', 'Iris-virginica', 'Iris-setosa']
        item = train.loc[train.iloc[:,-1]==i,:] #分别提取出每一种类别
        m = item.iloc[:,:-1].mean() #当前类别的平均值
        s = np.sum((item.iloc[:,:-1]-m)**2)/(item.shape[0]) #当前类别的方差
        mean.append(m) #将当前类别的平均值追加至列表
        std.append(s) #将当前类别的方差追加至列表
    means = pd.DataFrame(mean,index=labels) #变成DF格式,索引为类标签
    stds = pd.DataFrame(std,index=labels) #变成DF格式,索引为类标签
    for j in range(test.shape[0]):
        iset = test.iloc[j,:-1].tolist() #当前测试实例
        iprob = np.exp(-((iset-means)**2)/(2 * stds**2))/(stds * np.sqrt(2 * np.pi)) #正态分布公式
        prob = 1 #初始化当前实例总概率
        for k in range(test.shape[1]-1): #遍历每个特征
            prob *= iprob[k] #特征概率之积即为当前实例概率
        cla = prob.index[np.argmax(prob.values)] #返回最大概率的类别
        result.append(cla)
    test['predict']=result
    acc = (test.iloc[:,-1]==test.iloc[:,-2]).mean() #计算预测准确率
    print(f'模型预测准确率为{acc}')

数据demo:
在这里插入图片描述

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值