实验九:贝叶斯分类

目录

实验前准备

朴素贝叶斯

导入数据集

计算每个标签值对应的先验概率

计算给定标签值的特征值的条件概率

计算给定样本和标签的后验概率

计算预测的准确率

引入拉普拉斯平滑

判断是否需要引入拉普拉斯平滑

计算引入拉普拉斯平滑后每个标签对应的先验概率

计算引入拉普拉斯平滑后给定标签值的特征值的条件概率

计算引入拉普拉斯后预测的准确率

实验总结

贝叶斯决策理论:

朴素贝叶斯:

引入拉普拉斯平滑:

朴素贝叶斯和引入拉普拉斯平滑后的对比:


实验前准备

本实验是在Anaconda下的jupyter notebook上进行的,使用的代码语言为python。在开始实验前,我们首先需要导入所需要的库与包或者模块。本实验是一个贝叶斯分类的实验,需要处理大量的实验数据,需要处理多维数组对象,以及需要画图进行可视化处理,还有一些数学公式的运用,所以我们需要导入的包为numpypandasmath以及matplotlib.pyplot。同时我们可能还需要使用random函数来随机选取标签,所以我们还需要导入random

代码实现:

from collections import Counter
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math
import random

朴素贝叶斯

导入数据集

实验要求:

代码实现:

# 首先将训练数据集和测试数据集导入
train_frame=pd.read_csv("train_mushroom.csv")
test_frame=pd.read_csv("test_mushroom.csv")

实验结果分析:如图所示,我们首先需要将训练集“train_mushroom.csv”以及测试集“test_mushroom.csv”进行导入,我们在这里使用了pandas库的read_csv函数,导入的数据集格式为framedata数据。由于后面的实验中,我们可以直接使用该格式的数据进行操作,所以我们不需要再继续对训练集和测试集做其它的处理。

计算每个标签值对应的先验概率

实验要求:

代码实现:

#计算先验概率
# 首先获取每一个标签所对应的样本数量
labels_counts=train_frame['label'].value_counts()
# 然后使用sum函数获取该样本中的总样本数
total_sample=labels_counts.sum()
prior_probability=labels_counts/total_sample
# 将每一个标签值对应的先验概率打印出来
for label,probability in prior_probability.items():
    print(f'标签为{label}的先验概率为{probability}')

实验结果分析:如图所示,我们首先需要使用value_counts函数来获取每一个标签所对应的样本数量,将其存储在字典labels_counts中。然后使用sum函数来计算该样本中的总样本数,将其存储在total_sample中,随后我们将前面计算得到的每一个样本标签所对应的样本数量字典除于该样本的总样本数,就可以得到了每一个标签所对应的先验概率。最后,我们可以将我们计算得到的先验概率打印出来进行展示,从实验结果我们可以得知,标签为e的先验概率为0.59,而标签为p的先验概率为0.41,符合预期的实验结果。

计算给定标签值的特征值的条件概率

实验要求:

代码实现:

#首先遍历数据集D中的每个特征,将每个特征的非重复值取出
# 定义一个字典来存储每一个特征的非重复值
unique_feature_dict={}
# 遍历数据集中的每一个特征,调用unique函数将每一个特征的所有非重复值取出,然后将其添加到上面定义的字典中
for feature in train_frame.columns[:-1]:
    unique_values=train_frame[feature].unique()
    unique_feature_dict[feature]=unique_values
    
#根据标签值将数据集D分为两个子数据集,分别包括所有标签值为p的样本和所有标签值为e的样本。
subset_p=train_frame[train_frame['label']=='p']
subset_e=train_frame[train_frame['label']=='e']


#现以标签为p的数据集Dp为例子,遍历Dp的每个特征,分别求出该特征每个特征值的条件概率
#以特征cap-shape为例。Dp中cap-shape的非重复值集合为['b' 'c' 'f' 'k' 's' 'x' 'y'],计算条件概率P(cap-shape='b'|label='p'),P(cap-shape='c'|label='p'),...,P(cap-shape='y'|label='p'),
#上述对cap-shape特征操作完成后,按照同样的步骤对Dp中的剩余12个特征进行同样的操作

