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

项目篇(三)防止过拟合

一、介绍

这对我们来说是一个非常失败的模型,因为我们不是要一个复杂的、在训练集上预测完全精准的模型,而是想要构建一个泛化能力尽可能高的模型。如果一个模型能够对它没见过且性质相似的数据做出准确预测,那我们就可以认为它具有不错的泛化能力,这个模型就是相对成功的。

那为什么模型会出现过拟合的状态呢?其实,这是因为机器和我们程序员一样,都有强迫症。模型在针对训练集的优化过程中不找到最小的误差点,它们是不会停的。我们说,过拟合是机器学习模型在训练数据集上,通过拟合函数形成的。在过拟合的形成过程中,一般会经历三个阶段:欠拟合、平衡点和过拟合。

在初期的时候,模型对训练集的拟合还未完善,能力不够强, 偏差也比较大。此时的模型就处于欠拟合的状态,把模型应用于测试集数据,效果肯定也不好,所以还需要继续训练。

随着训练次数增多,以及模型自身的调整优化,模型的拟合能力变得越来越强,就差不多可以用了。此刻,实际上已经出现了欠拟合和过拟合之间的平衡点。

然而,如果训练继续进行,模型经过充分训练后,就会完全拟合训练集数据。如果把此时的模型应用于测试集,我们并不一定能得到好的效果,很容易出现很高的误差。这就是过拟合的状态。

1、对于回归问题来说,你可以通过下面的图理解过拟合:

2、对于分类问题来说,你可以通过下面的图理解过拟合:

二、解决过拟合问题的方法

1、一般来说,数据点少,模型很容易就能完全描绘出从特征到标签的映射。所以,增加数据集中数据的数量可以在一定程度上防止过拟合。

2、如果特征工程做得不好,数据集中的无用信息多,就会放大过拟合的影响,因为模型描绘出来的是无用信息和标签之间关系,当然泛化能力就受影响。所以,进行优质的特征工程,筛除无用的特征,去芜取精,去伪存真,有利于避免过拟合。

3、我们前面提到,模型比较复杂时,它在训练集上的精度可以想多高就多高,这是因为从数学的角度,多次函数的图像远远比一次、二次函数复杂。模型越复杂,所能够覆盖的特征空间就越大。所以,如果数据集较小,或者说问题比较简单,我们尽量选择简单的模型。凡事选择简单的解决方案,这个道理人称奥卡姆剃刀定理。

因为数据集很难收集,特征工程又很考验机器学习工程师的水平,所以,防止过拟合的最佳策略就是要在模型的简单和复杂之间寻找一个平衡点。3 个模型决策树、线性回归和随机森林,相对而言决策树和线性回归模型比较容易出现过拟合问题,而随机森林则本身就可以基于决策树的过拟合问题实现优化。

三、决策树模型的构造和剪枝

决策树这个算法的原理很好理解,它就是将一大堆的 if…else 语句进行连接,直到最后得到想要的结果。算法中的各个节点是根据训练数据集中的特征形成的。在对特征节点的选择不同时,就可以生成很多不一样的决策树。

生成一个决策树有两个阶段,分别是构造和剪枝。

1、构造

构造就是选择什么特征作为节点生成决策树的过程。在构造过程中,有三种节点:

根节点:就是树的最顶端节点;

内部节点:就是树中间的那些节点;

叶节点:就是树最底部的节点。

在这些节点之间存在一种父子关系。比如根节点会有子节点,子节点还有子节点,到了叶节点就停止了,不再有子节点。在构造过程中,我们可以根据信息增益的程度来选择哪个属性作为根节点;哪些属性作为子节点;什么时候停止并得到目标状态,也就是叶节点。

信息增益,就是数据集的熵和选定某个特征的条件熵之差,而熵就是对随机变量不确定性的度量,熵越大不确定性越大。我们应该选择熵比较小的特征作为根节点,来增加信息的增益。

2、剪枝

如果我们在构造的过程中,选择不同的特征作为根节点,然后根节点下面选择不同的特征形成内部节点,就可以得到另外一棵决策树,也就是一个新的模型,由于 if…else 可以无限制地写下去,对于任何训练集,只要树的深度足够,决策树肯定能够达到 100% 的准确率。我们在前面讲过,这并不是一件好事,因为这样的模型认为其它所有数据的特点都和训练集中的数据完全一样的,所以它的泛化能力会很差。

对于这种情况,我们要在构造过程中对决策树进行剪枝,让树的深度不要太深,以免决策树太过于和精确。这样“模糊”一些的决策树,虽然在训练集上面的分数会降低,但是能够得到更强的泛化能力。

