机器学习之拟合

devtools/2024/12/24 0:20:23/

机器学习中,拟合(Fitting) 是指通过训练数据来调整模型参数,使得模型能够较好地预测输出或逼近真实数据的分布。拟合程度决定了模型的表现,主要分为三种情况:欠拟合(Underfitting)适度拟合(Good Fit)过拟合(Overfitting)


1. 拟合的概念

  • 拟合:通过训练数据调整模型参数,使得模型输出接近真实数据。
  • 目标:找到一个能够较好地泛化到未见数据的模型,而不仅仅是“记住”训练数据。

2. 拟合的三种情况

(1) 欠拟合(Underfitting)

  • 定义:模型过于简单,无法捕捉数据中的模式和复杂关系,导致训练误差较大。
  • 原因
    • 模型复杂度不足(如线性模型拟合非线性数据)。
    • 特征不足,未提取有效信息。
    • 训练不充分或超参数设置不合理。
  • 解决方案
    • 使用更复杂的模型(例如:增加非线性特征或选择更强的算法)。
    • 添加更多有效特征。
    • 提高训练时间或优化超参数。

(2) 适度拟合(Good Fit)

  • 定义:模型能够很好地捕捉数据的模式,训练误差和测试误差都较小,具有良好的泛化能力。
  • 特征
    • 训练误差和测试误差接近且较小。
    • 模型复杂度适中,能够准确反映数据规律。
  • 目标:这是我们训练模型的理想状态。

(3) 过拟合(Overfitting)

  • 定义:模型过于复杂,捕捉到了数据中的噪声和细节,导致训练误差较小但测试误差较大。
  • 原因
    • 模型复杂度过高。
    • 训练数据量不足。
    • 数据中存在噪声,模型对噪声进行了学习。
  • 解决方案
    • 正则化:如 L1 和 L2 正则化,限制模型复杂度。
    • 增加数据量:提供更多的训练数据来提升泛化能力。
    • 简化模型:选择更简单的模型或减少特征。
    • 使用交叉验证:如 K 折交叉验证,选择最佳模型。
    • 早停法(Early Stopping):在训练过程中监控验证集误差,防止训练过度。

3. 拟合的可视化理解

示例图

拟合情况可以通过训练数据和模型预测之间的关系图来直观理解:

  • 欠拟合:模型的预测结果偏离数据真实分布,表现为高偏差(Bias)。
  • 适度拟合:模型的预测结果与数据真实分布较为一致,泛化能力较好。
  • 过拟合:模型过于贴合训练数据,表现为高方差(Variance)。

4. 控制拟合的技巧

  1. 数据增强

    • 扩展训练集,特别在深度学习中,如图像、文本数据增强。
  2. 正则化技术

    • L1 正则化(Lasso):引入稀疏性,减少不重要的特征。
    • L2 正则化(Ridge):平滑权重,避免模型过于复杂。
  3. 交叉验证

    • 使用验证集调整模型参数,选择最佳拟合效果。
  4. 早停法(Early Stopping)

    • 在验证集误差停止改善时,提前停止训练。
  5. 使用集成学习

    • 如 Bagging、Boosting 等方法,通过多个模型的组合提升泛化性能。
  6. 简化模型结构

    • 减少模型的参数和层数,防止过拟合。

5. 代码示例

