首页 > 其他分享 >10.17

10.17

时间:2025-01-02 15:46:13浏览次数:1  
标签:score 训练 算法 train 测试 test 10.17

实验六:朴素贝叶斯算法实现与测试

一、实验目的

 

深入理解朴素贝叶斯的算法原理,能够使用 Python 语言实现朴素贝叶斯的训练与测试, 并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样); (2)使用训练集训练朴素贝叶斯分类算法; (3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择; (4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验六的 部分。

 

三、算法步骤、代码、及结果

   1. 算法伪代码

算法名称:基于朴素贝叶斯的鸢尾花数据集分类及性能评估

输入

 

鸢尾花数据集(包含特征数据以及对应的类别标签)

步骤



  1. 数据准备阶段
    •  sklearn.datasets 库中加载鸢尾花数据集,提取特征数据赋值给变量 X,类别标签赋值给变量 y
    • 使用留出法,按照测试集占总样本的 33%(即 1/3)比例,将数据集划分为训练集(X_trainy_train)和测试集(X_testy_test),设置随机种子为 42 并通过 stratify=y 保证训练集和测试集的类别分布与原始数据集相似,随后分别打印训练集和测试集的大小(形状信息)。
  2. 模型构建阶段
    • 创建高斯朴素贝叶斯分类模型实例 nb_model
    • 使用训练集数据(X_trainy_train)对 nb_model 模型进行训练。
  3. 交叉验证准备阶段
    • 构建一个用于评估模型性能的指标字典 scoring,其中包含准确度精度召回率“F1 四个指标,分别通过 make_scorer 函数结合对应的评估函数(如 accuracy_score 等)来定义,计算精度、召回率、F1 值时采用 'weighted' 平均方式。
  4. 交叉验证阶段
    • 运用五折交叉验证方法,针对 nb_model 模型在训练集(X_trainy_train)上进行性能评估,传入定义好的评估指标字典 scoring,将交叉验证的详细结果存储在 cv_results 变量中。
    • 遍历 scoring 字典中的每个指标名称,打印输出对应指标在交叉验证中的均值(保留四位小数,从 cv_results 中提取 test_ 开头加上指标名称对应的结果求平均得到)。
  5. 测试集性能评估阶段
    • 利用训练好的 nb_model 模型对测试集(X_testy_test)进行预测,得到预测结果 y_pred
    • 打印输出测试集的分类报告,通过 classification_report 函数传入测试集的真实标签 y_test 和预测标签 y_pred,同时显示类别名称(取自鸢尾花数据集的 target_names),以展示详细的分类性能情况。

输出



  1. 训练集和测试集的大小(形状信息)。
  2. 五折交叉验证中准确度精度召回率“F1 四个指标各自的均值(保留四位小数)。
  3. 测试集的分类报告,包含精确率、召回率、F1 值等详细分类性能指标情况以及类别名称。

请描述上述Python代码的主要功能。

朴素贝叶斯算法的优缺点是什么?

基于准确率,选择最佳的机器学习算法的方法是?

   2. 算法主要代码

完整源代码\调用库方法(函数参数说明)

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score, cross_validate
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score, classification_report

# 1. 加载 Iris 数据集
iris = load_iris()
X = iris.data
y = iris.target

# 2. 使用留出法分割数据集,33% 为测试集,保持同分布
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)
print("训练集大小:", X_train.shape)
print("测试集大小:", X_test.shape)

# 3. 训练朴素贝叶斯分类算法
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)

# 4. 使用五折交叉验证评估模型性能
scoring = {
    '准确度': make_scorer(accuracy_score),
    '精度': make_scorer(precision_score, average='weighted'),
    '召回率': make_scorer(recall_score, average='weighted'),
    'F1值': make_scorer(f1_score, average='weighted')
}

cv_results = cross_validate(nb_model, X_train, y_train, cv=5, scoring=scoring)

# 输出每个指标的均值
print("\n交叉验证结果:")
for metric in scoring.keys():
    print(f"{metric}:{np.mean(cv_results['test_' + metric]):.4f}")

# 5. 使用测试集测试模型的性能
y_pred = nb_model.predict(X_test)