# 首先定义一个字典,用于存放每一个特征的每一个非重复值的条件概率
conditional_probability_p={}
for feature,unique_values in unique_feature_dict.items():
    # 首先通过value_counts函数获取当前样本中该特征的每一个非重复值的样本数
    feature_counts_p=subset_p[feature].value_counts()
    feature_counts_p=feature_counts_p.reindex(unique_values, fill_value=0)
    # 通过sum函数获取当前样本中该特征的所有样本数
    total_feature_sample_p=feature_counts_p.sum()
    # 获取当前样本中该特征的每一个非重复值的条件概率
    each_feature_value_probability_p=feature_counts_p/total_feature_sample_p
    # 将求到的每一个特征下的每一个非重复值的条件概率添加到字典中
    conditional_probability_p[feature]=each_feature_value_probability_p

#得到数据集Dp中条件概率集合后,对另一个子数据集进行同样的操作
conditional_probability_e={}
for feature,unique_values in unique_feature_dict.items():
    # 首先通过value_counts函数获取当前样本中该特征的每一个非重复值的样本数
    feature_counts_e=subset_e[feature].value_counts()
    feature_counts_e=feature_counts_e.reindex(unique_values, fill_value=0)
    # 通过sum函数获取当前样本中该特征的所有样本数
    total_feature_sample_e=feature_counts_e.sum()
    # 获取当前样本中该特征的每一个非重复值的条件概率
    each_feature_value_probability_e=feature_counts_e/total_feature_sample_e
    # 将求到的每一个特征下的每一个非重复值的条件概率添加到字典中
    conditional_probability_e[feature]=each_feature_value_probability_e
    

实验结果分析:如图所示,我们首先需要定义一个字典用于存储每一个特征的非重复值,然后开始遍历数据集中的每一个特征,调用unique函数将每一个特征的所有非重复值取出,然后将其添加到上面定义的字典中。然后我们需要根据标签值将数据集分为两个子数据集,分别包括所有标签值为p的样本和所有标签值为e的样本,我们可以直接使用相等运算符划分得到两个数据集。

随后我们需要分别遍历这两个数据集的每个特征,分别求出该特征每一个特征值的条件概率。以数据集subset_p为例,我们首先需要定义一个字典,用于存放每一个特征的每一个非重复值的条件概率。然后我们将前面我们求得的所有数据集的特征的非重复值进行遍历,主要是遍历每一个特征,首先通过value_count函数获取当前样本中该特征的每一个非重复值的样本数,然后使用reindex函数将前面统计得到的每一个非重复的特征值的样本数中没有出现过的特征值进行填充,将样本数填充为0。随后我们使用sum函数获取当前样本中该特征的所有样本数,随后将前面求到的feature_counts_p除于total_feature_sample_p便可以获取当前样本中该特征的每一个非重复值的条件概率。最后我们需要将我们获取到的每一个特征的非重复值的条件概率添加到我们前面定义的conditional_probability_p字典中。同理的,对于另一个数据集subset_e,我们可以使用与subset_p相同的方法计算每一个特征值的条件概率,然后将其存放在字典conditional_probability_e中。

计算给定样本和标签的后验概率

实验要求:

代码实现:

# 首先获取
def pro(a,index):
    # 首先定义一个后验概率
    posterior_probability=0
    i=0
    # 如果输入的标签为p,那么使用数据集subset_p
    if index=='p':
        # 首先将后验概率更新为先验概率
        posterior_probability=prior_probability['p']
        # 依次遍历所有的特征
        for feature,_ in unique_feature_dict.items():
            # 如果当前的a[i]不在前面所存放该特征下所有非重复的值的字典中
            if a[i] not in unique_feature_dict[feature]:
                # 直接令后验概率为0并且返回
                posterior_probability=0
                break
            # 依次将条件概率乘上后验概率
            posterior_probability*=conditional_probability_p[feature][a[i]]
            # 将i加1,即依次处理a中的字母
            i+=1 
    
    # 如果输入的标签为e,那么使用数据集subset_e
    else:
        # 首先将后验概率更新为先验概率
        posterior_probability=prior_probability['e']
        # 依次遍历所有的特征
        for feature,_ in unique_feature_dict.items():
            # 如果当前的a[i]不在前面所存放该特征下所有非重复的值的字典中
            if a[i] not in unique_feature_dict[feature]:
                # 直接令后验概率为0并且返回
                posterior_probability=0
                break
            # 依次将条件概率乘上后验概率
            posterior_probability*=conditional_probability_e[feature][a[i]]
            # 将i加1,即依次处理a中的字母
            i+=1
            
    return posterior_probability

