政安晨:政安晨:机器学习快速入门(三){pandas与scikit-learn} {模型验证及欠拟合与过拟合}

这一篇中,咱们使用Pandas与Scikit-liarn工具进行一下模型验证,之后再顺势了解一些过拟合与欠拟合,这是您逐渐深入机器学习的开始!


模型验证

评估您的模型性能,以便测试和比较其他选择。

在上一篇中,您已经建立了一个模型。但它有多好呢?

在本篇中,你将学会使用模型验证来衡量模型的质量。衡量模型质量是不断改进模型的关键。

什么是模型验证

还是得先讲一下概念:

模型验证(Model Validation)是机器学习中的一个重要步骤,用于评估和验证训练好的机器学习模型的性能和准确性。

在模型训练完成后,模型验证可以帮助我们确定模型是否具有良好的泛化能力,即应用于新数据时是否能够准确预测。模型验证通常在一个独立的测试数据集上进行,该数据集与训练数据集不重叠。 模型验证的目的是检查模型的预测结果与实际观测值之间的差异,并使用适当的指标来量化模型的性能。

常用的模型验证方法包括:准确率(accuracy)、精确率(precision)、召回率(recall)、F1 值等。这些指标可以帮助评估模型在不同任务和数据集上的表现,并帮助我们选择最合适的模型。 除了使用单一的测试数据集进行模型验证外,还可以使用交叉验证(cross-validation)等技术来更全面地评估模型的性能。交叉验证将数据集划分为多个子集,然后使用其中一部分数据进行验证,其他部分数据进行训练。通过重复这个过程,可以获得多个模型验证结果,并计算其平均值,从而更准确地评估模型的性能。 总之,模型验证是机器学习中必不可少的一环,它可以帮助我们评估和选择最好的模型,并为实际应用提供可靠的预测能力。

你将想评估你构建的几乎每个模型。在大多数(尽管不是所有)应用中,模型质量的相关衡量标准是预测准确度。换句话说,模型的预测结果是否接近实际发生的情况。

很多人在衡量预测准确度时犯了一个巨大的错误。他们使用训练数据进行预测,并将这些预测与训练数据中的目标值进行比较。你将会在接下来看到这种方法的问题以及如何解决它,但我们先来思考一下如何做这个。

你首先需要将模型质量总结为一种可理解的方式。如果你比较了对于1万个房屋的预测值和实际值,你可能会发现好坏参半的预测。浏览1万个预测和实际值的列表是没有意义的。我们需要将其总结为一个单一的度量标准。

有很多用于总结模型质量的度量标准,但我们会从一个叫做均方绝对误差(Mean Absolute Error,也称为MAE)的度量标准开始。让我们逐个解释这个度量标准,从最后一个词开始,误差。

接着上一篇看,每个房屋的预测误差是:

error=actual−predicted

所以,如果一所房子的价格是15万元,而你预测它的价格是10万元,那么误差就是5万元。

"使用 MAE 指标时,我们取每个误差的绝对值。这将每个误差转换为正数。然后我们取这些绝对误差的平均值。这是我们衡量模型质量的标准。用简单的词来说,可以称之为:

平均而言,我们的预测误差大约为X。

要计算MAE,我们首先需要一个模型。该模型在下面一个隐藏的单元格中构建,您可以通过点击代码按钮来查看。

# Data Loading Code Hidden Here
import pandas as pd# Load data
melbourne_file_path = './melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
# Filter rows with missing price values
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# Choose target and features
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]from sklearn.tree import DecisionTreeRegressor
# Define model
melbourne_model = DecisionTreeRegressor()
# Fit model
melbourne_model.fit(X, y)

对这段代码陌生没关系,先大概浏览一下我的上两篇文章:

政安晨:机器学习快速入门(一){基于Python与Pandas}icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136046028政安晨:机器学习快速入门(二){基于Python与Pandas} {建立您的第一个机器学习模型}icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136047590接下来,咱们执行上述代码:

一旦我们有了一个模型,下面就是我们如何计算平均绝对误差的方法:

from sklearn.metrics import mean_absolute_errorpredicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)

关于“样本内”得分的问题

