机器学习之拟合:欠拟合、适度拟合与过拟合详解
创作时间:
作者:
@小白创作中心
机器学习之拟合:欠拟合、适度拟合与过拟合详解
引用
CSDN
1.
https://blog.csdn.net/dundunmm/article/details/144538936
在机器学习中,拟合(Fitting)是一个核心概念,它决定了模型的表现。本文将从拟合的基本概念出发,详细探讨欠拟合、适度拟合和过拟合三种情况,并给出相应的解决方案。通过可视化图表和代码示例,帮助读者更好地理解这些概念。
1. 拟合的概念
- 拟合:通过训练数据调整模型参数,使得模型输出接近真实数据。
- 目标:找到一个能够较好地泛化到未见数据的模型,而不仅仅是“记住”训练数据。
2. 拟合的三种情况
(1) 欠拟合(Underfitting)
- 定义:模型过于简单,无法捕捉数据中的模式和复杂关系,导致训练误差较大。
- 原因:
- 模型复杂度不足(如线性模型拟合非线性数据)。
- 特征不足,未提取有效信息。
- 训练不充分或超参数设置不合理。
- 解决方案:
- 使用更复杂的模型(例如:增加非线性特征或选择更强的算法)。
- 添加更多有效特征。
- 提高训练时间或优化超参数。
(2) 适度拟合(Good Fit)
- 定义:模型能够很好地捕捉数据的模式,训练误差和测试误差都较小,具有良好的泛化能力。
- 特征:
- 训练误差和测试误差接近且较小。
- 模型复杂度适中,能够准确反映数据规律。
- 目标:这是我们训练模型的理想状态。
(3) 过拟合(Overfitting)
- 定义:模型过于复杂,捕捉到了数据中的噪声和细节,导致训练误差较小但测试误差较大。
- 原因:
- 模型复杂度过高。
- 训练数据量不足。
- 数据中存在噪声,模型对噪声进行了学习。
- 解决方案:
- 正则化:如 L1 和 L2 正则化,限制模型复杂度。
- 增加数据量:提供更多的训练数据来提升泛化能力。
- 简化模型:选择更简单的模型或减少特征。
- 使用交叉验证:如 K 折交叉验证,选择最佳模型。
- 早停法(Early Stopping):在训练过程中监控验证集误差,防止训练过度。
3. 拟合的可视化理解
示例图:
拟合情况可以通过训练数据和模型预测之间的关系图来直观理解:
- 欠拟合:模型的预测结果偏离数据真实分布,表现为高偏差(Bias)。
- 适度拟合:模型的预测结果与数据真实分布较为一致,泛化能力较好。
- 过拟合:模型过于贴合训练数据,表现为高方差(Variance)。
4. 控制拟合的技巧
- 数据增强:
- 扩展训练集,特别在深度学习中,如图像、文本数据增强。
- 正则化技术:
- L1 正则化(Lasso):引入稀疏性,减少不重要的特征。
- L2 正则化(Ridge):平滑权重,避免模型过于复杂。
- 交叉验证:
- 使用验证集调整模型参数,选择最佳拟合效果。
- 早停法(Early Stopping):
- 在验证集误差停止改善时,提前停止训练。
- 使用集成学习:
- 如 Bagging、Boosting 等方法,通过多个模型的组合提升泛化性能。
- 简化模型结构:
- 减少模型的参数和层数,防止过拟合。
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. 总结
- 欠拟合:模型太简单,无法捕捉数据的真实模式。
- 适度拟合:模型复杂度适中,泛化能力好。
- 过拟合:模型过于复杂,过度学习训练数据。
通过正则化、数据增强、交叉验证等技巧,可以有效地控制拟合程度,提升模型的泛化能力。
热门推荐
产妇坐月子期间的饮食指南:催乳食物、补钙食物及饮食禁忌
设计打印机颜色设置(优化打印机颜色设置的技巧与方法)
英特尔酷睿i7处理器功耗剖析:成因、影响与节能降耗策略
《哪吒2》配音演员起诉配音公司:无五险一金,转正4个月后被开除
Word文档误删内容后保存,如何恢复
药理学在个体化用药中的应用
详解:如何全面挑选高性价比二手车的实用经验与技巧
五笔输入法学习指南:从字根到打字技巧
明朝洪武年间,统治者为什么让百姓大迁移?
鼻塞原因、症状与治疗方法全解析
白癜风的病因、治疗方法及生活建议
“能给卑职一个明示吗?”并非万能的布洛芬表示很困惑~
商标异议申请处理:法律规定与实务操作指南
民事权利能力和民事行为能力的区别与法律实践
STM32引脚定义、最小系统及工作模式详解
呼吸机面罩清洁与保养指南:轻松Get干净面罩的3步骤!
怎么把视频弄成压缩包形式发送信息,如何将视频文件打包成压缩包进行分享
中科润美:以"润滑之力"打造国产高端装备"隐形铠甲"
“守株待兔”:一种行为背后的智慧与误区
为什么一平躺心跳加快
孳息的概念及其类型
生命的意义是什么?柏格森为什么认为生命的本质是创造和变化?
河北医科大学第二医院:DIP支付方式改革下的医院信息化建设实践
法律援助申请条件
中正式步枪及其“表兄弟”:如何辨别VZ24、FN24/30和毛瑟98K
劳动报酬涉及哪几个方面的内容
揭秘!初中竟要考这12门科目,你准备好了吗?
“三垣四象廿八宿”中隐含的象数思维
亨廷顿病患者的心理护理及心理支持
违法扣分的处理方法和申诉流程是什么?这些处理方式如何维护车主的权益?