pro('sntpfnkepksux','p')

实验结果分析:如图所示,我们需要计算给定样本和标签的后验概率,我们可以定义一个函数,使用函数来计算该后验概率。从上面的公式中我们就可以得知,后验概率等于先验概率乘上每一个特征的条件概率,我们可以使用累乘来实现。所以我们首先需要定义一个后验概率,将其初始化为0,同时我们还需要初始化一个变量i为0,用于获取输入的样本中的第i个特征值。然后我们对输入的标签值进行比较,如果标签值为‘p’,我们就使用我们前面求得的conditional_probability_p,同时先验概率也使用prior_probability[‘p’];反之,如果标签为‘e’,我们就是用我们前面求得的conditional_probability_e,同时先验概率也使用prior_probability[‘e’]。

我们以输入的标签值为‘p’为例。我们首先需要将我们刚开始初始化的后验概率更新为先验概率prior_probability[‘p’],然后依次遍历所有的特征,获取得到该特征下输入的样本的对应的特征下的特征值的条件概率,然后将这个条件概率乘上前面的后验概率,并且更新该后验概率,如此累乘所有的特征下的该输入样本的特征值下的条件概率即可。同时,我们还需要添加一个判断,如果当前的输入样本的a[i]不在前面所存放该特征下所有非重复的值的字典中,就可以直接令该后验概率为0并且直接退出遍历返回函数了。同理的,对于另一种情况下的标签‘e’,计算后验概率的过程是完全一致的。最后我们需要将该后验概率作为函数的返回值进行返回。

计算预测的准确率

实验要求:

代码实现:

# 初始化一个列表,用于存储预测得到的label
pre_label=[]
accuracy_nums=0

# 首先遍历测试集中的每一个样本
for index,row in test_frame.iterrows():
    # 将该样本的13个特征组装成字符串
    row_str="".join(str(data) for data in row[:-1])
    # 首先求当标签为p时的后验概率
    pro_p=pro(row_str,'p')
    
    # 再求当标签为e时的后验概率
    pro_e=pro(row_str,'e')
    
    if pro_p==0 and pro_e==0:
        labels=['p','e']
        # 随机选取一个标签
        random_label=random.choice(labels)
        pre_label.append(random_label)
        if random_label==row[-1]:
            accuracy_nums+=1
            
    # 选取概率更大的后验概率对应的标签
    elif pro_p>=pro_e:
        pre_label.append('p')
        if 'p'==row[-1]:
            accuracy_nums+=1
    else:
        pre_label.append('e')
        if 'e'==row[-1]:
            accuracy_nums+=1

# 计算准确率
accuracy=accuracy_nums/len(pre_label)
accuracy_percentage=accuracy*100

print("准确率: {:.2f}%".format(accuracy_percentage))

实验结果分析:如图所示,我们首先初始化一个列表,用于存储预测得到的label,同时还需要初始化一个变量用于存储预测正确的个数。随后我们开始遍历测试集中的每一个样本,首先需要对样本的13个特征进行处理,使用join函数将这13个特征组装成为一个字符串,然后调用函数计算当标签为‘p’时的后验概率,然后再求当标签为‘e’时的后验概率。随后我们开始进行预测,如果标签为‘p’和标签为‘e’的后验概率均为0时,我们便使用random随机选取一个标签作为预测标签,并且将这个预测的标签加入到前面定义好的列表中。而如果不是均为0,我们就选取其中后验概率最大对应的标签作为我们的预测标签,同时将这个预测标签加入到我们的预测列表中。而在进行预测标签时,我们还需要顺便判断该预测的标签与当前样本的标签值是否相同,如果相同,就将accuracy_nums加1。在结束遍历后,我们便可以开始计算我们的准确率,我们将我们计算得到的accuracy_nums除于我们得到的预测列表的长度便可以得到这一个后验概率预测的准确率。如图所示,我们的预测准确率为55%,预测的正确率还是勉强过关的,所以我们可以得知我们所编写的代码应该是正确无误的。