刚刚计算的度量可以称为“样本内”分数。我们在构建模型和评估模型时使用了同一个房屋样本。以下是为什么这样做不好。

想象一下,在庞大的房地产市场中,门的颜色与房价无关。

然而,在你用来构建模型的数据样本中,所有有绿色门的房屋都非常昂贵。模型的任务是寻找预测房价的模式,所以它会发现这个模式,并且总是预测有绿色门的房屋价格很高。

由于这个模式是从训练数据中得出的,模型在训练数据中看起来是准确的。

但是如果这个模式在模型看到新数据时不成立,那么在实际使用中,模型将非常不准确。

由于模型的实际价值来自于对新数据的预测,我们需要在没有用于构建模型的数据上评估模型的性能。最直接的方法是将一些数据从模型构建过程中排除,然后使用这些数据测试模型在之前未见过的数据上的准确性。这些数据被称为验证数据。


咱们编个码(Coding)

scikit-learn库有一个train_test_split函数,用于将数据分成两部分。我们将使用其中一部分数据作为训练数据来拟合模型,而将另一部分数据作为验证数据来计算平均绝对误差。

以下是代码:

from sklearn.model_selection import train_test_split# split data into training and validation data, for both features and target
# The split is based on a random number generator. Supplying a numeric value to
# the random_state argument guarantees we get the same split every time we
# run this script.
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
# Define model
melbourne_model = DecisionTreeRegressor()
# Fit model
melbourne_model.fit(train_X, train_y)# get predicted prices on validation data
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))

哇!看到了吧!

你在样本内的平均绝对误差约为500元。样本外的误差超过250,000元。

这是几乎完全正确的模型与对于大多数实际目的而言不可用的模型之间的区别。作为一个参考点,验证数据中的平均房屋价值为110万元。因此,新数据中的误差约为平均房屋价值的四分之一。

这样看来,这个模型的问题很多,但是有许多方法可以改进这个模型,例如尝试寻找更好的特征或不同的模型类型。


欠拟合与过拟合

优化你的模型以获得更好的性能。

在这一步骤结束时,您将理解欠拟合和过拟合的概念,并能够应用这些思想来使您的模型更准确。

尝试使用不同的模型进行实验

现在你已经有了一种可靠的测量模型准确性的方法,你可以尝试使用其他模型,并看看哪个模型能给出最好的预测结果。但是你有哪些模型选择呢?

你可以在scikit-learn的文档中看到,决策树模型有很多选项(比你很长一段时间内想要或需要的要多)。最重要的选项决定了树的深度。回想一下,在本课程的第一课中我们提到,树的深度是一个衡量在做出预测之前它进行了多少次拆分的标志。这是一棵相对较浅的树。

        在实践中,一棵树在顶层(所有房屋)和叶子节点之间拥有10次分割并不罕见。随着树的深入,数据集被切分成含有较少房屋的叶子节点。如果一棵树只有1次分割,它将数据分成两组。如果每个组再次分割,我们将得到4组房屋。再次对每组进行分割,将创建8组。如果我们通过在每个层级添加更多的分割来使组数翻倍,到达第10层时,我们将有210组房屋。这意味着有1024个叶子节点。

        当我们将房屋分配给很多叶子节点时,每个叶子节点中的房屋数量也较少。房屋数量较少的叶子节点会对这些房屋的实际价值做出非常接近的预测,但对于新数据的预测可能非常不可靠(因为每个预测仅基于少数房屋)。

        这是一种称为过拟合的现象,即模型几乎完美地匹配训练数据,但在验证和其他新数据上表现不佳。另一方面,如果我们将决策树变得非常浅,它将无法将房屋划分为非常明显的群组。

        在极端情况下,如果一棵树将房屋分为仅有2个或4个组,每个组仍然有各种各样的房屋。由此得出的预测可能对大多数房屋来说偏离较远,即使在训练数据中也如此(出于同样的原因,在验证中也会表现糟糕)。当模型未能捕捉到数据中的重要差异和模式,以至于即使在训练数据中表现不佳,这就被称为欠拟合

        由于我们关心新数据的准确性,我们根据验证数据来估计,我们希望找到欠拟合和过拟合之间的最佳点。从视觉上看,我们希望在下面图中的(红色)验证曲线的低点。

