首页 > 其他分享 >10.19

10.19

时间:2025-01-02 15:44:41浏览次数:1  
标签:F1 score 10.19 print train 测试 test

实验八:随机森林算法实现与测试

一、实验目的

 

深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现 随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

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

 

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

   1. 算法伪代码

算法名称:基于随机森林的鸢尾花数据集分类及性能评估

输入

 

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

步骤



  1. 数据准备阶段
  • o 从 sklearn.datasets 库中加载鸢尾花数据集,提取特征数据赋值给变量 X,类别标签赋值给变量 y。
  • o 使用留出法,按照测试集占总样本的 33%(即 1/3)比例,将数据集划分为训练集(X_train、y_train)和测试集(X_test、y_test),设置随机种子为 42 并通过 stratify=y 保证训练集和测试集的类别分布与原始数据集相似,随后分别打印训练集和测试集的大小(形状信息)。
  1. 模型构建与训练阶段
  • o 创建随机森林分类器实例 rf_classifier,设置随机数生成器的种子为 42。
  • o 使用训练集数据(X_train、y_train)对 rf_classifier 模型进行训练。
  1. 交叉验证阶段
  • o 针对 rf_classifier 模型在训练集(X_train、y_train)上进行五折交叉验证,分别使用以下评估指标:
    • 准确度:调用 cross_val_score 函数,设置 scoring='accuracy',将得到的每次交叉验证的准确度分数存储在 accuracies 变量中。
    • 精度:调用 cross_val_score 函数,设置 scoring='precision_macro',将得到的每次交叉验证的精度分数存储在 precisions 变量中。
    • 召回率:调用 cross_val_score 函数,设置 scoring='recall_macro',将得到的每次交叉验证的召回率分数存储在 recalls 变量中。
    • F1 值:调用 cross_val_score 函数,设置 scoring='f1_macro',将得到的每次交叉验证的 F1 值分数存储在 f1_scores 变量中。
    • o 打印输出五折交叉验证的各指标均值,分别计算并打印 “准确度均值”(即 np.mean(accuracies))、“精度均值”(即 np.mean(precisions))、“召回率均值”(即 np.mean(recalls))、“F1 值均值”(即 np.mean(f1_scores))。
  1. 测试集性能评估阶段
  • o 利用训练好的 rf_classifier 模型对测试集(X_test、y_test)进行预测,得到预测结果 y_test_pred。
  • o 分别计算测试集的性能指标:
    • 准确度:使用 accuracy_score 函数对比 y_test 与 y_test_pred,将结果赋值给 test_accuracy。
    • 精度:使用 precision_score 函数,采用 'macro' 平均方式对比 y_test 与 y_test_pred,将结果赋值给 test_precision。
    • 召回率:使用 recall_score 函数,采用 'macro' 平均方式对比 y_test 与 y_test_pred,将结果赋值给 test_recall。
    • F1 值:使用 f1_score 函数,采用 'macro' 平均方式对比 y_test 与 y_test_pred,将结果赋值给 test_f1。
    • o 打印输出测试集的各项性能指标,包括 “准确度”(即 test_accuracy)、“精度”(即 test_precision)、“召回率”(即 test_recall)、“F1 值”(即 test_f1)。
  1. 测试集分类报告输出阶段
  • o 打印输出测试集的分类报告,通过 classification_report 函数传入测试集的真实标签 y_test 和预测标签 y_test_pred,同时显示类别名称(取自鸢尾花数据集的 target_names),以展示详细的分类性能情况。
  1. 预测结果对比分析阶段
  • o 遍历测试集的样本索引,逐个打印输出每个样本的真实标签(通过 iris.target_names[y_test[i]] 获取)和预测标签(通过 iris.target_names[y_test_pred[i]] 获取),以对比分析预测结果与真实标签的差异情况。