引入拉普拉斯平滑

判断是否需要引入拉普拉斯平滑

实验要求:

代码实现:

# 构建一个函数实现判断是否满足条件
def IsNeedLaplace(p,e):
    # 首先遍历条件概率的字典,获取每一个特征字典
    for feature,values in p.items():
        # 再遍历每一个特征的所有取值
        for _,value in values.items():
            # 如果这一个特征值的值为0,就返回True
            if 0==value:
                return True
    
    # 首先遍历条件概率的字典,获取每一个特征字典
    for feature,values in e.items():
        # 再遍历每一个特征的所有取值
        for _,value in values.items():
            # 如果这一个特征值的值为0,就返回True
            if 0==value:
                return True
    # 返回False
    return False

IsNeed=IsNeedLaplace(conditional_probability_p,conditional_probability_e)
print(f'是否需要引入拉普拉斯平滑:{IsNeed}')

实验结果分析:如图所示,我们需要判断是否需要引入拉普拉斯平滑,就需要判断是否有某个特征值和某个类没有在训练集中同时出现而使得条件概率为0。我们在这里构建了一个函数进行判断。我们首先需要遍历第一个数据集p的条件概率的字典,获取每一个特征的字典,然后再遍历每一个特征的所有非重复的取值。然后进行判断,如果这一个特征值的值为0,就返回True。同理的,对于数据集e,我们也需要做同样的操作判断,如果发现有一个特征值等于0,就直接返回0。最后再返回False。如图所示,我们调用该函数后发现,返回的结果为True,即我们是需要引入拉普拉斯平滑的。

计算引入拉普拉斯平滑后每个标签对应的先验概率

实验要求:

代码实现:

#计算先验概率
# 首先获取每一个标签所对应的样本数量
labels_counts=train_frame['label'].value_counts()
# 然后将获取到的每一个标签对应的样本数加1
labels_counts+=1
# 然后使用sum函数获取该样本中的总样本数
total_sample=labels_counts.sum()
# 代入公式求出每一个标签y对应的先验概率
prior_probability=labels_counts/total_sample
# 将每一个标签值对应的先验概率打印出来
for label,probability in prior_probability.items():
    print(f'标签为{label}的先验概率为{probability}')

实验结果分析:如图所示,我们在计算先验概率时,首先需要使用value_counts函数获取每一个标签所对应的样本数量,然后我们需要引入拉普拉斯平滑,将获取得到的每一个标签对应的样本数量进行加1,随后再使用sum函数获取该样本中的总样本数。随后我们需要带入公式,将labels_counts除于total_sample便可以得到每一个标签所对应的先验概率。最后我们再将这个先验概率给打印出来,结果如图所示,我们可以知道标签为e的先验概率为0.5896414342629482,而标签为p的先验概率为0.4103585657370518。

计算引入拉普拉斯平滑后给定标签值的特征值的条件概率

实验要求:

代码实现:

#首先遍历数据集D中的每个特征,将每个特征的非重复值取出
# 定义一个字典来存储每一个特征的非重复值
unique_feature_dict={}
# 遍历数据集中的每一个特征,调用unique函数将每一个特征的所有非重复值取出,然后将其添加到上面定义的字典中
for feature in train_frame.columns[:-1]:
    unique_values=train_frame[feature].unique()
    unique_feature_dict[feature]=unique_values

#根据标签值将数据集D分为两个子数据集,分别包括所有标签值为p的样本和所有标签值为e的样本。
subset_p=train_frame[train_frame['label']=='p']
subset_e=train_frame[train_frame['label']=='e']

