python朴素贝叶斯算法实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
python朴素贝叶斯算法实例
下面是一个使用Python实现朴素贝叶斯算法的实例:
假设我们有一组数据,包括了若干个水果的颜色和形状信息,以及它们是否属于某一类水果。
现在我们需要根据这个数据集构建一个朴素贝叶斯分类器模型,用于判断一个新的水果是否属于这一类。
首先,我们需要载入数据集并进行处理。
假设数据集文件名为“fruits.csv”,包括以下三个属性:
- 颜色(color):可能取值为“red”、“yellow”、“green”;
- 形状(shape):可能取值为“round”、“oval”、“long”;
- 类别(type):可能取值为“apple”、“orange”、“banana”。
首先,我们可以使用pandas库将数据集读入并转换为DataFrame对象。
代码如下:
python
import pandas as pd
# 读取数据集
data = pd.read_csv('fruits.csv')
接着,我们需要将颜色和形状属性转换为数值类型。
为了方便起见,我们可以将“red”、“round”分别编码为1,将“yellow”、“oval”分别编码为2,将“green”、“long”分别编码为3。
代码如下:
python
# 将颜色和形状属性转换为数值类型
data['color'] = data['color'].map({'red': 1, 'yellow': 2, 'green': 3})
data['shape'] = data['shape'].map({'round': 1, 'oval': 2, 'long': 3})
接着,我们将数据集划分为训练集和测试集。
为了方便起见,我们选择把前60%的数据作为训练集,后40%的数据作为测试集。
代码如下:
python
# 将数据集划分为训练集和测试集
train_data = data.iloc[:int(len(data)*0.6)]
test_data = data.iloc[int(len(data)*0.6):]
接着,我们需要计算数据集中各个属性的先验概率和条件概率,并将它们存储在
字典中。
代码如下:
python
# 计算先验概率和条件概率
prior_probs = {}
cond_probs = {}
for t in data['type'].unique():
prior_probs[t] = len(train_data[train_data['type']==t])/len(train_data) cond_probs[t] = {}
for c in ['color', 'shape']:
cond_probs[t][c] = {}
for v in train_data[c].unique():
cond_probs[t][c][v] = len(train_data[(train_data[c]==v) & (train_data['type']==t)])/len(train_data[train_data['type']==t])
在计算条件概率时,需要先计算出给定类别的所有样本中,某个属性取某个值的样本数占总样本数的比例,即:
python
len(train_data[(train_data[c]==v) &
(train_data['type']==t)])/len(train_data[train_data['type']==t])
然后再将其存储在相应的字典中,以便后续使用。
接着,我们可以定义一个朴素贝叶斯分类器函数,用于对测试集进行分类。
具体来说,该函数的输入参数包括训练集、测试集、先验概率和条件概率(即上一步中计算得到的字典),以及一个平滑参数alpha(用于避免条件概率为0的情况)。
该函数的实现如下:
python
import math
def naive_bayes_classifier(train_data, test_data, prior_probs, cond_probs, alpha=1):
y_pred = []
for idx, row in test_data.iterrows():
max_prob = 0
max_class = None
for t in prior_probs.keys():
# 计算先验概率
prior_prob = prior_probs[t]
# 计算条件概率
cond_prob = 1
for c in ['color', 'shape']:
cond_prob *= cond_probs[t][c].get(row[c], alpha)
# 计算后验概率
post_prob = prior_prob * cond_prob
# 更新最大概率和对应的类别
if post_prob > max_prob:
max_prob = post_prob
max_class = t
y_pred.append(max_class)
return y_pred
在分类器函数中,我们首先对测试集中的每个样本进行预测,具体步骤如下:
- 对于给定的样本,遍历所有可能的类别,计算该样本属于每个类别的概率;- 对于每个类别,分别计算先验概率和条件概率,并利用这些概率计算后验概率;- 根据最大后验概率可以确定该样本属于哪个类别。
最后,我们可以调用朴素贝叶斯分类器函数对测试集进行分类,然后计算分类准确率。
代码如下:
python
# 对测试集进行分类
y_true = test_data['type'].tolist()
y_pred = naive_bayes_classifier(train_data, test_data, prior_probs,
cond_probs)
# 计算分类准确率
acc = sum([1 for i in range(len(y_true)) if
y_true[i]==y_pred[i]])/len(y_true)
print('准确率:', acc)
以上就是一个简单的朴素贝叶斯算法实例,用于对水果分类。
需要注意的是,这里实现的是一个“离散型”朴素贝叶斯分类器,因为我们将颜色和形状等属性都转换为了离散值。
如果属性值是连续的,则需要使用“连续型”朴素贝叶斯分类器。