贝叶斯决策分类算法

  • 一、实验目的
  • 二、实验原理
    • 1、先验概率和类条件概率
    • 2、贝叶斯决策
  • 三、实验内容和步骤
    • 1、实验内容
    • 2、实验步骤
    • 3、程序框图
    • 4、实验样本
    • 5、实验代码
  • 四、实验结果
  • 五、实验分析

一、实验目的

(1)熟悉朴素贝叶斯决策算法。
(2)对 AllElectronics 顾客数据库查询得到先验概率和类条件概率。
(3)在样本集上编写用朴素贝叶斯算法分类的程序,对任务相关数据运行朴素贝叶斯分类算法,调试实验。
(4)写出实验报告。

二、实验原理

1、先验概率和类条件概率

先验概率:先验概率定义为训练样本集中属于CiC_iCi​类的样本(元组)数与总样本数NiN_iNi​之比,记为P(Ci)=NiNP(C_i)=\frac{N_i}{N}P(Ci​)=NNi​​。
类条件概率:类条件概率定义为训练样本集中属于CiC_iCi​类中的具有特征XXX的样本(元组)的个数nin_ini​与属于CiC_iCi​类的样本(元组)数NiN_iNi​之比,记为P(X∣Ci)=niNiP(X|C_i)=\frac{n_i}{N_i}P(X∣Ci​)=Ni​ni​​。

2、贝叶斯决策

贝叶斯决策(分类)法将样本(元组)分到CiC_iCi​类,当且仅当
P(X∣Ci)P(Ci)>P(X∣Cj)P(Cj),对1≤j≤m,j≠iP(X|C_i)P(C_i)>P(X|C_j)P(C_j), 对1\leq j\leq m, j\neq i P(X∣Ci​)P(Ci​)>P(X∣Cj​)P(Cj​),对1≤j≤m,j=i
其中,训练样本集中的样本(元组)可被分为mmm类。

三、实验内容和步骤

1、实验内容

用贝叶斯分类器对已知的特征向量 X 分类:

  1. 由 AllElectronics 顾客数据库类标记的训练样本集(元组)编程计算先验
    概率 P(Ci)和类条件概率 P(X|Ci),并在实验报告中指出关键代码的功能和实现方法;
  2. 应用贝叶斯分类法编程对特征向量 X 分类,并在实验报告中指出关键程
    序片段的功能和实现方法;
  3. 用检验样本估计分类错误率;
  4. 在实验报告中画出程序或例程的程序框图。

2、实验步骤

由于该分类问题是决定顾客是否倾向于购买计算机,即C1对应于buys_computer=yes,C2对应于 buys_computer=no,是两类的分类问题。实验步骤如下:

  1. 确定特征属性及划分:浏览所给的数据库,找出划分的特征属性;
  2. 获取训练样本:即给定的 AllElectronics 顾客数据库类标记的训练样本集
    (元组);
  3. 计算训练样本中每个类别的先验概率:P(Ci),i=1,2;
  4. 计算训练样本中类条件概率:设特征(属性)向量为 X,编程计算类条
    件概率 P(X|Ci),i=1,2;
  5. 使用分类器进行分类;

3、程序框图

4、实验样本

data.txt

5、实验代码

