朴素贝叶斯不调包超详细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:
朴素贝叶斯不调包超详细python代码实现_第1张图片

你可能感兴趣的:(朴素贝叶斯不调包超详细python代码实现)