吴恩达2022机器学习专项课程C2W3:实验Lab_01模型评估与选择

这里写目录标题

  • 导入模块与实验环境配置
  • 回归
    • 1.构建并可视化数据集
    • 2.分割数据集
    • 3.重新绘制数据集
    • 3.特征缩放
    • 4.评估模型:计算训练集的误差
    • 5.评估模型:计算交叉验证集的误差
  • 添加多项式
    • 1.构建多项式特征集
    • 2.缩放特征
    • 3.使用标准化的计训练集和交叉验证集,计算它们的均方误差
    • 4.整合代码
    • 5.选择模型
    • 6.使用测试集检测泛化
  • 神经网络
    • 1.特征缩放
    • 2.构建和训练模型
  • 分类
    • 1.加载数据集
    • 2.划分数据集
    • 3.评估分类的误差
    • 4.构建和训练模型
  • 总结

导入模块与实验环境配置

首先,您将导入此实验室中所需的软件包。我们还包含了一些命令,以通过减少冗长和抑制非关键警告使后续输出更易读。
在这里插入图片描述

回归

1.构建并可视化数据集

为回归问题开发一个模型,首先构建数据集并可视化。
在这里插入图片描述
可视化数据集。在这里插入图片描述

2.分割数据集

将数据集分为训练集,交叉验证集,测试集。Scikit-learn提供了train_test_split函数,可以将数据集划分为训练集、交叉验证集和测试集。数据划分比例:60%数据用于训练集。20%数据用于交叉验证集。20%数据用于测试集。
在这里插入图片描述

3.重新绘制数据集

看看哪些点被用作训练、交叉验证或测试数据
在这里插入图片描述

3.特征缩放

(1)概述:特征缩放有助于加快模型收敛速度,特别是在输入特征具有不同数值范围时。在后续实验中,加入多项式项会使得输入特征范围更加广泛,例如 x 从 1600 到 3600,x^2从2.56百万到12.96百万。
(2)代码解释:StandardScaler()是一个特征缩放的类,这个类对象scaler_linear调用fit_transform方法计算 x_train训练集的均值和标准差,然后对数据进行标准化处理,返回标准化后的训练数据 X_train_scaled。在这里插入图片描述
能够看到x的范围缩小了,范围在-1.5和2之间。
在这里插入图片描述

初始化线性回归模型并使用标准化后的训练数据来训练模型。在这里插入图片描述

4.评估模型:计算训练集的误差

两种方式计算误差:使用 scikit-learn 提供的 mean_squared_error 函数和手动实现的 for 循环。过程就是先通过标准化后的训练集计算预测值,然后将预测值,真实值传入mean_squared_error,标准化后的训练集误差为406。
在这里插入图片描述

5.评估模型:计算交叉验证集的误差

(1)概述:使用 z-score 标准化时要使用训练集的均值和标准差对交叉验证集进行标准化,不能使用交叉验证集自身的均值和标准差,这样预测不会出错。在对交叉验证集进行标准化时,应使用 StandardScalertransform() 方法,而不是 fit_transform() 方法。 fit_transform() 计算的是交叉验证集的均值和标准差,使用transform() 用计算好的均值和标准差对验证集数据进行标准化。

(2)代码解释:使用训练集的实例对象scaler_linear调用 transform() ,这样就是使用训练集的均值和标准差计算验证集的标准化。然后使用训练好的线性回归模型对标准化后的交叉验证集 X_cv_scaled 进行预测,结果存储在 yhat 中。交叉验证集的误差为551。在这里插入图片描述

添加多项式

使用直线模型可能不合适,因为 y 在 x 增加时趋于平缓。建议尝试添加多项式特征以改善模型性能,虽然代码大部分不变,但会增加一些预处理步骤。在这里插入图片描述

1.构建多项式特征集

首先实例化 PolynomialFeatures类,对象poly,将训练集的平方值添加为新特征。然后用poly.fit_transform对训练集进行转换,生成包含原始特征和其平方的新训练集。最后,预览新训练集的前5个元素,展示每个样本的原始特征和平方特征。左侧是原始特征x的值,有右侧是x平方特征。
在这里插入图片描述

2.缩放特征

在这里插入图片描述

3.使用标准化的计训练集和交叉验证集,计算它们的均方误差

