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

模型评估和模型选择

1、损失函数

对于模型一次预测结果的好坏,需要有一个度量标准。对于监督学习而言,给定一个输入X,选取的模型就相当于一个“决策函数”f,它可以输出一个预测结果f(X),而真实的结果(标签)记为Y。f(X) 和Y之间可能会有偏差,我们就用一个损失函数(loss function)来度量预测偏差的程度,记作 L(Y,f(X))。

损失函数用来衡量模型预测误差的大小;损失函数值越小,模型就越好;

损失函数是f(X)Y非负实值函数;

0-1损失函数

平方损失函数(使用最多,方便求导

绝对损失函数

对数似然损失函数

2、经验误差

给定一个训练数据集,数据个数为n:

根据选取的损失函数,就可以计算出模型f(X)在训练集上的平均误差,称为训练误差,也被称作经验误差(empirical error) 或经验风险(empirical risk)。

类似地,在测试数据集上平均误差,被称为测试误差或者泛化误差(generalization error)。
一般情况下对模型评估的策略(在训练的时候),就是考察经验误差;当经验风险最小时,就认为取到了最优的模型。这种策略被称为 经验风险最小化(empirical risk minimization,ERM)。

3、欠拟合和过拟合

拟合(Fitting)是指机器学习模型在训练数据上学习到规律并生成预测结果的过程,就是尽可能地符合原始数据的分布情况,接下来根据这个结果去预测数据。理想情况下,模型能够准确地捕捉训练数据的模式,并且在未见过的新数据(测试数据)上也有良好的表现;即模型具有良好的泛化能力

欠拟合(Underfitting):是指模型在训练数据上表现不佳,无法很好地捕捉数据中的规律。这样的模型不仅在训练集上表现不好,在测试集上也同样表现差。

过拟合(Overfitting):是指模型在训练数据上表现得很好,但在测试数据或新数据上表现较差的情况。过拟合的模型对训练数据中的噪声或细节过度敏感,把噪声学会了哈哈哈,把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,从而失去了泛化能力。

产生欠拟合和过拟合的根本原因,是模型的复杂度过低或过高,从而导致测试误差(泛化误差)偏大。

欠拟合:模型在训练集和测试集上误差都比较大。模型过于简单,高偏差。

过拟合:模型在训练集上误差较小,但在测试集上误差较大。模型过于复杂,高方差。

3.1、产生原因和解决办法

欠拟合

产生原因:

  1. 模型复杂度不足:模型过于简单,无法捕捉数据中的复杂关系。

  2. 特征不足:输入特征不充分,或者特征选择不恰当,导致模型无法充分学习数据的模式。

  3. 训练不充分:训练过程中迭代次数太少,模型没有足够的时间学习数据的规律。

  4. 过强的正则化:正则化项设置过大,强制模型过于简单,导致模型无法充分拟合数据。

解决办法:

  • 增加模型复杂度:选择更复杂的模型。

  • 增加特征或改进特征工程:添加更多的特征或通过特征工程来创造更有信息量的特征。

  • 增加训练时间:增加训练的迭代次数,让模型有更多机会去学习。

  • 减少正则化强度:如果使用了正则化,尝试减小正则化的权重,以让模型更灵活。

过拟合

产生原因:

  1. 模型复杂度过高:模型过于复杂,参数太多。

  2. 训练数据不足:数据集太小,模型能记住训练数据的细节,但无法泛化到新数据,也可能出现欠拟合的现象。

  3. 特征过多:特征太多,模型可能会“记住”数据中的噪声,而不是学到真正的规律。

  4. 训练过长:训练时间过长,导致模型学习到训练数据中的噪声,而非数据的真正规律。

解决办法:

  • 减少模型复杂度:降低模型的参数数量、使用简化的模型或降维来减小模型复杂度。

  • 增加训练数据:收集更多数据,或通过数据增强来增加训练数据的多样性。

  • 使用正则化:引入L1、L2正则化,避免过度拟合训练数据。

  • 交叉验证:使用交叉验证技术评估模型在不同数据集上的表现,以减少过拟合的风险。

  • 早停:训练时,当模型的验证损失不再下降时,提前停止训练,避免过度拟合训练集。

import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 设置matplotlib全局中文显示 plt.rcParams["font.sans-serif"] = ["KaiTi"] plt.rcParams["axes.unicode_minus"] = False # 由一个向量x,生成degree列的矩阵 def polynomial(x, degree): """构成多项式,返回 [x^1,x^2,x^3,...,x^n]""" return np.hstack([x ** i for i in range(1, degree + 1)]) # 1、读取数据 # 生成一个从 -3 到 3 的等差数列(共300个点),然后将其转换成一个 300 行、1 列的列向量(二维数组) X = np.linspace(-3, 3, 300).reshape(-1, 1) print(X.shape) y = np.sin(X) + np.random.uniform(-0.5, 0.5, 300).reshape(-1, 1) # 创建一个包含 1 行、3 列子图的画布 fig, ax = plt.subplots(1, 3, figsize=(15, 4)) ax[0].plot(X, y, "yo") ax[1].plot(X, y, "yo") ax[2].plot(X, y, "yo") # 划分训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建线性回归模型,创建对象 model = LinearRegression() # ========== 欠拟合(1次多项式) ========== x_train1 = x_train x_test1 = x_test model.fit(x_train1, y_train) y_pred1 = model.predict(x_test1) ax[0].plot(X, model.predict(X), "r") ax[0].text(-3, 1, f"测试集均方误差:{mean_squared_error(y_test, y_pred1):.4f}") ax[0].text(-3, 1.3, f"训练集均方误差:{mean_squared_error(y_train, model.predict(x_train1)):.4f}") ax[0].set_title("欠拟合(1次多项式)") plt.show() # ========== 适度拟合(5次多项式) ========== x_train2 = polynomial(x_train, 5) # 扩展成5个特征 x_test2 = polynomial(x_test, 5) model.fit(x_train2, y_train) y_pred2 = model.predict(x_test2) ax[1].plot(X, model.predict(polynomial(X, 5)), "r") ax[1].text(-3, 1, f"测试集均方误差:{mean_squared_error(y_test, y_pred2):.4f}") ax[1].text(-3, 1.3, f"训练集均方误差:{mean_squared_error(y_train, model.predict(x_train2)):.4f}") ax[1].set_title("适度拟合(5次多项式)") # plt.show() # ========== 过拟合(20次多项式) ========== x_train3 = polynomial(x_train, 20) x_test3 = polynomial(x_test, 20) model.fit(x_train3, y_train) y_pred3 = model.predict(x_test3) ax[2].plot(X, model.predict(polynomial(X, 20)), "r") ax[2].text(-3, 1, f"测试集均方误差:{mean_squared_error(y_test, y_pred3):.4f}") ax[2].text(-3, 1.3, f"训练集均方误差:{mean_squared_error(y_train, model.predict(x_train3)):.4f}") ax[2].set_title("过拟合(20次多项式)") # plt.tight_layout() plt.show()

4、正则化

正则化是指在机器学习的过程中,通过添加额外项,来惩罚过大的参数,进而限制模型的复杂度,避免出现过拟合,提高模型的泛化能力。

这里的正则化系数,用来表示惩罚项的权重。正则化系数不属于模型的参数,无法通过训练学习得到,需要在模型训练开始之前手动设置,这种参数被称为“超参数”。

4.1、L1正则化

L1正则化在损失函数中加入参数的绝对值之和:

L1正则化通过惩罚模型参数的绝对值,使得部分权重趋近0甚至变为0。这会导致特征选择,即模型会自动“丢弃”一些不重要的特征。L1正则化有助于创建稀疏模型(即许多参数为0)。在解决回归问题时,使用L1正则化也被称为“Lasso回归”。

超参数控制着正则化的强度。较大的值意味着强烈的正则化,会使模型更简单,可能导致欠拟合。而较小的值则会使模型更复杂,可能导致过拟合。

4.2、L2正则化

L2正则化在损失函数中加入参数的平方之和:

L2正则化通过惩罚模型参数的平方,使得所有参数都变得更小,但不会将参数强行压缩为0。它会使得模型尽量平滑,从而防止过拟合。在解决回归问题时,使用L2正则化也被称为“岭回归”。

5、交叉验证

交叉验证(Cross-Validation)是一种评估模型泛化能力的方法,通过将数据集划分为多个子集,反复进行训练和验证,以减少因单次数据划分带来的随机性误差。通过交叉验证能更可靠地估计模型在未知数据上的表现。亦能避免因单次数据划分不合理导致的模型过拟合或欠拟合。

5.1、简单交叉验证

将数据划分为训练集和验证集(如70%训练,30%验证)。结果受单次划分影响较大,可能高估或低估模型性能。

5.2、k折交叉验证

将数据均匀分为k个子集(称为“折”),每次用k−1折训练,剩余1折验证,重复k次后取平均性能。充分利用数据,结果更稳定。

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

相关文章:

  • AgentLock 首跑不要先测“能否拦截”:先验证 ALLOW、DENY、DEFER 与版本边界
  • 杭州零食消费品牌GEO代理服务商选型哪家靠谱?2026年杭州GEO服务商代理加盟本地推荐与合伙人合作路径解析 - 企业新闻快传
  • ResNet到MobileNet:Bottleneck模块的演进与优化实践
  • ClineRule系统提示词
  • 修复产品口碑之选:这些品牌让你的肌肤焕然一新
  • 我用了十年 Linux 后,最离不开的 5 个轻量神器
  • 预训练+微调的训练范式
  • 九江市永修县正宗赣菜、永修本土风味、萍乡家常菜:南山酒家 - 资讯快报
  • 2026法律行业AI引擎生成式优化怎么优化?三层专业加固提排名,零成本提33%引用率附适配表 - 曌选科技官方账号
  • verilog—tranif1
  • 为什么你的AI自动化项目卡在85%?资深架构师亲授“最后一公里”攻坚清单
  • 【单片机毕业设计推荐】 基于 STM32 的智能恒温出水控制系统设计与实现 ,基于 STM32 的带儿童锁智能饮水装置控制系统开发(012103)
  • 2026抗逆风稳产方案:3项核心技术让作物挺过大风
  • 八大排序代码
  • 越抽象的理论越枯燥,越枯燥的理论越有用
  • 解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
  • Cesium三维WebGIS入门详解
  • 2023三大开源AI工具实战:Dify、n8n与OpenClaw
  • 2026宜宾本地家装行业装修公司靠谱口碑推荐,别墅大宅/大平层/小户型适配全案设计施工方案 - 资讯速览
  • 山东枣庄大跨距电缆桥架测评:悦尚电气质量优但价格略高,适用
  • 2026芜湖黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐
  • 【头部电商AI客服降本增效白皮书】:6个月砍掉62%人工坐席,却将CSAT提升11.3%的底层逻辑
  • 2026无锡黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐
  • TVA驱动的具身智能迭代逻辑(19)
  • 2026年杭州职业培训GEO代理服务商选型哪家靠谱?杭州GEO优化服务商代理加盟本地推荐指南 - 企业新闻快传
  • AI写公众号为什么总被说“一眼AI“?两个Skill背后的方法论拆解
  • 广州番禺区搬家公司收费标准一览,涵盖各街道搬家报价,全天可拨打搬家服务联系号码汇总 - 厚道搬家
  • 中国公里网格人口分布数据集分享
  • 杭州GEO代理服务商选择推荐哪家好?2026年杭州农产品供应行业GEO服务商代理加盟选型指南 - 企业新闻快传
  • 机器学习:数据的获取