# 打印测试集的分类报告
print("\n测试集分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

 

 

   3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

 

四、实验结果分析

1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

 

2. 对比分析

模型在 iris 数据集上的表现非常出色。训练集的交叉验证结果显示,准确度为 0.9700,精度为 0.9712,召回率为 0.9700,F1 值为 0.9699,表明模型能够很好地预测训练数据。

在测试集上,模型的整体准确度为 0.92。具体而言,setosa 类别的预测表现完美(精度和召回率均为 1.00),而对于 versicolor 和 virginica 类别,虽然精度和召回率相对较高,但仍存在一定的误分类和漏判现象。versicolor 的精度为 0.84,召回率为 0.94,virginica 的精度为 0.93,召回率为 0.82。

总体而言,模型在训练集和测试集上表现良好,具备较强的分类能力,但在处理 versicolor 和 virginica 类别时仍有提升空间。可以通过调整模型参数或进行特征工程来进一步改善这两个类别的预测性能。

 

 

 

五、心得体会

 

在实现与测试朴素贝叶斯算法的过程中,深感其简洁高效。算法基于概率理论,实现起来相对容易。通过对数据的处理和模型训练,看到了它在分类任务中的出色表现。同时,也认识到其假设的局限性。测试过程让我学会了如何评估模型性能,为进一步优化提供了方向。这次经历加深了我对机器学习算法的理解,也提升了实践能力。

标签:score,训练,算法,train,测试,test,10.17
From: https://www.cnblogs.com/jais/p/18647893

相关文章

  • 10.17
    今天没课,终于可以好好放松一下了。我睡了个懒觉,起来后慢悠悠地洗漱,然后给自己做了一份简单的早餐,煎了个鸡蛋,烤了片面包,冲了杯咖啡,坐在阳台上,享受着温暖的阳光和宁静的时光。吃完早餐后,我打开电脑,浏览了一些自己感兴趣的网站,看看最新的科技动态和娱乐新闻,感觉自己和外面的世界又重......
  • 10.17日报
    今天进行了机器学习B的实验,以下为实验内容:上机实验一:数据准备与模型评估1、实验目的熟悉Python的基本操作,掌握对数据集的读写实现、对模型性能的评估实现的能力;加深对训练集、测试集、N折交叉验证、模型评估标准的理解。2、实验内容(1)利用pandas库从本地读取iris数据......
  • 2024.10.17(周四)
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=......
  • Windows出现出现身份验证错误。要求的函数不受支持 远程计算机: 10.17.1.2 这可能是由
    Windows出现出现身份验证错误。要求的函数不受支持远程计算机:10.17.1.2这可能是由于CredsSP加密数据库修正。若要了解详细信息,请访问https://go.microsoft.com/fwlink/?linkid=866660解决方案解决方法第一步点开控制面板选择系统与安全第二步选择“允许远程访问......
  • 10.17
    异常捕捉 publicclassCatchWho{publicstaticvoidmain(String[]args){try{try{thrownewArrayIndexOutOfBoundsException();}catch(ArrayIndexOutOfBoundsExceptione){Syst......
  • 10.17
    一个程序如果碰到了异常不处理,程序就会立即停止,异常处理就是在异常发生的情况下启动类似于备用方案使程序继续运行Java中的异常捕获结构由try,catch,finally三部分构成,其中,try和catch是必须同时存在的。try中的代码就是可能存在异常的代码,catch中的代码就是try中有异常时的执行方......
  • 10.17
    请看以下代码,你发现了有什么特殊之处吗? 下面两个函数名字都叫square,但是他们的参数类型不同,所以程序不会报错,这是函数的重载,static关键字修饰的函数一个程序里只能有一个,但是这是函数的重载,所以两个虽然都用static修饰但是都能叫相同的名字......
  • 大二快乐日记10.17
    1.配置多个<servlet-mapping>元素Servlet2.5规范之前,<servlet-mapping>元素只允许包含一个<url-pattern>子元素,若要实现Servet的多重映射,只能通过配置多个<servlet-mapping>元素实现。以serveltDemo为例,在web.xml中配置两个<servlet-mapping>元素,代码如下所示......
  • 10.17
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Vue-指令-案例</title><......
  • 2023.10.17
    第13节:估算这一节强调了估算在软件开发中的重要性,并提供了一些建议来提高估算的准确性。1.通过学习估算并发展直觉,你可以展现出一种魔法般的能力,来确定任务的可行性。2.让估算更准确的单位值和描述方法是至关重要的,比如将时间估算从粗略的“大约6个月”改进为更精确的“130个......