【实验目的】
理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。
【实验内容】
针对下表中的数据,编写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.打印数据表
# 将预测结果添加到数据表新列 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. 人脸识别。
标签:head,end,val,proba,dataSheet,算法,实验,贝叶斯,data From: https://www.cnblogs.com/shenjie3186588507-/p/16884145.html