输出



  1. 训练集和测试集的大小(形状信息)。
  2. 五折交叉验证的 “准确度均值”、“精度均值”、“召回率均值”、“F1 值均值”。
  3. 测试集的 “准确度”、“精度”、“召回率”、“F1 值” 各项性能指标。
  4. 测试集的分类报告,包含精确率、召回率、F1 值等详细分类性能指标情况以及类别名称。
  5. 测试集样本预测与真实标签的对比情况。

朴素贝叶斯分类的原理是什么?

随机森林模型的工作原理是什么?

交叉验证的目的是什么?

 

 

   2. 算法主要代码

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

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report

# (1) 从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集
iris = load_iris()
X = iris.data
y = iris.target

# 使用留出法分割数据集,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)

# (2) 使用训练集训练随机森林分类算法
rf_classifier = RandomForestClassifier(random_state=42)
rf_classifier.fit(X_train, y_train)

# (3) 使用五折交叉验证评估模型性能(准确度、精度、召回率和 F1 值)
# 定义评估指标
accuracies = cross_val_score(rf_classifier, X_train, y_train, cv=5, scoring='accuracy')
precisions = cross_val_score(rf_classifier, X_train, y_train, cv=5, scoring='precision_macro')
recalls = cross_val_score(rf_classifier, X_train, y_train, cv=5, scoring='recall_macro')
f1_scores = cross_val_score(rf_classifier, X_train, y_train, cv=5, scoring='f1_macro')

# 输出评估结果
print("\n五折交叉验证结果:")
print("准确度均值:", np.mean(accuracies))
print("精度均值:", np.mean(precisions))
print("召回率均值:", np.mean(recalls))
print("F1 值均值:", np.mean(f1_scores))

# (4) 使用测试集,测试模型的性能
y_test_pred = rf_classifier.predict(X_test)

# 计算测试集的性能指标
test_accuracy = accuracy_score(y_test, y_test_pred)
test_precision = precision_score(y_test, y_test_pred, average='macro')
test_recall = recall_score(y_test, y_test_pred, average='macro')
test_f1 = f1_score(y_test, y_test_pred, average='macro')

print("\n测试集的性能指标:")
print("准确度:", test_accuracy)
print("精度:", test_precision)
print("召回率:", test_recall)
print("F1 值:", test_f1)

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

# 进一步分析预测结果
print("\n测试集样本预测与真实标签对比:")
for i in range(len(y_test)):
    print(f"真实标签: {iris.target_names[y_test[i]]}, 预测标签: {iris.target_names[y_test_pred[i]]}")

 

 

 

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

 

 

四、实验结果分析

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

 

 

 

2. 对比分析

通过对模型训练与测试结果深入剖析可知,当前的分类模型展现出了较为出色的性能。在训练集层面,运用五折交叉验证法评估模型所获结果令人瞩目,其准确度高达 0.95,精度达到 0.96,召回率为 0.95,F1 值同样稳定在 0.95,这一系列数据强有力地证明了模型在判别各类鸢尾花品种时具备极高的有效性。

 

切换至测试集视角,尽管模型性能相较于训练集出现了些许下滑,准确度降至 0.90,精度为 0.91,召回率达 0.90,F1 值也维持在 0.90,但从整体来看,该模型依旧彰显出了良好的泛化本领,能够较好地适应未知数据。

 

详细研读分类报告后发现,模型在识别 Setosa 这一类别时堪称完美,精度与召回率双双达到 1.00 峰值。不过,在面对 Versicolor 和 Virginica 类别时,模型表现则暴露出一定短板,其中 Virginica 类别的召回率仅为 0.76,处于较低水平,这清晰地表明模型在对该类别的识别精准度上尚有较大的提升空间。

 

综合而言,现阶段模型的整体表现已然能够令人满意,不过展望未来,为了进一步攻克较难分类样本所带来的挑战,可尝试引入更为精密复杂的模型架构,精心开展超参数调优工作,亦或是运用数据增强手段扩充样本多样性,从而助力模型性能迈向新的台阶。

五、心得体会

