欠拟合、过拟合判断方法

写在前面,本博客是对结尾 reference 文章的部分整理和总结,不保证全是原创,仅是博主在学习过程中的一些记录,旨在帮助自己和大家更好的学习和理解。

定义

过拟合: 一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)(高方差
欠拟合: 一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)(高偏差

通过Loss判断

训练集loss 不断下降,验证集loss不断下降:网络正常,仍在学习。
训练集loss 不断下降,验证集loss趋于不变,可能出现过拟合,数据分布不均匀。
训练集loss 不断下降,验证集loss不断上升,可能出现过拟合
训练集loss 趋于不变,验证集loss不断下降,数据集有问题。
训练集loss 趋于不变,验证集loss趋于不变,学习过程中遇到瓶颈,可以减小学习率或批量数目和更换梯度优化算法,也有可能网络设计问题。
训练集loss 不断上升,验证集loss不断上升,可能网络结构有问题,超参数设置不正确。

通过Accuracy判断

验证集的作用是在训练的过程对比训练数据与测试数据的准确率,便于判断模型的训练效果是过拟合还是欠拟合 。
过拟合:训练数据的准确率较高而测试数据的准确率较低
欠拟合:训练数据的准确率和测试数据的准确率均较低

解决方法

过拟合
(1)重新清洗数据:导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
(2)增大数据的训练量:还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
(3)正则化
(4)减少特征维度,防止维灾难
欠拟合
(1)在保证训练误差和验证误差差距在一定范围内,适当增加训练次数。
(2)增加特征
(3)减少正则化程度

Reference

机器学习中的欠拟合和过拟合
【欠拟合、过拟合、梯度消失、梯度爆炸】训练loss和测试loss | 深度学习理论概念

本博客是博主在学习过程中的一些记录,不保证全是原创,文章中可能加入了相关文章的源地址以及网上的多种资料,在这之中也可能有疏漏未加标注者,如有侵权请与博主联系删除相关内容。

  • 13
    点赞
  • 173
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是基于TensorFlow的欠拟合过拟合的Python示例: 首先,我们需要导入必要的库和数据集: ```python import tensorflow as tf from tensorflow import keras import numpy as np # 加载数据集 (x_train, y_train), (x_test, y_test) = keras.datasets.boston_housing.load_data(seed=42) ``` 接下来,我们需要对数据进行预处理: ```python # 标准化数据 mean = x_train.mean(axis=0) std = x_train.std(axis=0) x_train = (x_train - mean) / std x_test = (x_test - mean) / std ``` 然后,我们可以定义一个函数来构建模型: ```python def build_model(): model = keras.Sequential([ keras.layers.Dense(64, activation='relu', input_shape=(x_train.shape[1],)), keras.layers.Dense(64, activation='relu'), keras.layers.Dense(1) ]) optimizer = tf.keras.optimizers.RMSprop(0.001) model.compile(loss='mse', optimizer=optimizer, metrics=['mae']) return model ``` 接下来,我们可以训练模型并绘制训练和验证的损失曲线: ```python # 构建模型 model = build_model() # 训练模型 history = model.fit(x_train, y_train, epochs=500, validation_split=0.2, verbose=0) # 绘制训练和验证的损失曲线 import matplotlib.pyplot as plt def plot_history(history): plt.figure() plt.xlabel('Epoch') plt.ylabel('Mean Abs Error [$1000]') plt.plot(history.epoch, np.array(history.history['mae']), label='Train Loss') plt.plot(history.epoch, np.array(history.history['val_mae']), label = 'Val loss') plt.legend() plt.ylim([0,5]) plt.show() plot_history(history) ``` 最后,我们可以使用测试集评估模型的性能: ```python # 使用测试集评估模型的性能 test_loss, test_mae = model.evaluate(x_test, y_test, verbose=0) print('Test MAE: ${:,.2f}'.format(test_mae * 1000)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值