实验三:朴素贝叶斯算法实验
班级:20大数据(3)班
学号:201613341
【实验目的】
理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。
【实验内容】
针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;
熟悉sklearn库中的朴素贝叶斯算法,使用sklearn包编写朴素贝叶斯算法程序,对输入数据进行预测;
【实验报告要求】
1.对照实验内容,撰写实验过程、算法及测试结果;
2.代码规范化:命名规则、注释;
3.查阅文献,讨论朴素贝叶斯算法的应用场景。
[实验过程]
1、编写python程序实现朴素贝叶斯算法,对输入数据进行预测
①读取数据
点击查看代码
import pandas as pd
import numpy as np
df=pd.read_table("贝叶斯.txt",sep='\t')
df
②导入数据
点击查看代码
import json
import numpy as np
import pandas as pd
# 导入数据/生成数据表
dataSheet = df
# print(dataSheet)
# 预数据
data_proba = {}
# 标签/列名称
header = dataSheet.columns
# 案例个数/行数
length = dataSheet.shape[0]
# 数据表值
values = dataSheet.values
# 最后一列的不重复数据
end_unique = dataSheet[header[-1]].unique()
③遍历
点击查看代码
# 遍历
for end in end_unique:
# [header[-1]==end]时end出现的次数
end_sum = dataSheet[dataSheet[header[-1]].isin([end])].shape[0]
# [header[-1]==end]时end出现的频率
end_proba = dataSheet[dataSheet[header[-1]].isin([end])].shape[0] / length
# 预保存
data_proba[end] = {'proba': end_proba, 'data': {}}
# 遍历标签/列名称
for head in header[:-1]:
# 初始化
data_proba[end]['data'][head] = {}
# 该标签/名称下不重复值
head_unique = dataSheet[head].unique()
# 遍历属性
for head_val in head_unique:
# [header[-1]==end]时head_val出现的次数
head_val_sum = dataSheet[dataSheet[head].isin([head_val]) & dataSheet[header[-1]].isin([end])].shape[0]
# [header[-1]==end]时head_val出现的频率
head_val_proba = head_val_sum / end_sum
# 预保存
data_proba[end]['data'][head][head_val] = head_val_proba
④打印结果
点击查看代码
# 打印结果
print(json.dumps(data_proba, indent=4, ensure_ascii=False))
⑤
点击查看代码
# 创建一个存放判断结果的数组
new = np.empty((length, 1), str)
# 遍历values的每一行
for val_num in np.arange(length):
judge = {}
# 遍历最后一列不重复数据
for end in end_unique:
# 标签/列名称除最后一列的数量
header_sum = len(header[:-1])
# 创建一个临时存放数据的数组
tempor = np.empty(header_sum + 1, float)
# 最后一个标签/列名称的属性对应的先验概率
end_proba = data_proba[end]['proba']
# 加1处理
end_proba += 1
# 临时保存
tempor[-1] = end_proba
# 遍历除最后一行的标签/列名称
for head_num in np.arange(header_sum):
# 标签/列名称
head = header[head_num]
# 该标签/列名称下的属性
val = values[val_num][head_num]
# 属性对应的先验概率
head_val_proba = data_proba[end]['data'][head][val]
# 加1处理
head_val_proba += 1
# 临时保存
tempor[head_num] = head_val_proba
# 对数据log处理并求和保存
temp = np.log(tempor).sum()
judge[temp] = end
# 提取后验概率较大的值
judge_max = np.max(list(judge.keys()))
# 保存预测结果
new[val_num] = judge[judge_max]
⑥预测
点击查看代码
# 将预测结果添加到数据表新列
dataSheet['new'] = new
# 预测正确的数量
rate = dataSheet[dataSheet[header[-1]] == dataSheet['new']].shape[0]
# 打印数据表
print(dataSheet)
# 准确率
print('准确率: {rate:.7f}%'.format(rate=100 * rate / length))
2、使用sklearn包编写朴素贝叶斯算法程序,对输入数据进行预测
点击查看代码
#熟悉sklearn库中的朴素贝叶斯算法,使用sklearn包编写朴素贝叶斯算法程序,对输入数据进行预测
from sklearn.datasets import load_iris
from sklearn.naive_bayes import GaussianNB
#载入数据集
X,y=load_iris(return_X_y=True)
bayes_modle=GaussianNB()
#训练数据
bayes_modle.fit(X,y)
#使用模型进行分类预测
result=bayes_modle.predict(X)
print(result)
#对模型评分
model_score=bayes_modle.score(X,y)
print(model_score)
另附文件:贝叶斯.txt
点击查看代码
色泽 根蒂 敲声 纹理 脐部 触感 好瓜
青绿 蜷缩 浊响 清晰 凹陷 碍滑 是
乌黑 蜷缩 沉闷 清晰 凹陷 碍滑 是
乌黑 蜷缩 浊响 清晰 凹陷 碍滑 是
青绿 蜷缩 沉闷 清晰 凹陷 碍滑 是
浅白 蜷缩 浊响 清晰 凹陷 碍滑 是
青绿 稍蜷 浊响 清晰 稍凹 软粘 是
乌黑 稍蜷 浊响 稍糊 稍凹 软粘 是
乌黑 稍蜷 浊响 清晰 稍凹 硬滑 是
乌黑 稍蜷 沉闷 稍糊 稍凹 硬滑 否
青绿 硬挺 清脆 清晰 平坦 软粘 否
浅白 硬挺 清脆 模糊 平坦 硬滑 否
浅白 蜷缩 浊响 模糊 平坦 软粘 否
青绿 稍蜷 浊响 稍糊 凹陷 硬滑 否
浅白 稍蜷 沉闷 稍糊 凹陷 硬滑 否
乌黑 稍蜷 浊响 清晰 稍凹 软粘 否
浅白 蜷缩 浊响 模糊 平坦 硬滑 否
青绿 蜷缩 沉闷 稍糊 稍凹 硬滑 否