在实现与测试随机森林算法的过程中,我深刻体会到其强大的分类能力。通过对鸢尾花数据集的处理,看到了算法在多特征数据上的优势。训练过程高效且稳定,交叉验证和测试集评估也让我了解到模型的泛化能力。这个过程不仅提升了我的编程技能,还让我对机器学习算法有了更深入的理解,激发了我进一步探索算法优化的热情。

 

标签:F1,score,10.19,print,train,测试,test
From: https://www.cnblogs.com/jais/p/18647896

相关文章

  • 10.19
    对于web的实验进行了一个应用layui框架和jQuery的登录注册界面和查看个人信息界面<%--CreatedbyIntelliJIDEA.User:29782Date:2024/5/15Time:20:38TochangethistemplateuseFile|Settings|FileTemplates.--%><%@pagecontentType="text/html;charset=......
  • 修改微信(3.9.10.19版本)系统托盘图标(傻瓜教程)
    微信版本:进行以下操作先退出微信1.iconfontLogo下载一个图标png,大小为256像素,前面颜色自己看着弄2.png转ico,转化链接(转化的网站很多不一定非要是这个)3.下载后续所需程序(ResHacker和IconWorkshopPortable)备用下载链接4.找到右击微信快捷键点击属性,打开所在位置,在文......
  • 10.19
    继承 publicclassParentChildTest{publicstaticvoidmain(String[]args){Parentparent=newParent();parent.printValue();Childchild=newChild();child.printValue();parent=child;parent.printValue();......
  • 10.19随笔
    SELECT语句用于从数据库中选取数据。SQLSELECT语句SELECT语句用于从数据库中选取数据。结果被存储在一个结果表中,称为结果集。SQLSELECT语法SELECTcolumn1,column2,...FROMtable_name;与SELECT*FROMtable_name;参数说明:column1,column2,...:要选择的字......
  • 10.19
    今日学习代码增加课程<%--CreatedbyIntelliJIDEA.TochangethistemplateuseFile|Settings|FileTemplates.--%><%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title&l......
  • 10.19
    昨天晚上,uml把自己的设计的系统按照老师的要求修改了,今天老师没评价新改的系统怎么样,等着他后续发布体育课,又是新学似的一节课数据结构,今天学了数和森林,把森林和二叉树之间的相互转换学会了,还有哈夫曼树的一点点内容,离散里面就学过离散数学,今天的课不难,但是感觉课上老师发的练习题......
  • 10.19
    动手动脑运行示例并了解Java中实现异常处理的基础知识Java提供了一套异常处理机制,通过使用try-catch-finally语句块来捕获和处理异常。try语句块包含可能发生异常的代码,catch语句块用于捕获特定类型的异常并进行处理,finally语句块用于无论是否发生异常都要执行的代码,例如释放资......
  • 10.19
    学习sql语句DML(DataManipulationLanguage)数据操作语言 一、增加insertinto--写全所有列名insertinto表名(列名1,列名2,...列名n)values(值1,值2,...值n);--不写列名(所有列全部添加)insertinto表名values(值1,值2,...值n);--插入部分数据insertinto表名......
  • 大二打卡(10.19)
    周四今天做了什么:昨天晚上,uml把自己的设计的系统按照老师的要求修改了(老师建议换一个系统),今天老师没评价新改的系统怎么样,等着他后续发布体育课,学了扣球忽然就不会发球了,又是新学似的一节课数据结构,今天学了数和森林,把森林和二叉树之间的相互转换学会了,还有哈夫曼树的一点点内......
  • 每日总结10.19
    今天的一天过得非常充实,我参加了各种不同的课程和准备了一次令人兴奋的旅行。上午,我上了UML建模语言的课程,这是软件工程中非常重要的一部分,它帮助我们理解了如何设计和规划软件系统。之后,我参加了体育课,学习了乒乓球的正手和反手技巧。这是一种有趣的锻炼,也有助于保持身体健康。......