初始化回归模型,用标准化后的训练集训练模型,计算并打印训练集的均方误差(MSE),使用训练集的实例化对象poly,对交叉验证集添加多项式特征,因此不用fit_transform,直接transform。然后用scaler_poly标准化处理数据,同样用训练集的scaler_poly标准化对象。训练集的误差为49,交叉验证集的误差为87。在这里插入图片描述

4.整合代码

你会注意到,当你添加二阶多项式时,训练集和交叉验证集的均方误差(MSE)显著改善。你可能希望引入更多的多项式项,看看哪一个能提供最佳性能。如课堂上所示,你可以这样创建10个不同的模型:在这里插入图片描述
您可以创建一个循环,该循环包含之前代码单元格中的所有步骤。以下是一个实现方式,它会添加直至次数为10的多项式特征。我们将在最后进行绘图,以便于比较每个模型的结果。

代码解释:实例化多项式类对象poly和标准化类对象scaler_poly,在给训练集标准化处理时,方法都是fit_transform。然后同样的过程处理交叉验证集,就只用同样的对象调用transform。这样做的目的就是训练集和交叉验证集使用同一套标准化数据,防止预测出错。
在这里插入图片描述
代码输出:X轴表示多项式的阶数,从1到10。Y轴表示均方误差(MSE)。红色线条表示训练集的均方误差,蓝色线条表示交叉验证集的均方误差。低阶多项式(1到2):

均方误差大幅下降,模型性能显著改善。
中阶多项式(3到5):

训练集和交叉验证集的误差趋于平稳,模型在这一区间可能达到最佳性能。
高阶多项式(6到10):

训练集误差继续保持较低水平,但交叉验证集误差开始增加,表明模型开始过拟合训练数据,对新数据的泛化能力变差。
在这里插入图片描述

5.选择模型

np.argmin(cv_mses) 返回列表 cv_mses 中最小值的索引,这个索引对应于交叉验证均方误差(CV MSE)最小的模型。
+1 是因为多项式阶数从1开始,而列表索引从0开始,所以需要加1来得到实际的多项式阶数。
在这里插入图片描述

6.使用测试集检测泛化

您可以通过计算测试集的均方误差(MSE)来公布模型的泛化误差。像往常一样,您应该以与训练集和交叉验证集相同的方式对测试数据进行转换。
在这里插入图片描述

神经网络

模型选择的过程也适用于选择不同架构的神经网络。由于神经网络可以学习非线性关系,因此不用添加多项式,因此还是使用原来的x_train,x_cv,x_test,degree设置为1表示保留原始特征,因此前后转换的内容一致,这里是为了方便以后自行查看多项式而保留的代码。
在这里插入图片描述

1.特征缩放

请注意,在交叉验证集和测试集中,使用的是从训练集中计算的均值和标准差,只需使用 transform(),而不是 fit_transform()。
在这里插入图片描述

2.构建和训练模型

构建模型的代码
在这里插入图片描述
遍历构建的3个模型,对每个模型如下操作:编译并使用特征缩放后的训练集训练模型,然后使用模型计算训练集的预测值和交叉验证集的预测值,在调用mean_squared_error计算两个集的均方误差,最后打印每个模型训练集的均方误差。
在这里插入图片描述
在这里插入图片描述
我们可以通过训练集和交叉验证集的均方误差大小,来选择模型,然后通过测试集检测模型的泛化能力,实验中的意思是它选择了模型3,然后问你是否同意这个选择,结果自然是模型3不够好,误差太大,泛化能力太弱。
在这里插入图片描述

分类

分类任务中进行模型评估和选择。过程将类似,主要区别在于误差的计算。

1.加载数据集

训练样本200个,特征2个。加载一个用于二元分类任务的数据集。
在这里插入图片描述
可视化数据集
在这里插入图片描述

2.划分数据集

和之前的方式一致,使用train_test_split将数据集划分训练集,交叉验证集,测试集。
在这里插入图片描述

3.评估分类的误差

(1)概述:在之前关于回归模型的部分,您使用均方误差来衡量模型的表现。在分类任务中,您可以通过计算模型错误分类的数据比例来得到类似的度量。例如,如果您的模型在5个样本中做出了2个错误预测,那么您将报告 40% 或 0.4 的误差。
(2)代码解释:代码举了一个简单的例子,用5个数和阈值,假设了预测值,例如[0.2, 0.6, 0.7, 0.3, 0.8]的预测值为[0,1,1,0,1],然后又列出了真实值[1,1,1,1,1],对比这两个数组,如果不一致,则错误累加1,最终用累加的错误/预测数量,即为错误分类比例。比例越高,表示模型分类误差越大。
在这里插入图片描述

