【实验目的】
理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。
【实验内容】
针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;
熟悉sklearn库中的朴素贝叶斯算法,使用sklearn包编写朴素贝叶斯算法程序,对输入数据进行预测;
【实验报告要求】
对照实验内容,撰写实验过程、算法及测试结果;
代码规范化:命名规则、注释;
查阅文献,讨论朴素贝叶斯算法的应用场景。
色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 碍滑 | 是 |
乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 碍滑 | 是 |
乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 碍滑 | 是 |
青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 碍滑 | 是 |
浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 碍滑 | 是 |
青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
【实验过程】
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)
标签:head,end,val,proba,dataSheet,header,算法,实验,贝叶斯 From: https://www.cnblogs.com/zcqs-001/p/16880322.html