当前位置: 首页 > news >正文

太多项会毁了回归

「AI秘籍」系列课程:

  • 人工智能应用数学基础

  • 人工智能Python基础

  • 人工智能基础核心知识

  • 人工智能BI核心知识

  • 人工智能CV核心知识

多项式回归的过度拟合及其避免方法

通过添加现有特征的幂,多项式回归可以帮助你充分利用数据集。它允许我们甚至使用简单的模型(如线性回归)来建模非线性关系。这可以提高模型的准确性,但如果使用不当,可能会发生过度拟合。我们希望避免这种情况,因为它会导致你的模型在未来表现不佳。

img

在本文中,我们将解释多项式回归的概念,并说明它如何导致过度拟合。我们还将讨论一些可用于避免过度拟合的技术。这些包括使用 k 倍交叉验证或保留集,但最重要的是,我们将讨论如何应用领域知识来帮助你避免过度拟合。在文章我不会讨论任何代码,但是你可以在GitHub1上找到完整的项目,本文项目 polynomial_regression_overfitting.ipynb

什么是多项式回归?

让我们通过将一些线性回归模型拟合到数据集来直接深入研究这个概念。我们将使用一个房地产估价数据集2,其中包含有关已售出的 414 栋房屋的信息。为了简单起见,我们只看两个变量——单位面积房价和房屋年龄。我们可以在下面的图 1 中看到这两个变量之间的关系。这个想法是使用房屋房龄来预测价格。

图 1:房价与房龄的散点图

从图 1 可以看出,这两个变量之间似乎不存在线性关系。这意味着这种关系不能用直线表示。在我们的例子中,房价最初随着房龄的增长而下降。然而,大约 25 年后,房价开始随着房龄的增长而上涨。这表明这种关系可能是二次的。在开始建模之前,让我们讨论一下为什么会这样。我们稍后会看到,当涉及到多项式回归时,对数据中的关系有充分的理由/理由很重要。

img

最初的行为是有道理的。随着房屋的老化,它们会变得越来越破旧,价值也会下降。房地产专家对此有更好的理解,但也许经过较长时间后,房屋就会变得古老。随着人们开始重视房屋的悠久历史,它们的房龄会增加价值。也可能存在一些选择偏差,这可以解释这种上升趋势。也就是说,昂贵的房屋往往不会被拆除,因此唯一出售的老房子就是这些昂贵的房屋。

标准线性回归