4.构建和训练模型

(1)概述:这里正式开始构建模型,为了减少误差(上周的改良softmax代码的内容),模型的输出层使用 linear 激活函数(而不是 sigmoid),然后在声明模型的损失函数时设置 from_logits=True。由于这是一个二元分类问题,将使用 binary crossentropy loss。训练后,您将使用 sigmoid函数将模型输出转换为概率。然后,您可以设置一个阈值,并从训练集和交叉验证集中获得错误分类示例的比例。
(2)代码解释:步骤基本上都是一致的,只是预测的步骤多了一个tf.math.sigmoid,意思是把模型输出转换成概率,因为输出层使用linear,因此我们要转换输出值。
在这里插入图片描述
在这里插入图片描述
从上面的输出中,您可以选择表现最好的模型。如果交叉验证集上的错误相同,那么可以选择训练集错误较低的模型。这里选择模型2并计算它的测试集误差。
在这里插入图片描述

总结

本篇实验只是描述了回归问题,分类问题,以及神经网络如何使用训练集,交叉验证集,测试集,然后通过交叉验证集误差选择模型,通过测试集误差评估模型,下一篇会详细描述当发现模型的这种误差时,应该如何解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/701737.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建一个简单的深度神经网络

目录 一、引入所需要的库 二、制作数据集 三、搭建神经网络 四、训练网络 五、测试网络 本博客实验环境为jupyter 一、引入所需要的库 torch库是核心,其中torch.nn 提供了搭建网络所需的所有组件,nn即神经网络。matplotlib类似与matlab&#xff0…

136G全国1m土地覆盖数据

数据是GIS的血液! 我们现在为你分享一个136G的全国土地覆盖数据,该数据的分辨率为1米,你可以在文末查看领取方法。 数据概况 为满足对更精确地感知国土面积的需求,来自武汉大学和中国地质⼤学的团队利用低成本的激光扫描仪&…

SAP CS01/CS02/CS03 BOM创建维护删除BAPI使用及增强改造

BOM创建维护删除相关BAPI的使用代码参考示例,客户电脑只能远程桌面,代码没法复制粘贴出来,只能贴图。 创建及修改BAPI: CSAP_MAT_BOM_MAINTAIN。 删除BAPI: CSAP_MAT_BOM_DELETE。 改造BAPI: CSAP_MAT_BOM_MAINTAIN 改造点1:拷…

[LitCTF 2023]Virginia(变异凯撒)

题目: 首先利用网站进行维吉尼亚解密(第一段和第二段密钥不同,两段无关,可只解密第二段) 第二段解密结果: Please send this message to those people who mean something to you,to those who have touch…

雪球产品可能要远离普通人了

最近有消息说,在年初发生大规模敲入事件后,雪球产品的购买门槛可能从300w提升至1000w。 那么在这个时间,了解一下雪球产品到底是什么,运行原理是什么。 第一种 经典雪球 经典雪球比较容易理解,设定好了固定的敲出条件…

Java从放弃到继续放弃

并发编程 为什么需要多线程? 由于硬件的发展,CPU的核数增多,如果仍然使用单线程对CPU资源会造成浪费。同时,单线程也会出现阻塞的问题。所以,选择向多线程转变。 多线程的使用使得程序能够并行计算,提高计…

HTTPS请求阶段图解分析

HTTPS请求阶段分析 请求阶段分析 请求阶段分析 一个完整、无任何缓存、未复用连接的 HTTPS 请求需要经过以下几个阶段: DNS 域名解析、TCP 握手、SSL 握手、服务器处理、内容传输。 一个 HTTPS 请求共需要 5 个 RTT 1 RTT(域名解析) 1 RTT…

当你的AirPods没声音或有异常时怎么办?这里提供几个解决办法

你的AirPods听起来比以前安静吗?一个AirPod的声音比另一个大吗?这里有一些技巧可以帮助你提高音量,消除与音量相关的问题。 调整AirPods的音量 在我们深入研究修复AirPods的更技术性方法之前,让我们先检查一下它们是否处于最佳音量水平,并在你尝试更改音量时正确响应。如…

