过拟合和欠拟合

深度学习模型优化与防止过拟合策略

概念

优化:代表通过调整模型来训练数据上表现最好。
泛化:代表模型在未见过的数据上的表现。

防止过拟合

1.弄更多的训练数据
2.调节模型储存的信息的质量,用来解决过拟合的方法叫做正则化。

减少网络大小

最简单的预防过拟合方法就是减少模型的大小。
模型中可学习参数的数量被称为模型的“容量”。
没有什么有魔力的公式能够决定层所需的正确数量,以及每一层的正确大小。你必须评估一系列不同的结构(在你的验证集上而不是测试集上)来找出你的数据的正确模型大小。一般的找到合适大小的流程是从一些相关的比较少的层数和参数开始,然后开始提高层的大小并增加新的层知道你看到验证集的损失开始下降为止。

增加正则化权重

  • L1正则化,花费取决于权重系数的绝对值
  • L2正则化,花费取决于权重系数的平方,也称权重衰减。
    在keras里面,权重正则化通过权重正则化实例加进来作为关键词参数。让我们在电影评论分类网络中加入L2去那种正则化。
from keras import regularizers
model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
 activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
 activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

其中l2(0.001)意味着图层的权重矩阵将会乘以0.001加入到最终网络的损失中。注意乘法只在训练的时候加进去,也就是说网络的损失在训练的时候要比测试的时候高很多。
作为l2的替代,你可以看到如下的keras权重正则化:

from keras import regularizers
# L1 regularization
regularizers.l1(0.001)
# L1 and L2 regularization at the same time
regularizers.l1_l2(l1=0.001, l2=0.001)

添加drop out

dropout应用到“层”里面,由随机"dropping out"层在训练中学习到的要输出的特征。在测试的时候,没有单元被dropped out,层的输出值会按照dropout rate来缩放,以平衡在测试时和训练的时比有更多的单元。
在keras里面,能使用dropout层来直接引入dropout。

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))

总结

  • 更多的训练数据
  • 减少网络的容量
  • 增加权重正则化
  • 增加dropout
在机器学习中,**过拟合**(Overfitting)**拟合**(Underfitting)是模型训练过程中常见的两种问题,它们分别反映了模型对训练数据的拟合程度过高或过低的情况。 ### 过拟合的判断 过拟合指的是模型在训练数据上表现非常好,但在测试数据或新数据上表现较差。判断模型是否过拟合的常见方法包括: - **训练误差验证误差的差异显著**:训练误差非常低,而验证误差较高,表明模型可能在训练数据上学习得过于复杂,记住了噪声细节,而不是学习到数据的通用模式[^2]。 - **学习曲线分析**:通过绘制学习曲线,观察随着训练样本数量的增加,训练误差验证误差的变化趋势。如果训练误差验证误差之间的差距较大,则可能存在过拟合现象[^3]。 - **交叉验证结果不稳定**:如果模型在不同折数的交叉验证中表现波动较大,则可能表明模型对训练数据过于敏感,存在过拟合问题。 ### 拟合的判断 拟合指的是模型在训练数据测试数据上都表现较差,说明模型无法捕捉数据中的基本模式。判断模型是否拟合的常见方法包括: - **训练误差验证误差都较高**:无论是在训练数据还是测试数据上,模型的误差都较大,说明模型未能学习到数据的基本特征。 - **学习曲线分析**:如果随着训练样本数量的增加,训练误差验证误差都趋于稳定但仍然较高,则可能存在拟合现象。 - **模型复杂度不足**:如果模型的复杂度不足以捕捉数据中的模式,例如使用线性模型去拟合非线性数据,则可能导致拟合问题[^4]。 ### 识别过拟合拟合的综合方法 为了更全面地识别模型是否存在过拟合拟合,可以采取以下方法: - **交叉验证**:通过交叉验证评估模型在不同子集上的表现,有助于识别模型是否过拟合拟合。如果模型在不同子集上的表现差异较大,则可能存在过拟合问题;如果模型在所有子集上的表现都较差,则可能存在拟合问题。 - **学习曲线分析**:绘制学习曲线,观察训练误差验证误差随训练样本数量的变化趋势,有助于识别模型是否存在过拟合拟合问题[^3]。 - **模型复杂度调整**:尝试调整模型的复杂度,例如增加或减少神经网络的层数节点数,观察模型在训练数据测试数据上的表现变化,有助于识别模型是否存在过拟合拟合问题。 ### 代码示例:绘制学习曲线 以下是一个使用Scikit-learn库绘制学习曲线的示例代码,用于识别模型是否存在过拟合拟合问题: ```python from sklearn.model_selection import learning_curve import matplotlib.pyplot as plt import numpy as np def plot_learning_curve(estimator, title, X, y, cv=None, n_jobs=None): train_sizes, train_scores, test_scores = learning_curve( estimator, X, y, cv=cv, n_jobs=n_jobs) train_scores_mean = np.mean(train_scores, axis=1) test_scores_mean = np.mean(test_scores, axis=1) plt.figure() plt.title(title) plt.xlabel("Training examples") plt.ylabel("Score") plt.plot(train_sizes, train_scores_mean, label="Training score") plt.plot(train_sizes, test_scores_mean, label="Cross-validation score") plt.legend(loc="best") plt.grid() plt.show() # 示例:使用线性回归模型 from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression X, y = make_regression(n_samples=1000, n_features=10, noise=0.1) plot_learning_curve(LinearRegression(), "Learning Curve (Linear Regression)", X, y, cv=5) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值