以线性回归为例,展示欠拟合、适度拟合和过拟合:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 生成数据
np.random.seed(0)
X = np.linspace(-3, 3, 100).reshape(-1, 1)
y = X**3 + np.random.normal(0, 3, size=X.shape)  # 非线性数据# 拆分训练和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 定义不同复杂度的模型
degrees = [1, 3, 9]  # 1表示欠拟合,3表示适度拟合,9表示过拟合
plt.figure(figsize=(18, 5))for i, d in enumerate(degrees):poly = PolynomialFeatures(degree=d)X_poly_train = poly.fit_transform(X_train)X_poly_test = poly.transform(X_test)model = LinearRegression()model.fit(X_poly_train, y_train)y_pred_train = model.predict(X_poly_train)y_pred_test = model.predict(X_poly_test)train_error = mean_squared_error(y_train, y_pred_train)test_error = mean_squared_error(y_test, y_pred_test)# 绘图plt.subplot(1, 3, i+1)plt.scatter(X, y, color='gray', label='Data')X_plot = np.linspace(-3, 3, 100).reshape(-1, 1)y_plot = model.predict(poly.transform(X_plot))plt.plot(X_plot, y_plot, color='red', label=f"Degree {d}")plt.title(f"Degree {d}\nTrain Error: {train_error:.2f}, Test Error: {test_error:.2f}")plt.legend()plt.show()


6. 总结

  • 欠拟合:模型太简单,无法捕捉数据的真实模式。
  • 适度拟合:模型复杂度适中,泛化能力好。
  • 过拟合:模型过于复杂,过度学习训练数据。

通过正则化、数据增强、交叉验证等技巧,可以有效地控制拟合程度,提升模型的泛化能力。


http://www.ppmy.cn/devtools/144843.html

相关文章

配置flutter 解决andriod studio报错 no device selected

flutter配置好后 明明下载好了模拟器 但是在andriod studio 找不到设备 显示no devices 这个时候需要我们配置一下flutter关联的android sdk的路径和文件夹 就可以解决了 flutter config --android-sdk 自己android studio的路径 这样配置就可以解决了~

Unity-Editor扩展GUI基本实现一个可拖拉放的格子列表

短短几百行代码,好吧,又是“参考”了国外的月亮 操作,还真地挺自然的。。。。。。国外的实现有点小牛 拖拉,增加+ 一个Element 鼠标左键长按,可以出提示 鼠标右键,清除Element, 有点小bug,不是很自然地完全清除, using System.Collections; using System.Collecti…

【EXCEL 逻辑函数】AND、OR、XOR、NOT、IF、IFS、IFERROR、IFNA、SWITCH

目录 AND:当所有条件都为真时返回 TRUE,否则返回 FALSE OR:当任一条件为真时返回 TRUE,否则返回 FALSE XOR:当奇数个条件为真时返回 TRUE,否则返回 FALSE NOT :反转逻辑值 IF:根…

使用一个线性电位器将运算放大器增益从 -30 dB 调整到 +60 dB

良好的手动调节音频增益级具有以下特点: 低噪声、低失真, 20 kHz 带宽, 宽增益调节范围(例如90dB),以及 对数(至少伪对数)控制特性 有效地跨越宽增益范围和良好的分辨率&#x…

吉快科技荣膺“金边奖·最佳大模型一体机”,引领AI边缘新时代

2024年12月14日,由边缘计算社区主办的全球边缘计算大会在上海盛大召开。这场备受瞩目的行业盛会汇聚了全球顶尖的技术专家、企业代表与行业领袖,共同探讨边缘计算与AI技术融合的最新趋势。在本次大会的重磅环节——“金边奖”颁奖典礼上,吉快…

H5 ios软键盘弹起遮挡输入框

在使用 Vue 3 和 TypeScript 开发 H5 页面时,输入框固定在底部,遇到 iOS 软键盘弹起遮挡输入框的问题。以下为几种解决方案: 1. 使用 viewport 元素调整页面视图 iOS 在弹出软键盘时,可能会导致页面内容被遮挡。通过调整 meta 标…

【leetcode100】随机链表的复制

1、题目描述 ​ 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点…

【Leetcode 热题 100】105. 从前序与中序遍历序列构造二叉树

问题背景 给定两个整数数组 p r e o r d e r preorder preorder 和 i n o r d e r inorder inorder,其中 p r e o r d e r preorder preorder 是二叉树的 先序遍历, i n o r d e r inorder inorder 是同一棵树的 中序遍历,请构造二叉树并…