Python算法总结(四)朴素贝叶斯(附手写python实现代码)

一、算法类型

有监督的分类算法

二、算法原理

Python算法总结(四)朴素贝叶斯(附手写python实现代码)_第1张图片
MultinomialNB算法,则:
A是类别,B是特征
p(类别i/特征)=p(类别i) * p(特征/类别i) / Σ( p(特征/类别i) * p(类别i) )
p(特征/类别i)= ( p(特征1/类别i) * p(特征2/类别i) * … * p(特征n/类别i) ),注意:特征间相互独立,累积

三、算法特点

  • MultinomialNB
    特点:特征服从多项式概率分布(类似抛骰子)
    scikit-learn中mnb分类器可接受连续型特征,特征取值不能为负数。但一般输入是分类特征。
  • GaussianNB
    特点:特征服从正态分布
    如果特征不服从正态分布,则要先处理数据使其转化为正态分布
  • BernoulliNB
    特点:特征服从0-1分布(类似抛硬币)

四、手写GaussianNB分类器代码

# 切分训练集和数据集
def randsplit(dataset,test_size=0.2):
    '''
    函数功能:随机切分训练集和测试集
    参数说明:
        dataset:输入的数据集
        test_size:训练集占比
    返回:切分好的训练集和测试集
    '''
    N,M=dataset.shape    
    ix=list(range(N))
    random.shuffle(ix)    
    s=int(N * test_size)
    testset=dataset.iloc[ix[0:s],:]
    trainset=dataset.iloc[ix[s:],:]
    testset.index=range(s)
    trainset.index=range(N-s)
    
    return trainset,testset

# 构建高斯朴素贝叶斯分类器
def GaussianNB_Classify(trainset,testset):
    '''
    函数功能:构建高斯朴素贝叶斯分类器
    参数说明:
        trainset:输入训练集,最后一列是标签(假设M个特征,标签类别有C个)
        testset:输入测试集,最后一列是标签(假设M个特征)
    返回:测试集的标签预测
    '''
    
    #第一部分:计算每个标签类别的均值、方差
    mean=[] #存放标签每个类别对应每个特征的均值
    var=[]  #存放标签每个类别对应每个特征的方差
    y_pre_set=[] #存放测试集的预测标签
    
    x_train=trainset.iloc[:,:-1]
    y_train=trainset.iloc[:,-1]
    
    labels=y_train.value_counts().index
    for label in labels:
        sub_x_train=x_train[y_train==label]
        m=sub_x_train.mean() #它的shape=(1,M)
        mean.append(m) 
        v=((sub_x_train-m)**2).sum()/sub_x_train.shape[0] #它的shape=(1,M)
        var.append(v)
    mean_df=pd.DataFrame(mean,index=labels) #转化为df格式,它的shape=(C,M)
    var_df=pd.DataFrame(var,index=labels) #转化为df格式,它的shape=(C,M)
    
    #第二部:计算未知样本取值不同标签类别的概率,然后预测其标签
    for i in range(testset.shape[0]):
        i_sample=testset.iloc[i,:-1].tolist() #取测试集第i个样本的特征值
        i_sample=np.array(i_sample) #它的shape=(1,M)
        
        
        i_m_prob=np.exp(-1*((i_sample-mean_df)**2)/(2*var_df)) / np.sqrt(2*np.pi*var_df) #广播,它的shape=(C,M)
        
        i_prob=1
        for m in range(trainset.shape[1]-1):
            i_prob *=i_m_prob.iloc[:,m] #它的shape=(C,1)
        y_pre=i_prob.index[np.argmax(i_prob.values)]
        y_pre_set.append(y_pre)
    testset['predict']=y_pre_set
    
    #第三部:计算模型准确率
    score=(testset['predict']==testset.iloc[:,-1]).mean()
    
    return testset,score

五、Python调包实现

from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB

六、参数调优

(待补充)

七、附调用手写函数

Python算法总结(四)朴素贝叶斯(附手写python实现代码)_第2张图片
在这里插入图片描述

参考:http://edu.cda.cn/course/966

你可能感兴趣的:(Python)