举例:相亲数据

一棵经过剪枝的决策树,剪枝之后树的深度从原来的 3 层变成了 2 层。

再来看看下面这个决策树回归模型,对某个数据集中数据点的拟合示意图,在这张图中,绿色线是当决策树深度为 5 是的模型拟合状态,蓝色线是决策树深度为 2 时的模型拟合状态。很明显,经过深度为 5 的模型训练集损失小,但深度为 2 的模型,泛化能力会更好。

其实,决策树的深度是一个可调的超参数,也就是 max_depth。这个超参数能限制树的最大深度,把超过设定深度的树枝全部剪掉,这也是最常见的剪枝策略。

from sklearn.tree import DecisionTreeRegressor #导入决策树回归模型 model_dtr = DecisionTreeRegressor() #创建决策树回归模型 model_dtr_cut = DecisionTreeRegressor(max_depth=3) #创建深度为3的决策树回归模型 model_dtr.fit(X_train, y_train) #拟合决策树模型 model_dtr_cut.fit(X_train, y_train) #拟合深度为3的决策树模型 y_valid_preds_dtr = model_dtr.predict(X_valid) #用决策树模型预测验证集 y_valid_preds_dtr_cut = model_dtr_cut.predict(X_valid) #用深度为2的决策树模型预测验证集 from sklearn.metrics import r2_score, median_absolute_error #导入Sklearn评估模块 print('训练集上的R平方分数-决策树: %0.4f' % r2_score(y_train, model_dtr.predict(X_train))) print('训练集上的R平方分数-深度为3的决策树: %0.4f' % r2_score(y_train, model_dtr_cut.predict(X_train))) print('测试集上的R平方分数-决策树: %0.4f' % r2_score(y_valid, model_dtr.predict(X_valid))) print('测试集上的R平方分数-深度为3的决策树: %0.4f' % r2_score(y_valid, model_dtr_cut.predict(X_valid)))

训练集上的R平方分数-决策树: 1.0000
训练集上的R平方分数-深度为3的决策树: 0.8045
测试集上的R平方分数-决策树: 0.2857
测试集上的R平方分数-深度为3的决策树: 0.4870

可以看到,未经剪枝的决策树在训练集上的分数是满分,但是在验证集上的得分低得十分离谱。而设定了深度的决策树(也就是剪枝),它的训练集上的分数有所下降,可在验证集上的分数是大幅提升的,体现出了更好的泛化能力。所以,我们这次的“剪枝”相当成功!

四、线性回归模型的正则化

我们再来看看怎么防止线性回归模型的过拟合现象。

1、拟合如何产生

线性回归模型,其实就是通过梯度下降确定参数的过程。如果数据集中有 3 个特征,公式就是:

如果在 x1​、x2​、x3​ 这些特征中,有某个特征的值域较大,而如果模型拟合的结果中,其权重参数 w 的值也比较大,那么这个特征就会占据“主导”地位,使模型往这些较大值的位置偏移,形成了对这些值的“过拟合”。

那么,如果我们能让这类特征项的权重参数变小,也许就可以得到更为平衡的模型,来防止过拟合现象的出现。这种在一定程度上减小这些参数的值的方法,就是机器学习中的正则化(regularization)。具体来说,在损失函数当中加入的正则项也叫惩罚项,也就是给需要训练的函数加上一些规矩、一些限制,让它们不要自我膨胀。

2、正则化

线性回归的损失函数的正则项有两种添加方法,分别叫做 L1 正则项和 L2 正则项。

添加 L1 正则项之后,一些特征的权重会变小,一些绝对值较小的系数甚至直接变为 0(相当于抛弃了一些特征),来增强模型的泛化能力。这种回归也叫 Lasso 回归。

添加 L2 正则项之后,模型在不抛弃任何一个特征的情况下,会缩小回归系数,也就是某些特征的权重,让模型相对稳定,通常模型的泛化能力也更好。这种回归也叫 Rigde 回归。

下面,我们就使用 Sklearn 包中的 Lasso 回归和 Ridge 回归模型,比较一下 L1 和 L2 正则化方法:

