曂沅仴駦 发表于 2024-12-22 02:39:16

机器学习之拟合

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



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

(1) 欠拟合(Underfitting)



[*]界说:模型过于简单,无法捕捉数据中的模式和复杂关系,导致训练偏差较大。
[*]缘故原由:

[*]模型复杂度不足(如线性模型拟合非线性数据)。
[*]特征不足,未提取有用信息。
[*]训练不充实或超参数设置不合理。

[*]解决方案:

[*]利用更复杂的模型(例如:增加非线性特征或选择更强的算法)。
[*]添加更多有用特征。
[*]提高训练时间或优化超参数。

(2) 适度拟合(Good Fit)



[*]界说:模型能够很好地捕捉数据的模式,训练偏差和测试偏差都较小,具有精良的泛化能力。
[*]特征:

[*]训练偏差和测试偏差接近且较小。
[*]模型复杂度适中,能够精确反映数据规律。

[*]目标:这是我们训练模型的理想状态。
(3) 过拟合(Overfitting)



[*]界说:模型过于复杂,捕捉到了数据中的噪声和细节,导致训练偏差较小但测试偏差较大。
[*]缘故原由:

[*]模型复杂度过高。
[*]训练数据量不足。
[*]数据中存在噪声,模型对噪声进行了学习。

[*]解决方案:

[*]正则化:如 L1 和 L2 正则化,限定模型复杂度。
[*]增加数据量:提供更多的训练数据来提升泛化能力。
[*]简化模型:选择更简单的模型或减少特征。
[*]利用交织验证:如 K 折交织验证,选择最佳模型。
[*]早停法(Early Stopping):在训练过程中监控验证集偏差,防止训练过度。

3. 拟合的可视化理解

示例图:

https://i-blog.csdnimg.cn/direct/4e8dca4de1d44f22bb3673a1ee8e71b5.png
拟合情况可以通过训练数据和模型预测之间的关系图来直观理解:


[*]欠拟合:模型的预测效果偏离数据真实分布,表现为高偏差(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表示过拟合
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()
https://i-blog.csdnimg.cn/direct/fc2a8d2388e54415b210dcb7c1aaa716.png
6. 总结



[*]欠拟合:模型太简单,无法捕捉数据的真实模式。
[*]适度拟合:模型复杂度适中,泛化能力好。
[*]过拟合:模型过于复杂,过度学习训练数据。
通过正则化、数据增强、交织验证等本领,可以有用地控制拟合水平,提升模型的泛化能力。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 机器学习之拟合