#现以标签为p的数据集Dp为例子,遍历Dp的每个特征,分别求出该特征每个特征值的条件概率。
#以特征cap-shape为例。Dp中cap-shape的非重复值集合为['b' 'c' 'f' 'k' 's' 'x' 'y'],计算条件概率P(cap-shape='b'|label='p'),P(cap-shape='c'|label='p'),...,P(cap-shape='y'|label='p'),
#计算条件概率时需要注意引入拉普拉斯平滑。
#上述对cap-shape特征操作完成后,按照同样的步骤对Dp中的剩余12个特征进行同样的操作

# 首先定义一个字典,用于存放每一个特征的每一个非重复值的条件概率
conditional_probability_p={}
for feature,unique_values in unique_feature_dict.items():
    # 首先通过value_counts函数获取当前样本中该特征的每一个非重复值的样本数
    feature_counts_p=subset_p[feature].value_counts()
    feature_counts_p=feature_counts_p.reindex(unique_values, fill_value=0)
    # 将该样本中该特征的每一个非重复值的样本数都加1
    feature_counts_p+=1
    # 通过sum函数获取当前样本中该特征的所有样本数
    total_feature_sample_p=feature_counts_p.sum()
    # 获取当前样本中该特征的每一个非重复值的条件概率
    each_feature_value_probability_p=feature_counts_p/total_feature_sample_p
    # 将求到的每一个特征下的每一个非重复值的条件概率添加到字典中
    conditional_probability_p[feature]=each_feature_value_probability_p


#得到数据集Dp中条件概率集合后,对另一个子数据集进行同样的操作
conditional_probability_e={}
for feature,unique_values in unique_feature_dict.items():
    # 首先通过value_counts函数获取当前样本中该特征的每一个非重复值的样本数
    feature_counts_e=subset_e[feature].value_counts()
    feature_counts_e=feature_counts_e.reindex(unique_values, fill_value=0)
    # 将该样本中该特征的每一个非重复值的样本数都加1
    feature_counts_e+=1
    # 通过sum函数获取当前样本中该特征的所有样本数
    total_feature_sample_e=feature_counts_e.sum()
    # 获取当前样本中该特征的每一个非重复值的条件概率
    each_feature_value_probability_e=feature_counts_e/total_feature_sample_e
    # 将求到的每一个特征下的每一个非重复值的条件概率添加到字典中
    conditional_probability_e[feature]=each_feature_value_probability_e

实验结果分析:如图所示,我们需要计算引入拉普拉斯平滑后给定标签值的特征值的条件概率,首先需要定义一个字典用于存储每一个特征的非重复值,然后开始遍历数据集中的每一个特征,调用unique函数将每一个特征的所有非重复值取出,然后将其添加到上面定义的字典中。然后我们需要根据标签值将数据集分为两个子数据集,分别包括所有标签值为p的样本和所有标签值为e的样本,我们可以直接使用相等运算符划分得到两个数据集。

随后我们需要分别遍历这两个数据集的每个特征,分别求出该特征每一个特征值的条件概率。以数据集subset_p为例,我们首先需要定义一个字典,用于存放每一个特征的每一个非重复值的条件概率。然后我们将前面我们求得的所有数据集的特征的非重复值进行遍历,主要是遍历每一个特征,首先通过value_count函数获取当前样本中该特征的每一个非重复值的样本数,然后使用reindex函数将前面统计得到的每一个非重复的特征值的样本数中没有出现过的特征值进行填充,将样本数填充为0。然后将该样本中该特征的每一个非重复值的样本数都加1引入拉普拉斯平滑。随后我们使用sum函数获取当前样本中该特征的所有样本数,随后将前面求到的feature_counts_p除于total_feature_sample_p便可以获取当前样本中该特征的每一个非重复值的条件概率。最后我们需要将我们获取到的每一个特征的非重复值的条件概率添加到我们前面定义的conditional_probability_p字典中。同理的,对于另一个数据集subset_e,我们可以使用与subset_p相同的方法计算每一个特征值的条件概率,然后将其存放在字典conditional_probability_e中。