C语言入门系列:变量 —— 存储数据的容器

1. 变量及其作用 想象一下,你正在编写一个程序来记录学生的成绩。你需要一个地方来暂时存放这些成绩,这就是变量的用武之地。 变量不仅可以存储数值,还能保存字符、布尔值等多种数据类型,使你的程序能够处理多样化的信息。 代码…

vue3中使用defineProps、defineEmits和defineExpose

一、defineProps 父组件通过 v-bind 绑定一个数据&#xff0c;然后子组件通过 defineProps 接受传过来的值。 父组件&#xff1a; <template><StudyDefineProps :title"title" /> </template><script setup lang"ts"> import { r…

如何设置EVM/IMA密钥即如何生成签名密钥和证书

为生成和使用签名密钥来配置 IMA&#xff0c;以下是详细步骤&#xff0c;包括如何生成签名密钥和证书。 1. 生成签名密钥和证书 首先&#xff0c;我们需要一个私钥和一个自签名证书。我们将使用 OpenSSL 来生成这些密钥和证书。 生成私钥 openssl genpkey -algorithm RSA -…

k8s之HPA,命名空间资源限制

一、HPA 的相关知识 HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&#xff0c;HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量。 &#xff08;…

idea ctrl+shift+f 全局搜索失效的解決方法

一定是輸入法的問題&#xff0c;而且是簡繁輸入快捷鍵的問題 你看我按了ctrlshiftf 之后直接打出来繁体字了。微软拼音的解决方法如下&#xff1a; 打开微软拼音输入法设置 关闭它

【稳定检索/投稿优惠】2024年心理健康与社会科学国际会议(MHSS 2024)

2024 International Conference on Mental Health and Social Sciences 2024年心理健康与社会科学国际会议 【会议信息】 会议简称&#xff1a;MHSS 2024截稿时间&#xff1a;点击查看大会地点&#xff1a;中国三亚会议官网&#xff1a;www.icmhss.com会议邮箱&#xff1a;mhs…

刷代码随想录有感(101):动态规划——有障碍的最短路径

题干&#xff1a; 代码&#xff1a; class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m obstacleGrid.size();int n obstacleGrid[0].size();if(obstacleGrid[0][0] 1 || obstacleGrid[m - 1][n - 1] 1)r…

python-docx初探——如何用python新建world—添加段落、标题、表格

python-docx初探&#x1f680; 在项目中需要用到使用代码来编写一些结构化的文档&#xff0c;所以这里就需要涉及到一些需要用代码写world的一些工作&#xff0c;经过简单了解&#xff0c;python操作world最主要使用的就是python-docx文档&#xff0c;所以这次就先学一下这个库…

便民智慧小程序源码系统 同城信息+商家联盟+生活电商 功能强大 带完整的安装代码包以及搭建部署教程

系统概述 便民智慧小程序源码系统是一个高度集成化的本地化服务平台解决方案&#xff0c;它融合了同城信息发布、商家联盟管理和生活电商平台三大核心模块&#xff0c;旨在打造一个全方位、多维度的生活服务生态系统。该系统采用先进的前后端分离架构&#xff0c;支持快速响应…

Cartographer学习笔记

Cartographer 是一个跨多个平台和传感器配置提供 2D 和 3D 实时同步定位和地图绘制 (SLAM) 的系统。 1. 文件关系 2. 代码框架 common: 定义了基本数据结构和一些工具的使用接口。例如&#xff0c;四舍五入取整的函数、时间转化相关的一些函数、数值计算的函数、互斥锁工具等…

变量的基本原理

目录 注意&#xff1a; 程序中 号的使用 数据类型 string类 变量相当于内存中一个数据存储空间的表示&#xff0c;你可以把变量看做是一个房间的门牌号&#xff0c;通过门牌号我们可以找到房 间&#xff0c;而通过变量名可以访问到变量(值)。 int age 30; double score …

iFlyCode:AI智能编程助手引领未来软件开发新趋势

体验地址 在当前软件行业飞速发展的背景下&#xff0c;开发效率和代码质量成为了衡量软件工程师工作效能的两大关键指标。为了应对日益增长的市场需求和紧迫的发布时间&#xff0c;科大讯飞推出了iFlyCode2.0——一款集AI技术于一身的智能编程助手&#xff0c;旨在引领未来软件…