举个例子

有一些控制树深度的替代方法,其中许多方法允许树中的某些路径比其他路径更深。但是,max_leaf_nodes参数提供了一种非常合理的方法来控制过拟合和欠拟合。我们允许模型生成更多的叶节点,就会从上图中的欠拟合区域移动到过拟合区域。

我们可以使用效用函数来帮助比较不同max_leaf_nodes值的MAE分数。

from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressordef get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)model.fit(train_X, train_y)preds_val = model.predict(val_X)mae = mean_absolute_error(val_y, preds_val)return(mae)

数据已经使用你已经看过并写过的代码加载到train_X、val_X、train_y和val_y中。

接下来,咱们重新实现刚刚模型验证章节实现过的代码,只是稍稍改了点点,大家自己观察:

# Data Loading Code Runs At This Point
import pandas as pd# Load data
melbourne_file_path = './melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
# Filter rows with missing values
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# Choose target and features
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]from sklearn.model_selection import train_test_split# split data into training and validation data, for both features and target
train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)

我们可以使用for循环来比较使用不同max_leaf_nodes值构建的模型的准确率。

# compare MAE with differing values of max_leaf_nodes
for max_leaf_nodes in [5, 50, 500, 5000]:my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)print("Max leaf nodes: %d  \t\t Mean Absolute Error:  %d" %(max_leaf_nodes, my_mae))

执行如下:

从列出的选项中,500是最佳叶子数量。


结论

这里的要点是,模型可能会遭受以下两种情况:

过拟合:捕捉到未来不会再次出现的虚假模式,导致预测结果不准确;

欠拟合:未能捕捉到相关模式,同样导致预测结果不准确。

我们使用验证数据来衡量候选模型的准确性,而这些验证数据不用于模型训练。这样可以让我们尝试多个候选模型,并选择出最好的一个。

告一段落

现在您已经理解了模型验证,以及欠拟合与过拟合,跟着做一下。

瞧瞧,机器学习中这么复杂的概念您都学会了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【stomp实战】websocket原理解析与简单使用

一、WebSocket 原理 WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并…

解决计算机“缺失ffmpeg.dll”报错?修复ffmpeg.dll文件方案

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“ffmpeg.dll丢失”。ffmpeg.dll是FFmpeg多媒体框架中的一个重要组件,它负责处理音频和视频的编解码。当打开某些软件时,如果系统找不到该文件,就会出现这…

Rust开发WASM,浏览器运行WASM

首先需要安装wasm-pack cargo install wasm-pack 使用cargo创建工程 cargo new --lib mywasm 编辑Cargo.toml文件,修改lib的类型为cdylib,并且添加依赖wasm-bindgen [package] name "mywasm" version "0.1.0" edition "…

51 -25 Scene as Occupancy 3D占用作为场景表示 论文精读

本文阅读的文章是Scene as Occupancy,介绍了一种将物体表示为3D occupancy的新方法,以描述三维场景,并用于检测、分割和规划。 文章提出了OccNet和OpenOcc两个核心概念。 OccNet 3D占用网络是一种以多视图视觉为中心的方法,通过…

第 383 场 LeetCode 周赛题解

A 边界上的蚂蚁 模拟 class Solution { public:int returnToBoundaryCount(vector<int> &nums) {int s 0;int res 0;for (auto x: nums) {s x;if (s 0)res;}return res;} };B 将单词恢复初始状态所需的最短时间 I 枚举&#xff1a;若经过 i i i 秒后 w o r d w…

ubuntu22.04安装部署03: 设置root密码

一、前言 ubuntu22.04 安装完成以后&#xff0c;默认root用户是没有设置密码的&#xff0c;需要手动设置。具体的设置过程如下文内容所示&#xff1a; 相关文件&#xff1a; 《ubuntu22.04装部署01&#xff1a;禁用内核更新》 《ubuntu22.04装部署02&#xff1a;禁用显卡更…

【语音合成】中文-多情感领域-16k-多发音人

模型介绍 语音合成-中文-多情感领域-16k-多发音人 框架描述 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预…

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测&#x…

React+Antd实现表格自动向上滚动