计算引入拉普拉斯后预测的准确率

实验要求:

代码实现:

# 开始计算准确率
# 初始化一个列表,用于存储预测得到的label
pre_label=[]
accuracy_nums=0

# 首先遍历测试集中的每一个样本
for index,row in test_frame.iterrows():
    # 将该样本的13个特征组装成字符串
    row_str="".join(str(data) for data in row[:-1])
    # 首先求当标签为p时的后验概率
    pro_p=pro(row_str,'p')
    
    # 再求当标签为e时的后验概率
    pro_e=pro(row_str,'e')
    
    if pro_p==0 and pro_e==0:
        labels=['p','e']
        # 随机选取一个标签
        random_label=random.choice(labels)
        pre_label.append(random_label)
        if random_label==row[-1]:
            accuracy_nums+=1
    
    # 选取概率更大的后验概率对应的标签
    elif pro_p>=pro_e:
        pre_label.append('p')
        if 'p'==row[-1]:
            accuracy_nums+=1
    else:
        pre_label.append('e')
        if 'e'==row[-1]:
            accuracy_nums+=1

# 计算准确率
accuracy=accuracy_nums/len(pre_label)
accuracy_percentage=accuracy*100
print("准确率: {:.2f}%".format(accuracy_percentage))

实验结果分析:如图所示,我们首先初始化一个列表,用于存储预测得到的label,同时还需要初始化一个变量用于存储预测正确的个数。随后我们开始遍历测试集中的每一个样本,首先需要对样本的13个特征进行处理,使用join函数将这13个特征组装成为一个字符串,然后调用函数计算当标签为‘p’时的后验概率,然后再求当标签为‘e’时的后验概率。随后我们开始进行预测,如果标签为‘p’和标签为‘e’的后验概率均为0时,我们便使用random随机选取一个标签作为预测标签,并且将这个预测的标签加入到前面定义好的列表中。而如果不是均为0,我们就选取其中后验概率最大对应的标签作为我们的预测标签,同时将这个预测标签加入到我们的预测列表中。而在进行预测标签时,我们还需要顺便判断该预测的标签与当前样本的标签值是否相同,如果相同,就将accuracy_nums加1。在结束遍历后,我们便可以开始计算我们的准确率,我们将我们计算得到的accuracy_nums除于我们得到的预测列表的长度便可以得到这一个后验概率预测的准确率。如图所示,我们的预测准确率为70%,与前面没有引入拉普拉斯平滑进行预测的结果55%进行比较,我们可以得知清楚地看到引入拉普拉斯平滑所带来的预测准确率的提升,所以我们可以知道引入拉普拉斯平滑对于使用后验概率进行预测是非常有用的,同时我们也可以知道,我们前面所编写的代码是没有问题的。

实验总结

贝叶斯决策理论:

  1. 基本概念:贝叶斯决策理论是基于贝叶斯定理的一种决策方法,它通过考虑不同可能性的先验概率和条件概率来做出最优决策。贝叶斯决策理论将不确定性考虑为一种概率分布,从而能够更好地处理不完全信息下的决策问题。
  2. 特点:
    1. 贝叶斯决策理论提供了一种统一的框架,可以将不同的决策问题形式化为基于概率的决策问题。
    2. 它能够处理不完全信息和不确定性,通过合理的概率模型进行决策。
    3. 贝叶斯决策理论考虑了先验概率和条件概率,能够根据先验知识和样本数据进行推理和决策。
    4. 它可以灵活地适应不同的问题领域和数据类型。
  3.  适用条件:
    1. 它需要先验概率和条件概率的知识或估计,以及样本数据进行推断和决策。
    2. 贝叶斯决策理论适用于具有不完全信息和不确定性的决策问题。
  4. 缺点分析
    1. 优点:贝叶斯决策理论提供了一种统一的框架,能够处理不完全信息和不确定性,具有很好的理论基础。它可以根据先验知识和样本数据进行推理和决策,适用于不同的问题领域和数据类型。
    2. 缺点:贝叶斯决策理论在实际应用中可能受到先验概率和条件概率的估计误差的影响。此外,当特征之间存在相关性时,贝叶斯决策理论中的条件独立性假设可能会导致较差的预测结果。