from sklearn.linear_model import LinearRegression #导入线性回归模型 from sklearn.linear_model import Lasso from sklearn.linear_model import Ridge model_lr = LinearRegression() #创建线性回归模型 model_lasso = Lasso() #创建Lasso回归模型 model_ridge = Ridge() #创建Ridge回归模型 model_lr.fit(X_train, y_train) #拟合线性回归模型 model_lasso.fit(X_train, y_train) #拟合Lasso回归模型 model_ridge.fit(X_train, y_train) #拟合Ridge回归模型 from sklearn.metrics import r2_score, median_absolute_error #导入Sklearn评估模块 print('训练集上的R平方分数-线性回归: %0.4f' % r2_score(y_train, model_lr.predict(X_train))) print('训练集上的R平方分数-Lasso回归: %0.4f' % r2_score(y_train, model_lasso.predict(X_train))) print('训练集上的R平方分数-Ridge回归: %0.4f' % r2_score(y_train, model_ridge.predict(X_train))) print('测试集上的R平方分数-线性回归: %0.4f' % r2_score(y_valid, model_lr.predict(X_valid))) print('测试集上的R平方分数-Lasso回归: %0.4f' % r2_score(y_valid, model_lasso.predict(X_valid))) print('测试集上的R平方分数-Ridge回归: %0.4f' % r2_score(y_valid, model_ridge.predict(X_valid)))

训练集上的R平方分数-线性回归: 0.6732
训练集上的R平方分数-Lasso回归: 0.6731
训练集上的R平方分数-Ridge回归: 0.6354
测试集上的R平方分数-线性回归: 0.4719
测试集上的R平方分数-Lasso回归: 0.4737
测试集上的R平方分数-Ridge回归: 0.4992

你会发现,从普通线性回归到 Lasso 回归,再到 Ridge 回归,训练集分数呈现下降的趋势,这就是防止过拟合的惩罚项发挥了作用;在测试集上,分数则正好相反,从普通线性回归和 Lasso 回归,再到 Ridge 回归,反而呈现略微升高的趋势。不过,整体来说,差异似乎不是很大,说明目前这个线性回归模型的过拟合现象其实并不明显。

http://www.jsqmd.com/news/613017/

相关文章:

  • Win11Debloat:让Windows系统性能提升60%的终极优化方案
  • ROS2新手必看:5分钟搞定Python功能包创建与消息订阅发布
  • DankDroneDownloader终极指南:无人机固件逆向工程与版本控制深度解析
  • 2026年家具生产企业费用大揭秘,民用儿童家具厂价格多少 - 工业设备
  • 从「投稿难」到「录用快」:Paperxie 期刊论文智能写作,解锁学术发表新效率
  • 开源六轴机械臂:用3D打印技术实现工业级精度的低成本解决方案
  • 7天掌握GDScript:零基础游戏开发完全指南
  • 3大突破破解百度网盘限速:Mac用户高速下载全攻略
  • RevokeMsgPatcher终极解决方案:Windows平台IM软件防撤回技术完全指南
  • 终极指南:用Mesa轻松构建智能Agent仿真模型,快速探索复杂系统
  • M12连接器选到头疼?思大电子这份攻略请收好
  • 基于STM32LXXX的数字电位器(MAX5481EUD+)驱动应用程序设计
  • 一次 Nginx 跨域代理的完整排坑实录:从证书错误到 CORS 配置
  • 号易招商:0门槛0抽佣,成为一级代理赚取全额佣金 - 号易官方邀请码666666
  • 音频设备效率革命:极简操作实现Windows音频管理新体验
  • NVIDIA Profile Inspector技术深度解析:驱动级游戏性能调优实战指南
  • 终极鼠标抖动工具指南:告别屏幕锁定的5种实用方案
  • 独家披露:某省级政务平台PHP容器化国产化迁移全周期数据(耗时28天/零回滚/100%信创名录覆盖)——含架构图、镜像层分析与审计日志样本
  • 普通手机gps信息样本
  • 模块化设计革命:新型制氮设备如何满足柔性生产需求 - 品牌推荐大师1
  • wvp-GB28181-pro企业级视频监控平台架构设计与高可用部署指南
  • Qwen3.5-9B农业技术推广:病虫害图片诊断+防治方案生成+农事提醒
  • Win11Debloat:三步解决Windows 11臃肿问题,让你的电脑重获新生
  • PySimpleGUI实战:从零构建Python桌面应用界面
  • Windows音频管理革命:AudioSwitch一键切换与精细控制解决方案
  • Oracle迁移替代:国内数据库厂商能力排名与深度解析
  • 从零开始:为什么说AppFlowy是下一代AI协作空间的终极选择?
  • Redis连接池崩了?MySQL事务不回滚?Swoole常驻内存引发的5类隐性状态污染,现在不看明天线上告警!
  • 【人生底稿 12】入职 3 个月:从普通开发到小组组长,我是怎么带 4-5 人的小团队扛下核心业务的
  • 昆明富布斯|资质齐全,专业花艺师培训+高效花艺考证 - 深度智识库