实验三:朴素贝叶斯算法实验
【实验目的】
理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。
【实验内容】
针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;
熟悉sklearn库中的朴素贝叶斯算法,使用sklearn包编写朴素贝叶斯算法程序,对输入数据进行预测;
【实验报告要求】
对照实验内容,撰写实验过程、算法及测试结果;
代码规范化:命名规则、注释;
查阅文献,讨论朴素贝叶斯算法的应用场景。
色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 碍滑 | 是 |
乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 碍滑 | 是 |
乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 碍滑 | 是 |
青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 碍滑 | 是 |
浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 碍滑 | 是 |
青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
答:
一、不用sklearn包
1.创建数据文件
2.导入数据
import pandas as pd
import numpy as np
df=pd.read_table("C:/Users/baekhyun/Desktop/西瓜.txt")
df
import json
import numpy as np
import pandas as pd
dataSheet = df
data_proba = {}
# 标签/列名称
header = dataSheet.columns
# 案例个数/行数
length = dataSheet.shape[0]
# 数据表值
values = dataSheet.values
# 最后一列的不重复数据
end_unique = dataSheet[header[-1]].unique()
3.遍历
# 遍历
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
4.打印结果
# 打印结果
print(json.dumps(data_proba, indent=4, ensure_ascii=False))
5.创建一个存放结果的数组
# 创建一个存放判断结果的数组
new = np.empty((length, 1), str)
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]
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]
6.打印数据表
1 2 3 4 5 6 7 8 | # 将预测结果添加到数据表新列 dataSheet[ 'new' ] = new # 预测正确的数量 rate = dataSheet[dataSheet[header[-1]] == dataSheet[ 'new' ]].shape[0] # 打印数据表 print(dataSheet) # 准确率 print( '准确率: {rate:.7f}%' .format(rate=100 * rate / length)) |
二、用sklearn包
1.导入数据
import pandas as pd
import graphviz
from sklearn.model_selection import train_test_split
from sklearn import tree
data = pd.read_excel('C:/Users/baekhyun/Desktop/西瓜.xlsx')
x = data[["色泽","根蒂","敲声","纹理","脐部","触感"]].copy()
y = data['好瓜'].copy()
print(data)
2.特征值数值化
x = x.copy()
for i in ["色泽","根蒂","敲声","纹理","脐部","触感"]:
for j in range(len(x)):
if(x[i][j] == "青绿" or x[i][j] == "蜷缩" or data[i][j] == "浊响" \
or x[i][j] == "清晰" or x[i][j] == "凹陷" or x[i][j] == "硬滑"):
x[i][j] = 1
elif(x[i][j] == "乌黑" or x[i][j] == "稍蜷" or data[i][j] == "沉闷" \
or x[i][j] == "稍糊" or x[i][j] == "稍凹" or x[i][j] == "软粘"):
x[i][j] = 2
else:
x[i][j] = 3
y = y.copy()
for i in range(len(y)):
if(y[i] == "是"):
y[i] = int(1)
else:
y[i] = int(-1)
#需要将数据x,y转化好格式,数据框dataframe,否则格式报错
x = pd.DataFrame(x).astype(int)
y = pd.DataFrame(y).astype(int)
print(x)
print(y)
3.
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2)
print(x_train)
朴素贝叶斯应用领域:
1. 欺诈检测中使用较多;
2. 一封电子邮件是否是垃圾邮件;
3. 一篇文章应该分到科技、政治,还是体育类;
4. 一段文字表达的是积极的情绪还是消极的情绪;
5. 人脸识别。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律