1、效果 2、环境 1、react18 2、antd 4 3、代码实现 原理&#xff1a;创建一个定时器&#xff0c;修改表格ant-table-body的scrollTop属性实现滚动&#xff0c;监听表层的元素div的鼠标移入和移出实现实现鼠标进入元素滚动暂停&#xff0c;移出元素的时候表格滚动继续。 一…

Spring基础 - Spring简单例子引入Spring要点

Spring基础 - Spring简单例子引入Spring要点 设计一个Spring的Hello World 设计一个查询用户的案例的两个需求&#xff0c;来看Spring框架帮我们简化了什么开发工作 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

vue3 之 商城项目—登陆

整体认识 登陆页面的主要功能就是表单校验和登陆登出业务 路由配置 模版 <script setup></script><template><div><header class"login-header"><div class"container m-top-20"><h1 class"logo"&g…

第1节、电路连接【51单片机+L298N步进电机系列】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍如何搭建一个51单片机L298N步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境。 一、硬件清单 ①51单片机模块 ②恒流模块 ③开关电源 ④L298N模…

2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏与窗口

文章目录 1 特殊文件夹 Editor2 在 Unity 菜单栏中添加自定义页签3 在 Hierarchy 窗口中添加自定义页签4 在 Project 窗口中添加自定义页签5 在菜单栏的 Component 菜单添加脚本6 在 Inspector 为脚本右键添加菜单7 加入快捷键8 小结 1 特殊文件夹 Editor ​ Editor 文件夹是 …

MYSQL笔记:约束条件

MYSQL笔记&#xff1a;约束条件 主键约束 不能为空&#xff0c;值必须是不同的&#xff08;唯一性&#xff09; 一个表只能修饰一个主键 PRIMARY KEY自增约束 AUTO_INCREMENT唯一键约束 可以为空 unique非空约束 not null 默认值约束 default 外键约束 foreign key …

代码随想录|Day 14

Day 14 新年将至 一、理论学习 BFS 的使用场景总结&#xff1a;层序遍历、最短路径问题(https://leetcode.cn/problems/binary-tree-level-order-traversal/solutions/244853/bfs-de-shi-yong-chang-jing-zong-jie-ceng-xu-bian-l/) BFS 的应用一&#xff1a;层序遍历 BFS …

详述FlinkSql Join操作

FlinkSql 的 Join Flink 官网将其分为了 Joins 和 Window Joins两个大类&#xff0c;其中里面又分了很多 Join 方式 参考文档&#xff1a; Joins | Apache Flink Window JOIN | Apache Flink Joins 官网介绍共有6种方式&#xff1a; Regular Join&#xff1a;流与流的 Joi…

开发JSP应用程序

开发JSP应用程序 问题陈述 TecknoSoft Pvt Ltd.公司的首席技术官(CTO)John Barrett将创建一个应用程序的任务委托给了开发团队,该应用程序应在客户访问其账户详细信息前验证其客户ID和密码。客户ID应是数字形式。John希望如果所输入的客户ID或密码不正确,应向客户显示错误…

Qt可视化大屏布局

科技大屏现在非常流行&#xff0c;这里分享一下某个项目的大屏布局&#xff08;忘了源码是哪个博主的了&#xff09; 展示 这个界面整体是垂直布局&#xff0c;分为两个部分&#xff0c;标题是一个部分&#xff0c;然后下面的整体是一个layout布局&#xff0c;为另外一部分。 l…

【C语言】深入理解指针

目录 1.字符指针 2.指针数组 3.数组指针 4.数组传参与指针传参 一维数组传参 二维数组传参 一级指针传参 二级指针传参 5.函数指针 6.函数指针数组 7.指向函数指针数组的指针&#xff08;了解即可&#xff09; 8.回调函数 回调函数的应用&#xff1a;库函数qsort …

基于ESP8266 开发板(MCU)遥控小车

遥控小车 ​ 遥控界面 ​ 【项目源码】 第一版ESP8266 https://github.com/liyinchigithub/esp8266_car_webServerhttps://github.com/liyinchigithub/esp8266_car_webServer 第二版ESP32 GitHub - liyinchigithub/esp32-wroom-car: 嵌入式单片机 ESP32 Arduino 遥控小车&a…