#!/usr/bin/env python  
# -*- coding: utf-8 -*-
#
# Copyright (C) 2021 #
# @Time    : 2022/5/30 21:26
# @Author  : Yang Haoyuan
# @Email   : 2723701951@qq.com
# @File    : Exp4.py
# @Software: PyCharmimport pandas as pd
import numpy as np
from sklearn.model_selection import KFold
import argparseparser = argparse.ArgumentParser(description='Exp4')
parser.add_argument('--mode', type=str, choices=["KFold", "train", "test"])
parser.add_argument('--k', type=int, default=7)
parser.add_argument('--AGE', type=str, choices=["youth", "middle_aged", "senior"])
parser.add_argument('--INCOME', type=str, choices=["high", "medium", "low"])
parser.add_argument('--STUDENT', type=str, choices=["yes", "no"])
parser.add_argument('--CREDIT', type=str, choices=["excellent", "fair"], default="fair")
parser.set_defaults(augment=True)
args = parser.parse_args()
print(args)# 载入数据集
def loadDataset(filename):dataSet = []with open(filename, 'r') as file_to_read:while True:lines = file_to_read.readline()  # 整行读取数据if not lines:breakp_tmp = [str(i) for i in lines.split(sep="\t")]p_tmp[len(p_tmp) - 1] = p_tmp[len(p_tmp) - 1].strip("\n")dataSet.append(p_tmp)return pd.DataFrame(dataSet, columns=["AGE", "INCOME", "STUDENT", "CREDIT", "BUY"])# 计算总样本数和各类数量
def count_total(data):count = {}group_df = data.groupby(["BUY"])count["yes"] = group_df.size()["yes"]count["no"] = group_df.size()["no"]total = count["yes"] + count["no"]return count, total# 计算各类概率
def cal_base_rates(categories, total):rates = {}for label in categories:priori_prob = categories[label] / totalrates[label] = priori_probreturn rates# 计算各类条件概率
def f_prob(data, count):likelihood = {'yes': {}, 'no': {}}# 根据AGE(youth, middle_aged, senior)和BUY(yes, no)统计概率df_group = data.groupby(['AGE', 'BUY'])try:c = df_group.size()["youth", "yes"]except:c = 0likelihood['yes']['youth'] = c / count['yes']try:c = df_group.size()["youth", "no"]except:c = 0likelihood['no']['youth'] = c / count['no']try:c = df_group.size()["middle_aged", "yes"]except:c = 0likelihood['yes']['middle_aged'] = c / count['yes']try:c = df_group.size()["middle_aged", "no"]except:c = 0likelihood['no']['middle_aged'] = c / count['no']try:c = df_group.size()["senior", "yes"]except:c = 0likelihood['yes']['senior'] = c / count['yes']try:c = df_group.size()["senior", "no"]except:c = 0likelihood['no']['senior'] = c / count['no']# 根据INCOME(high, medium, low)和BUY(yes, no)统计概率df_group = data.groupby(['INCOME', 'BUY'])try:c = df_group.size()["high", "yes"]except:c = 0likelihood['yes']['high'] = c / count['yes']try:c = df_group.size()["high", "no"]except:c = 0likelihood['no']['high'] = c / count['no']try:c = df_group.size()["medium", "yes"]except:c = 0likelihood['yes']['medium'] = c / count['yes']try:c = df_group.size()["medium", "no"]except:c = 0likelihood['no']['medium'] = c / count['no']try:c = df_group.size()["low", "yes"]except:c = 0likelihood['yes']['low'] = c / count['yes']try:c = df_group.size()["low", "no"]except:c = 0likelihood['no']['low'] = c / count['no']# 根据STUDENT(yes, no)和BUY(yes, no)统计概率df_group = data.groupby(['STUDENT', 'BUY'])try:c = df_group.size()["yes", "yes"]except:c = 0likelihood['yes']['yes'] = c / count['yes']try:c = df_group.size()["yes", "no"]except:c = 0likelihood['no']['yes'] = c / count['no']try:c = df_group.size()["no", "yes"]except:c = 0likelihood['yes']['no'] = c / count['yes']try:c = df_group.size()["no", "no"]except:c = 0likelihood['no']['no'] = c / count['no']# 根据CREDIT(excellent, fair)和BUY(yes, no)统计概率df_group = data.groupby(['CREDIT', 'BUY'])try:c = df_group.size()["excellent", "yes"]except:c = 0likelihood['yes']['excellent'] = c / count['yes']try:c = df_group.size()["excellent", "no"]except:c = 0likelihood['no']['excellent'] = c / count['no']try:c = df_group.size()["fair", "yes"]except:c = 0likelihood['yes']['fair'] = c / count['yes']try:c = df_group.size()["fair", "no"]except:c = 0likelihood['no']['fair'] = c / count['no']return likelihood# 训练
def train(train_data):# 获取各类数量和训练样本总数count, total = count_total(train_data)# 获取先验概率priori_prob = cal_base_rates(count, total)# 保存先验概率np.save("priori_prob.npy", priori_prob)# 获取各特征的条件概率feature_prob = f_prob(train_data, count)# 保存条件概率np.save("feature_prob.npy", feature_prob)print("训练完成")# 分类器
def NaiveBayesClassifier(AGE=None, INCOME=None, STUDENT=None, CREDIT=None):res = {}priori_prob = np.load('priori_prob.npy', allow_pickle=True).item()feature_prob = np.load('feature_prob.npy', allow_pickle=True).item()# 根据特征计算各类的概率for label in ['yes', 'no']:prob = priori_prob[label]prob *= feature_prob[label][AGE] * feature_prob[label][INCOME] * feature_prob[label][STUDENT] \* feature_prob[label][CREDIT]res[label] = probprint("预测概率:", res)# 选择概率最高的类作为分类结果res = sorted(res.items(), key=lambda kv: kv[1], reverse=True)return res[0][0]# 测试
def test(test_data):correct = 0for idx, row in test_data.iterrows():prob = NaiveBayesClassifier(row["AGE"], row["INCOME"], row["STUDENT"], row["CREDIT"])if prob == row["BUY"]:correct = correct + 1return correct / test_data.shape[0]# 启用k-折交叉验证
def KFoldEnabled():kf = KFold(n_splits=args.k)data_set = loadDataset("date.txt")corr = 0for train_idx, test_idx in kf.split(data_set):train_data = data_set.loc[train_idx]test_data = data_set.loc[test_idx]train(train_data)corr = corr + test(test_data)print("k折交叉验证正确率: ", corr / 7)if __name__ == '__main__':if args.mode == "KFold":KFoldEnabled()if args.mode == "train":train_data = loadDataset("date.txt")train(train_data)if args.mode == "test":'''priori_prob = np.load('priori_prob.npy', allow_pickle=True).item()print("先验概率: ", priori_prob)feature_prob = np.load('feature_prob.npy', allow_pickle=True).item()print("类条件概率: ", feature_prob)'''ret = NaiveBayesClassifier(args.AGE, args.INCOME, args.STUDENT, args.CREDIT)print("预测结果: ", ret)