朴素贝叶斯:

  1. 基本概念:朴素贝叶斯是贝叶斯分类器的一种简单实现方式。它基于贝叶斯决策理论,假设所有特征之间相互独立,从而简化了计算和推断过程。
  2. 特点:
    1. 朴素贝叶斯假设特征之间相互独立,这使得计算条件概率更加简单。
    2. 它适用于处理高维特征空间的分类问题,并且对于小样本数据也能有较好的表现。
    3. 朴素贝叶斯分类器具有较低的计算复杂度,对于大规模数据集能够快速训练和预测。
  3. 适用条件:
    1. 朴素贝叶斯适用于特征之间相互独立的分类问题。
    2. 它通常用于文本分类、垃圾邮件过滤、情感分析等领域。
  4. 缺点分析
    1. 缺点:朴素贝叶斯假设特征之间相互独立,这在实际问题中很少成立,可能导致较差的预测结果。此外,朴素贝叶斯对于特征之间的相关性和数据不平衡性有一定的局限性。
    2. 优点:朴素贝叶斯具有简单、高效的特点,适用于高维特征空间和小样本数据。它的计算复杂度较低,能够处理大规模数据集。

引入拉普拉斯平滑:

  1. 基本概念:在朴素贝叶斯分类器中,当某个特征在训练集中没有出现过时,计算条件概率会得到0,导致整个分类器失效。为了解决这个问题,可以引入拉普拉斯平滑(也称为加法平滑或Laplace smoothing)。
  2. 特点:
    1. 拉普拉斯平滑通过在每个类别的计数中加上一个平滑项,来避免概率为0的情况。
    2. 平滑项可以看作是对先验概率的一个估计,使得每个特征的概率都不会为0。
    3. 拉普拉斯平滑在处理稀疏数据和小样本数据时表现良好。
  3. 适用条件:
    1. 拉普拉斯平滑适用于朴素贝叶斯分类器中处理特征概率为0的情况。
  4. 缺点分析
    1. 优点:拉普拉斯平滑解决了朴素贝叶斯分类器中特征概率为0的问题,能够处理稀疏数据和小样本数据。
    2. 缺点:引入拉普拉斯平滑可能会导致概率估计偏离实际情况,特别是在样本数量较大时。过度平滑可能会使分类器的预测能力下降。

朴素贝叶斯和引入拉普拉斯平滑后的对比:

  1. 朴素贝叶斯分类器会根据计算得到的条件概率来预测样本的类别。
  2. 引入拉普拉斯平滑的贝叶斯分类器会在计算条件概率时避免出现概率为0的情况。
  3. 相比于朴素贝叶斯分类器,引入拉普拉斯平滑后的贝叶斯分类器在预测结果中会考虑到所有特征的概率,并且不会出现概率为0的情况。
  4. 具体的预测结果比较需要具体的数据和问题设置,可以根据实际情况进行实验和评估。通常情况下,引入拉普拉斯平滑后的贝叶斯分类器在处理稀疏数据和小样本数据时能够取得更好的预测效果。
  5. 对于朴素贝叶斯分类器而言,数据的特征独立性假设可能限制了其在处理复杂关联特征的数据上的性能。引入拉普拉斯平滑后的贝叶斯分类器在处理具有相关特征的数据时更具优势,因为它不依赖于特征之间的独立性假设。
  6. 朴素贝叶斯分类器的参数估计相对简单,只需要计算各个类别和特征的概率。引入拉普拉斯平滑后的贝叶斯分类器需要额外的平滑项计算,因此在参数估计上稍微复杂一些。
  7. 朴素贝叶斯分类器在处理大规模数据集和高维特征时具有高效性能,但对于特征之间存在较强相关性的数据,可能会导致较差的预测效果。引入拉普拉斯平滑后的贝叶斯分类器在处理稀疏数据和小样本数据时通常能够取得更好的预测效果,并且能够更好地处理特征之间的相关性。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值