无论出于什么原因,由于关系不是线性的,我们不会指望标准线性模型能很好地完成这项工作。让我们尝试使用线性回归仅使用房龄来模拟房价,以证明这一点。我们这样做:

  1. 将数据集随机分成训练集(70%)和测试集(30%)。
  2. 使用训练集对模型进行训练。
  3. 通过对测试集进行预测并计算 MSE 来评估模型[。](https://en.wikipedia.org/wiki/Mean_squared_error#:~:text=In statistics%2C the mean squared,values and the actual value.)

按照这个过程,我们最终会得到一个由以下方程表示的模型:

p r i c e = β 1 ( a g e ) + β 0 price = \beta_1(age)+\beta_0 price=β1(age)+β0
其中 β₁ 和 β₀ 是模型估计的参数。这个方程也可以称为模型的预测线。它给出了给定房龄的预测房价。

在图 2 中,我们可以看到在数据集上使用此模型的结果。这里,红线表示预测线。查看这条线,我们发现该模型在捕捉潜在的二次趋势方面做得很差。我们可以使用测试集 MSE 总结该模型的准确性,即 145.91。

图 2:标准线性回归

多项式回归

现在让我们尝试使用多项式回归来改进我们的模型。最终,由于关系似乎是二次的,我们期望以下方程能做得更好:

p r i c e = β 2 ( a g e 2 ) + β 1 ( a g e ) + β 0 price = \beta_2(age^2) + \beta_1(age) + \beta_0 price=β2(age2)+β1(age)+β0
问题是,如果我们对当前数据集使用线性回归,就不可能得到这样的方程。为了解决这个问题,我们可以简单地在数据集中添加一个新变量 a g e 2 age^2 age2。为了避免混淆,我们将其重新标记为 age_squared。添加此功能后,我们可以将非线性方程重写为线性方程:
p r i c e = β 2 ( a g e _ s q u a r e d ) + β 1 ( a g e ) + β 0 price = \beta_2(age\_squared)+\beta_1(age)+\beta_0 price=β2(age_squared)+β1(age)+β0

我们现在有两个变量(即 age_squaredage)的线性函数,它实际上是一个变量(即 age)的非线性函数。这使我们能够像以前一样使用线性回归来估计 β 参数。我们可以在图 3 中看到生成的预测线。在这种情况下,测试 MSE 为 127.42,比我们之前的模型低 13%。因此,这个新模型在预测房价方面做得更好。

图 3:房龄²的多项式线性回归

通过使用这个新特征 a g e 2 age^2 age2,我们正在进行多项式回归。概括地说,每当你使用 n 次多项式来模拟目标和特征之间的关系时,你都会进行多项式回归。例如:
p r i c e = β n ( a g e n ) + . . . + β 2 ( a g e 2 ) + β 1 ( a g e ) + β 0 price = \beta_n(age^n) + ...+ \beta_2(age^2) + \beta_1(age)+\beta_0 price=βn(agen)+...+β2(age2)+β1(age)+β0
通过添加这些特征,我们可以在数据集中建模更复杂的关系。在上面的模型中, n = 2 n = 2 n=2,但使用更高次多项式可能会获得更好的结果。话虽如此,通过添加更多特征,我们也可能最终过度拟合数据。

多项式回归的过度拟合

当模型与训练数据集的拟合度过高时,我们就说模型过度拟合了。模型会捕捉数据中的噪声,而不仅仅是潜在的趋势。其结果是,模型在训练数据集上可能表现良好,但在测试数据集上则表现不佳。事实上,我们不会期望模型在任何未经训练的数据集上表现良好。

过度拟合通常是因为模型太复杂或特征太多。随着特征的增加,过度拟合的可能性就越大。在多项式回归中,增加次数也会出现同样的情况。在图 3 中,你可以看到我的意思。我们遵循相同的建模过程,但每一步都会增加多项式的次数。我们从 n=1 开始,以 n=25 结束。请注意,随着次数的增加,预测线会变得更加扭曲。

图 3:在回归中添加 x 幂的效果

实际情况是,随着阶数的增加,模型可以拥有更多转折点。2 阶多项式有 1 个转折点,3 阶多项式有 2 个转折点,依此类推……每增加一个转折点,我们就会给予模型更多自由,使其更贴近训练数据集。对于更高的阶数,模型可能只是捕捉噪音。真正的潜在趋势不太可能如此复杂。

另一种可视化方法是查看训练和测试集上的 MSE。如图 4 所示,训练 MSE 趋于随着程度的增加而减小。这意味着模型在训练集上变得越来越准确。测试 MSE 讲述了一个不同的故事。当 n=2 时,测试 MSE 最小,然后趋于增加。这意味着模型在测试集上的表现越来越差。换句话说,随着我们增加程度,模型变得越来越过度拟合。

图 4:训练和测试的 MSE

如何避免过度拟合

我们已经看到了多项式回归可能出错的原因。现在的问题是,我们如何选择正确的程度并避免过度拟合。与任何机器学习模型一样,我们希望训练一个具有在测试集和训练集上表现良好的特征组合的模型。这样,选择多项式回归的最佳特征的过程与任何其他机器学习问题没有什么不同。

Hold-out set

一种常见的方法是使用Hold-out set。说实话,我也不太清楚这个应该怎么翻译,如果是按字面翻译的话,我们应该称呼它为「保留集」。对于这种方法,数据集被分成训练集和保留集/测试集。对于不同的特征集,模型在训练集上进行训练,在测试集上进行评估。我们使用一些指标(例如 MSE)来评估性能。我们通常会选择在测试集上表现最好的特征集。

看看上面所做的工作,我们可以将此方法应用于房价示例。在这种情况下,n=2 的模型具有最小的测试 MSE。这意味着我们将在最终模型中仅使用 a g e 2 age^2 age2 a g e age age。这似乎是一个合理的结果,因为真正的潜在趋势似乎是二次的。我们还提出了一些逻辑理由来支持这一结果。

K 折交叉验证

类似的方法是使用 k 折交叉验证。在这里,我们将数据集划分为大小相等的 k 个子集\折叠。然后,我们在 k-1 折叠上进行训练,并计算剩余折叠的 MSE。我们重复此步骤 k 次,以便每个折叠都轮流作为测试集。模型的最终得分将是所有测试折叠的 MSE 的平均值。平均 MSE 最低的模型将被选为最终模型。图 5 显示了如何使用 5 倍交叉验证划分数据集的示例。在这种情况下,我们将计算 5 个测试折叠的平均 MSE。

图 5:5折交叉验证示例

领域知识和常识

使用保留集和 k 折交叉验证通常可以得到一个好的模型。但数据很混乱,可能会出现统计异常。如果只是盲目使用这些方法而不考虑你的问题,你仍然会偶然得到一个糟糕的模型。到目前为止,我们已经使用一个特定的训练测试分割进行了上述分析。在这种情况下,我们得出结论, a g e 2 age^2 age2 的模型是最好的。但如果我们使用不同的随机训练测试分割会怎样?

你可以在图 6 中看到我们的意思。这里我们遵循与之前完全相同的过程,只是这次我们使用了不同的随机训练测试分割。在这种情况下,测试 MSE 在 n = 8 时最低。通过仅使用保留方法,我们将使用它作为最终模型。

图 6:具有替代训练测试分割的 MSE

此时,你应该问自己,使用 8 次多项式是否合乎逻辑。我们的预测线将采用以下形式:
p r i c e = β 8 ( a g e 8 ) + β 7 ( a g e 7 ) + . . . + β 1 ( a g e ) + β 0 price = \beta_8(age^8) + \beta_7(age^7) + ... + \beta_1(age) + \beta_0 price=β8(age8)+β7(age7)+...+β1(age)+β0
价格和房龄之间的关系真的那么复杂吗?还是上述结果只是统计异常?答案可能是后者,这强调了为什么我们不应该仅仅依赖像 K 折交叉验证这样的方法。

在选择特征时,考虑你的问题并应用任何领域知识非常重要。在我们的房价示例中,n = 2 的模型似乎捕捉到了潜在趋势。我们还提出了这种关系的一些很好的潜在原因。考虑到这一点,这个模型可能更好。一般来说,如果你包含的特征有逻辑上的原因说明它们为什么具有预测性,那么你就不太可能捕获噪音和过度拟合。

更多K 折交叉验证的内容,可以查看「AI 企业项目实战」中第三章的相关课程。

在这里插入图片描述

参考


  1. 茶桁的公共文章项目仓库:https://github.com/hivandu/public_articles ↩︎

  2. Dataset: https://archive.ics.uci.edu/ml/datasets/Real+estate+valuation+data+set ↩︎

相关文章:

太多项会毁了回归

「AI秘籍」系列课程: 人工智能应用数学基础 人工智能Python基础 人工智能基础核心知识 人工智能BI核心知识 人工智能CV核心知识 多项式回归的过度拟合及其避免方法 通过添加现有特征的幂,多项式回归可以帮助你充分利用数据集。它允许我们甚至使用简…...

python的魔法方法

python类中的self是什么? 对象的方法都会有一个self参数,类比于c,self就相当于c的this指针。 由一个类可以生成无数个对象,当一个对象的方法被调用时,对象会讲自身的引用作为第一个参数传给该方法,那么pyt…...

[Vue3 + TS + Vite] 获取网页选中内容的字符串格式或HTML格式

获取网页选中内容的字符串格式 let selected_text_by_mouse: any// 获取选中的文字 const mouse_selected_text(event:MouseEvent)>{const selection window.getSelection();if(selection && selection.rangeCount > 0){const content selection.toString();s…...

线程安全的原因及解决方法

什么是线程安全问题 线程安全问题指的是在多线程编程环境中,由于多个线程共享数据或资源,并且这些线程对共享数据或资源的访问和操作没有正确地同步,导致数据的不一致、脏读、不可重复读、幻读等问题。线程安全问题的出现,通常是…...

微信零钱明细删除了还能恢复吗?图文教程解析

在日常使用微信支付的过程中,查看零钱明细是管理个人财务的一项重要操作。然而,有时候我们可能会不小心删除了这些明细,导致无法追踪资金流动和消费记录。那么,微信零钱明细删除了还能恢复吗?这是许多用户关心的问题。…...

mp4视频太大怎么压缩不影响画质,mp4文件太大怎么变小且清晰度高

在数字化时代,我们常常面临视频文件过大的问题。尤其是mp4格式的视频,文件大小往往令人望而却步。那么,如何在不影响画质的前提下,有效地压缩mp4视频呢?本文将为您揭秘几种简单实用的压缩技巧。 在分享和存储视频时&am…...

【线程同步-2】

同步方法及同步块 接上期三大不安全案例,本期将介绍同步方法和同步块,以期达到安全的目的。 车站买票:加入了synchronized 同步方法 package syn; ​ //不安全的买票 //线程不安全,有负数 public class UnsafeBuyTicket {publi…...

【别再为可视化工具付费了!】财务报表免费制作软件,这款免费可视化工具的功能超乎想象

会计工作中,关键一步就是把那些繁杂的财务数据整理成清晰易懂的财务报表,这就像是把一堆拼图块变成一幅完整的图画。山海鲸可视化这款免费工具,支持实时数据刷新,能够随时随地更新你的财务数据,确保你拿到的永远是最新…...

【HTML入门】第五课 - 加粗和倾斜的字体们

这一小节,我们说一些常用的HTML文本格式化的标签知识。可能你会觉得HTML知识比较零散,有好多标签。没错,就是比较零散,标签比较多。正式这些形形色色的HTML标签们,组成了丰富多彩的网页元素。 但是在刚学习的时候&…...

解决树形表格 第一列中文字没有对齐

二级分类与一级分类的文字没有对齐 <el-table:data"templateStore.hangyeList"style"width: 100%"row-key"id":tree-props"{ children: subData, hasChildren: hasChildren }" ><el-table-column prop"industryCode&quo…...

三级_网络技术_09_IP地址规划技术

1.某企业产品部的IP地址块为211.168.15.192/26&#xff0c;市场部的为211.168.15.160/27&#xff0c;财务部的为211.168.15.128/27&#xff0c;这三个地址块经聚合后的地址为()。 211.168.15.0/25 211.168.15.0/26 211.168.15.128/25 211.168.15.128/26 2.若某大学分配给计…...

力扣1878.矩阵中最大的三个菱形和

力扣1878.矩阵中最大的三个菱形和 斜前缀和 遍历矩阵元素&#xff0c;同时求当前点左下右下两位置的前缀和枚举每个菱形中心&#xff0c;遍历边长 int sum1[101][101];int sum2[101][101];class Solution {public:vector<int> getBiggestThree(vector<vector<in…...

ELB和VPC是云计算领域中的两个术语,通常与Amazon Web Services (AWS)相关联

ELB 和 VPC 是云计算领域中的两个术语&#xff0c;通常与亚马逊云服务&#xff08;AWS&#xff09;相关&#xff1a; 1. **ELB (Elastic Load Balancer)**&#xff1a; - 这是AWS提供的一种服务&#xff0c;用于自动分配进入应用程序的流量&#xff0c;以实现高可用性和容错…...

YOLO-World实时开集检测论文阅读

论文&#xff1a;《YOLO-World: Real-Time Open-Vocabulary Object Detection》 代码&#xff1a;https://github.com/AILab-CVC/YOLO-World 1.Abstract 我们介绍了YOLO World&#xff0c;这是一种创新的方法&#xff0c;通过在大规模数据集上进行视觉语言建模和预训练&#…...

LLM - 词向量 Word2vec

1. 词向量是一个词的低维表示&#xff0c;词向量可以反应语言的一些规律&#xff0c;词意相近的词向量之间近乎于平行。 2. 词向量的实现&#xff1a; &#xff08;1&#xff09;首先使用滑动窗口来构造数据&#xff0c;一个滑动窗口是指在一段文本中连续出现的几个单词&#x…...

Tileserver GL中glyphs的使用

在Tileserver GL中&#xff0c;glyphs&#xff08;字形&#xff09;是用来渲染矢量切片地图中的文本标签的重要组件。它们定义了在地图上显示的字体和文字的具体形状。详细了解glyphs在Tileserver GL中的工作原理&#xff0c;可以帮助我们更好地配置和使用该服务。以下是关于Ti…...

uniapp自动升级

一、创建云服务空间&#xff08;https://unicloud.dcloud.net.cn&#xff09; 云空间用于关联需要版本控制升级的项目&#xff0c;如果已拥有云空间则省略此步骤。 二、搭建 uni升级中心 - 后台管理系统&#xff08;升级中心 uni-upgrade-center - Admin&#xff09; uni-adm…...

java Pair怎么使用

文章目录 1. 简介2. Pair类的来源3. 如何使用Pair类4. Pair类的实际应用5. Pair类的优点和缺点 1. 简介 什么是Pair Pair是一个通用的数据结构&#xff0c;用于存储一对关联的对象&#xff0c;也就是两个元素。这两个元素可以是任何类型&#xff0c;并且它们之间没有特定的层次…...

数据库doris中的tablet底层解析

在Doris中,tablet(数据片)是数据存储和管理的最小单元。理解tablet的底层原理有助于更好地理解Doris的高可用性、负载均衡和查询优化等特性。 Tablet 的概念 Tablet:Tablet是Doris中用于存储数据的最小物理单元。每个tablet通常对应于一个数据分区和一个分桶组合的子集。…...

江苏高防服务器都有哪些优势?

江苏高防服务器所针对的应用群体是不同的&#xff0c;高防服务器与普通服务器的应用效果和功能上是有着很大的差别&#xff0c;所以企业与用户在进行挑选高防服务器时&#xff0c;会更加看重服务器的质量与服务效果&#xff0c;本文就来聊一下江苏高防服务器的优势有哪些吧&…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

年度峰会上,抖音依靠人工智能和搜索功能吸引广告主

上周早些时候举行的第五届年度TikTok World产品峰会上&#xff0c;TikTok推出了一系列旨在增强该应用对广告主吸引力的功能。 新产品列表的首位是TikTok Market Scope&#xff0c;这是一个全新的分析平台&#xff0c;为广告主提供整个考虑漏斗的全面视图&#xff0c;使他们能够…...

Linux 内核内存管理子系统全面解析与体系构建

一、前言: 为什么内存管理是核心知识 内存管理是 Linux 内核最核心也最复杂的子系统之一&#xff0c;其作用包括&#xff1a; 为软件提供独立的虚拟内存空间&#xff0c;实现安全隔离分配/回收物理内存资源&#xff0c;维持系统稳定支持不同类型的内存分配器&#xff0c;最优…...

设计模式-观察着模式

观察者模式 观察者模式 (Observer Pattern) 是一种行为型设计模式&#xff0c;它定义了对象之间一种一对多的依赖关系&#xff0c;当一个对象&#xff08;称为主题或可观察者&#xff09;的状态发生改变时&#xff0c;所有依赖于它的对象&#xff08;称为观察者&#xff09;都…...

四、Sqoop 导入表数据子集

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月4日 专栏&#xff1a;Sqoop教程 当不需要将关系型数据库中的整个表一次性导入&#xff0c;而是只需要表中的一部分数据时&#xff0c;Sqoop 提供了多种方式来实现数据子集的导入。这通常通过过滤条件或选择特定列来完成。 …...

【bat win系统自动运行脚本-双击启动docker及其它】

win系统自动化运行脚本 创建一个 startup.bat右键编辑&#xff0c;输入以下示例 echo off start "" "C:\Program Files\Docker\Docker\Docker Desktop.exe"timeout /t 5docker start your_container_namestart cmd /k "conda activate your_conda_e…...