四、实验结果


采用k折交叉验证进行训练和测试,k=7

训练模型

模型预测

五、实验分析

本次实验主要实现朴素贝叶斯分类算法。

贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类。由于其有着坚实的数学基础,贝叶斯分类算法的误判率是很低的。贝叶斯方法的特点是结合先验概率和后验概率,即避免了只使用先验概率的主观偏见,也避免了单独使用样本信息的过拟合现象。贝叶斯分类算法在数据集较大的情况下表现出较高的准确率,同时算法本身也比较简单。
朴素贝叶斯算法(Naive Bayesian algorithm) 在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。

这增强了朴素贝叶斯分类的鲁棒性,但是实际上,其对于属性间互相独立的假设也限制了其分类的性能。

本实验数据中并没有区分训练集和验证集,为了验证朴素贝叶斯分类器在该数据集上的性能,我采用K折交叉验证算法。最后的分类正确率只有50%,我认为这可以归咎于数据集的数量过少,导致朴素贝叶斯分类器在该任务上没有充分训练。

我将训练的数据以.npy的文件保存下来,以便在应用分类的时候直接读取参数,进行分类。

河北工业大学数据挖掘实验四 贝叶斯决策分类算法相关推荐

  1. 河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集

    河北工业大学数据挖掘实验三 应用 Apriori 算法挖掘频繁项集 一.实验目的 二.实验原理 1.Apriori 算法 2.提高频繁项集逐层产生的效率 三.实验内容和步骤 1.实验内容 2.实验步骤 ...

  2. 河北工业大学数据挖掘实验五 k-means聚类算法

    k-均值聚类算法 一.实验目的 二.实验原理 1.k-均值聚类 2.终止条件 三.实验内容和步骤 1.实验内容 2.实验步骤 3.程序框图 4.实验样本 5.实验代码 四.实验结果 五.实验分析 一. ...

  3. 河北工业大学数据挖掘实验一 数据预处理

    河北工业大学数据挖掘实验一 数据预处理 一.实验目的 二.实验原理 1.数据预处理 2.数据清理 3.数据集成 4.数据变换 5.数据归约 三.实验内容和步骤 1.实验内容 2.实验步骤 3.程序框图 ...

  4. 南京邮电大学数据结构实验四(各种排序算法)

    南邮数据结构实验报告四----各种排序算法 一.各类算法 (一)简单选择排序 (二)直接插入排序 (三)冒泡排序 (四)快速排序 (五)两路合并排序 (六)堆排序 二.全部排序整合+时间测试 三.算法 ...

  5. HBU-NNDL 实验四 线性分类

    第3章 线性分类 线性回归和线性分类之间有着很大的联系,从某种意义上来说,线性分类就是线性回归函数使用激活函数的结果.同时也可以看成是线性回归降维的结果.对于一个线性回归函数,我们可以通过添加全局函数 ...

  6. NNDL实验四 线性分类

    前言:在做这次实验的时候是在Kaggle上运行的,因为Kaggle上有小小的免费的GPU加速,同时小小的体会到了在训练模型的时候,GPU加速和CPU加速之间的一种区别.Kaggle是一个很好的网站,有 ...

  7. 人工智能实验三:分类算法实验

    一.实验目的 1.巩固4种基本的分类算法的算法思想:朴素贝叶斯算法,决策树算法,人工神经网络,支持向量机算法: 2.能够使用现有的分类器算法代码进行分类操作: 3.学习如何调节算法的参数以提高分类性能 ...

  8. 【数据挖掘实验】关联规则——Apriori算法

    一.实验项目名称: 关联规则--Apriori算法 二.实验目的与要求: 在软件方面:会用Clementine软件进行关联规则分析. 在理论方面:Apriori算法. 三.实验原理: 1.Aprior ...

  9. NNDL 实验四 线性分类

    文章目录 第3章 线性分类 3.1 基于Logistic回归的二分类任务 3.1.1 数据集构建 3.1.2 模型构建 3.1.3 损失函数 3.1.4 模型优化 3.1.4.1 梯度计算 3.1.4 ...

最新文章

  1. ElectronOCR:基于Electron+React+Tesseract的MACOS下的OCR工具
  2. elasticsearch数据长期保存的方案
  3. 24个笔画顺序表_400个生字笔顺表,孩子照着写,家长省心省力!
  4. LeetCode 1695. 删除子数组的最大得分(前缀和+哈希+双指针)
  5. UI组件-UITabbarController
  6. FPGA的一些细节(持续更新)
  7. android meminfo,Android中dumpsys meminfo与/proc/meminfo获取空闲内存不一致的问题
  8. 【软考】程序设计语言复习指南
  9. 机器学习(二)——xgboost(实战篇)Pima印第安人数据集上的机器学习-分类算法(根据诊断措施预测糖尿病的发病)
  10. mp3 资源文件压缩
  11. 神州数码交换机配置基本命令
  12. 中望3d快捷键命令大全_室内设计3D快捷键 CAD命令
  13. display: flex自我理解
  14. 退出计算机用户的快捷方式,如何注销计算机或从Windows 10注销
  15. Java高级软件工程师面试考纲总结
  16. 建筑CAD基础设计【3】
  17. QQ使用的一个小问题
  18. idea字体变成繁体
  19. svn: OPTIONS of 'https://lym-pc/svn/CRM': Could not resolve hostname 'lym-pc'
  20. 录音如何生成二维码?

热门文章

  1. 上下文切换频繁,导致load average 过高
  2. Arduino三位数码管
  3. 马化腾微信朋友圈惋惜小黄车 网友们狂赞 并替Pony搞起情怀大接龙
  4. mysql的url参数_mysql-url参数
  5. HttpUrlConnection与HttpClient的认识(六) -实际应用之刷网络流量
  6. 深度报告 | RGP2019年度中国RPA市场调研:厂商、机遇、规模、上升空间、市场反馈......
  7. mysql 错误码: 1267
  8. 华为支付切换到某国家后支付报错60003
  9. JQuery语法知识
  10. 北京大学软微学院计算机技术,北京大学软件与微电子学院计算机技术(专业学位)保研夏令营...