精华内容
下载资源
问答
  • 欠拟合
    千次阅读
    2022-03-21 14:55:41

    引言

    在机器学习中,我们将模型在训练集上的误差称之为训练误差,又称之为经验误差,在新的数据集(比如测试集)上的误差称之为泛化误差,泛化误差也可以说是模型在总体样本上的误差。对于一个好的模型应该是经验误差约等于泛化误差,也就是经验误差要收敛于泛化误差,根据霍夫丁不等式可知经验误差在一定条件下是可以收敛于泛化误差的。
    当机器学习模型对训练集学习的太好的时候(再学习数据集的通性的时候,也学习了数据集上的特性,这些特性是会影响模型在新的数据集上的表达能力的,也就是泛化能力),此时表现为经验误差很小,但往往此时的泛化误差会很大,这种情况我们称之为过拟合,而当模型在数据集上学习的不够好的时候,此时经验误差较大,这种情况我们称之为欠拟合。具体表现如下图所示,第一幅图就是欠拟合,第三幅图就是过拟合。

    在这里插入图片描述

    过拟合

    原因

    1、训练集的数量级和模型的复杂度不匹配。训练集的数量级要小于模型的复杂度

    2、训练集和测试集特征分布不一致

    3、样本里的噪音数据干扰过大,大到模型过分的记住了噪音特征,而忽略了真实的输入输出间的关系

    4、权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征

    方法

    1、simpler model structure
    调小模型复杂度,使其适合自己训练集的数量级(缩小宽度和减小深度)

    2、data augmentation
    训练集越多,过拟合的概率越小。在计算机视觉领域中,增广的方式是对图像旋转,缩放,剪切,添加噪声等

    3、regularization
    参数太多,会导致我们的模型复杂度上升,容易过拟合,也就是我们的训练误差会很小。正则化是指通过引入额外新信息来解决过拟合问题的一种。这种额外信息通常的形式是模型复杂性带来的惩罚度。正则化可以保持模型简单,另外,规则项的使用还可以约束我们模型的特性。

    4、dropout
    在训练的时候让神经元以一定概率不工作。
    dropout会导致网络的训练速度慢2、3倍,而且数据小的时候,dropout的效果并不会太好,因此只会在大型网络上使用。
    在这里插入图片描述

    左图没有dropout的标准神经网络,右图有dropout的神经网络,即在训练时候以一定的概率p来跳过一定的神经元

    5、Early stopping
    对模型进行训练的过程即使对模型的参数进行学习更新的过程,这个参数学习的过程往往会用到一些迭代方法,如梯度下降(Gradient descent)学习算法。Early stopping便是一种迭代次数截断的方法来防止过拟合的,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。
    其具体做法是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data 的 accuracy,当accuracy不再提高时,就停止训练。这种做法很符合直观感受,因为accuracy都不再提高了,在继续训练也是无益的。那么该做法的重点就是“怎样才认为accuracy不再提高了?” “并不是accuracy一降下来便认为不再提高了,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让accuracy上去了,因此不能根据一次两次连续降低就判断不再提高了”。
    一般做法是:在训练过程中,记录到目前为止最好的alidation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping),这种策略也称为“No-improvement-in-n” , n即Epoch的次数,可以根据实际情况选取,如10、20、30…

    开源代码

    import numpy as np
    import torch
    
    class EarlyStopping:
       """Early stops the training if validation loss doesn't improve after a given patience."""
       def __init__(self, patience=7, verbose=False, delta=0, path='checkpoint.pt', trace_func=print):
           """
           Args:
               patience (int): How long to wait after last time validation loss improved.
               				   上次验证集损失值改善后等待几个epoch
                               Default: 7
               verbose (bool): If True, prints a message for each validation loss improvement. 
               					如果是True,为每个验证集损失值改善打印一条信息
                               Default: False
               delta (float): Minimum change in the monitored quantity to qualify as an improvement.
               					检测数量的最小变化,以符合改进的要求
                               Default: 0
               path (str): Path for the checkpoint to be saved to.
                               Default: 'checkpoint.pt'
               trace_func (function): trace print function.
                               Default: print            
           """
           self.patience = patience
           self.verbose = verbose
           self.counter = 0
           self.best_score = None
           self.early_stop = False
           self.val_loss_min = np.Inf
           self.delta = delta
           self.path = path
           self.trace_func = trace_func
       def __call__(self, val_loss, model):
    
           score = -val_loss
    
           if self.best_score is None:
               self.best_score = score
               self.save_checkpoint(val_loss, model)
           elif score < self.best_score + self.delta:
               self.counter += 1
               self.trace_func(f'EarlyStopping counter: {self.counter} out of {self.patience}')
               if self.counter >= self.patience:
                   self.early_stop = True
           else:
               self.best_score = score
               self.save_checkpoint(val_loss, model)
               self.counter = 0
    
       def save_checkpoint(self, val_loss, model):
           '''Saves model when validation loss decrease.
           验证损失减少时保存模型
           '''
           if self.verbose:
               self.trace_func(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}).  Saving model ...')
           # 这里会存储迄今最优的模型
           torch.save(model.state_dict(), self.path)
           self.val_loss_min = val_loss
    

    伪代码——pytorch

    # 打包数据集
    
    mydata_loader = Dataloader(dataset= , batch_size= 批量大小, shuffle = True or False 是否打乱数据顺序)
    model = MyModel()
    # 指定损失函数, 这里是交叉熵损失函数
    criterion = nn.CrossEntropyLoss()
    # 指定优化器
    optimizer = torch.nn.Adam(model.parameters())
    # 初始化early stopping 对象
    # 这里是当验证集损失在连续20次训练周期中都没有得到降低时,停止模型训练,防止过拟合
    patience = 20
    early_stopping = EarlyStopping(patience = patience, verbose = True)
    
    batch_size = 64
    n_epochs = 100 #可以设置大一点,比较希望通过早停法来结束模型训练
    
    # 训练模型,直到epoch == n_epochs 或者触发early_stopping来结束训练
    
    for epoch in range(1, n_epochs+1):
    	# 模型设置为训练模式
    	model.train()
    
    	# 按小批量训练
    	for batch, (data, label) in enumerate(mydata_loader):
    		# 清空所有参数的梯度
    		optimizer.zero_grad()
    		# 输出模型预测值
    		output = model(data)
    		# 计算损失
    		loss = criterion(output, label)
    		# 计算损失对于各个参数的梯度
    		loss.backward()
    		# 执行单步优化操作: 更新参数
    		optimizer.step()
    	# 模型设置为评估/测试模式,关闭dropout,并将模型参数锁定
    	model.eval()
    	# 一般如果验证集不是很大,模型验证时就不需要按批量进行,但要注意输入参数的维度不能错
    	# 预测数据pre_data 对应目标/标签 pre_label
    	valid_output = model(pre_data)
    	valid_loss = criterion(valid_output, pre_label)
    
    	early_stopping(valid_loss, model)
    	# 若满足early stopping 要求
    	if early_stopping.early_stop:
    		print("Early Stopping!")
    		# 结束模型训练
    		break
    
    # 获得 early stopping 时的模型参数
    model.load_state_dict(torch.load('checkpoint.pt'))
    	
    
    

    参考文档:pytorch-实现早停法

    参考文档:深度学习技巧之早停法
    6、ensemble
    集成学习算法也可以有效的减轻过拟合。
    Bagging通过评价多个模型的结果,来降低模型的方差。Boosting不仅能过减小偏差,还能减小方差。

    欠拟合

    原因及方法

    1、欠拟合是由于学习不足,可以考虑添加特征,从数据中挖掘更多的特征,有时候还需要对特征进行变换,使用组合特征和高次特征

    2、模型简单也会导致欠拟合,如线性模型只能拟合一次函数的数据。尝试使用更高级的模型有助于解决欠拟合,如svm等

    3、正则化参数是用来防止过拟合的,出现欠拟合的情况就要考虑减少正则化参数了。

    更多相关内容
  • 一 过拟合与欠拟合及其解决方案 过拟合、欠拟合的概念 权重衰减 丢弃法 1 训练误差与泛化误差 训练误差:在训练集上的数据误差; 泛化误差:在其他任意数据集上的误差的期望,常用测试集误差来近似 模型选择:通常...
  • 过拟合、欠拟合及其解决方案,内容: 1. 过拟合、欠拟合的概念 2. 权重衰减 3. 丢弃法 总结 欠拟合现象:模型无法达到一个较低的误差 过拟合现象:训练误差较低但是泛化误差依然较高,二者相差较大
  • 过拟合、欠拟合及其解决方案 训练误差和泛化误差 过拟合和欠拟合的概念 模型复杂度和误差之间的关系 解决过拟合的方案 梯度消失及梯度爆炸 循环神经网络进阶 GRU LSTM 深度神经网络 过拟合、欠拟合及其解决方案 训练...
  • 一类是欠拟合,另一类是过拟合. 1.欠拟合 模型无法得到较低的训练误差,将这一现象成为欠拟合. 2.过拟合 模型的训练误差远小于它在测试集上的误差,称这一现象为过拟合. 可能导致这两种拟合问题的因素有很多,比如...
  • 欠拟合 模型无法得到较低的训练误差(模型在训练数据集上表现出的误差),这一现象称作欠拟合(underfitting) 过拟合 过拟合得问题指的是模型在测试集上的结果不好,训练误差较低但是泛化误差依然较高,二者相差较...
  • 笔记整理 代码整理 L2 范数正则化(regularization) %matplotlib inline import torch import torch.nn as nn import numpy as np import sys sys.path.append(/home/kesci/input) import d2lzh1981 as d2l ...
  • 过拟合与欠拟合

    2021-01-06 20:09:12
    模型选择、过拟合和欠拟合 训练误差和泛化误差 在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在...
  • 一、过拟合欠拟合及其解决方案 我们将探究模型训练中经常出现的两类典型问题: 一类是模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting); 另一类是模型的训练误差远小于它在测试数据集上的...
  • 一、过拟合、欠拟合及其解决方案 1.概念 过拟合:模型在训练集上能够得到很好的误差,但是在测试集上的效果很差。 欠拟合:模型无法得到较低的训练误差。(在训练集和测试集上都不能得到较好的误差) 2.多项式函数...
  • 过拟合与欠拟合 专业名词解释: 泛化误差(generalization error):指模型在任意一个测试数据样本上表现出来的误差的期望,我们通常用测试集上的误差来近似看待. 验证集(validation set):预留一部分训练数据集...
  • 问题:拿到一个图,不怎么怎么区分是过拟合还是欠拟合 图1: 图2: 图3: 1.观察图: 图1:train loss>>test loss 训练误差(10^3)较大 图2:test loss >> train loss 训练误差(10^1)较小 图3: test loss = ...
  • 文章目录过拟合、欠拟合及其解决方法过拟合问题(high variance)欠拟合问题(high bias)梯度消失及梯度爆炸循环网络进阶 过拟合、欠拟合及其解决方法 过拟合问题(high variance) 过拟合问题:是指模型太过复杂,...
  • 正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。 L2 范数正则化(regularization) L2 范数正则化在模型原损失函数基础上添加 L2 范数惩罚项,从而得到训练所需要最小化的函数...
  • 过拟合欠拟合及其解决方案 训练误差和泛化误差 训练误差:模型在训练数据集上表现出的误差 泛化误差:模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。 机器学习模型应关注...
  • baseline import tensorflow.keras.layers as layers baseline_model = keras.Sequential( [ layers.Dense(16, activation='relu', input_shape=(NUM_WORDS,)), layers.Dense(16, activation='relu'), ...
  • 1 过拟合、欠拟合及其解决方案 训练误差和泛化误差 在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型...
  • 按图索骥学-机器学习 有关机器学习的一组教程,深入浅出 用一副思维导图串联所有学习资源和知识点,每个同学都可以根据自己的情况,按图索骥,设计自己的学习路径,学习需要的课程 有关此课程详细信息,请访问...
  • 欠拟合和过拟合 训练误差和泛化误差 训练误差 :训练集上的误差 泛化误差 :测试集上的误差 训练误差的期望小于或等于泛化误差,因为一直在训练训练集。训练误差的降低不等于泛化误差的降低。但机器学习的真正目的是...
  • 过拟合、欠拟合

    2021-01-20 11:19:33
    过拟合和欠拟合 训练误差和泛化误差 训练误差,模型在训练集合上表现的误差。 泛化误差 ,模型在任意一个数据集上表现出来的误差的期望。 过拟合,模型训练误差远小于在测试集上的误差。 欠拟合 ,模型无法在训练集...
  • 文章目录1、过拟合与欠拟合2、欠拟合2.1 出现的原因2.2 解决的办法3、过拟合3.1 出现的原因3.2 解决的办法4. Early stopping5、Dropout6、L1 和 L2 正则化7、参考资料 1、过拟合与欠拟合 机器学习中模型的泛化能力强...

    @创建于:2022.05.27
    @修改于:2022.05.27

    1、过拟合与欠拟合

    机器学习中模型的泛化能力强的模型才是好模型。对于训练好的模型:

    • 若在训练集表现差,不必说在测试集表现同样会很差,这可能是欠拟合导致;
    • 若模型在训练集表现非常好,却在测试集上差强人意,则这便是过拟合导致的。

    过拟合与欠拟合也可以用 Bias 与 Variance 的角度来解释:

    • 欠拟合会导致高 Bias
    • 过拟合会导致高 Variance

    所以模型需要在 Bias 与 Variance 之间做出一个权衡。

    现象训练集表现验证集表现导致后果
    欠拟合不好不好高 Bias
    过拟合不好高 Variance
    适度拟合Bias 和 Variance 的折中

    在这里插入图片描述

    2、欠拟合

    2.1 出现的原因

    使用的模型复杂度过低
    使用的特征量过少
    【其他的,如果您知道,请告诉我!感谢】

    2.2 解决的办法

    1、对于机器学习

    • 增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间
    • 添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强
    • 减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数
    • 使用非线性模型,比如核SVM 、决策树、深度学习等模型
    • 调整模型的容量(capacity),通俗地,模型的容量是指其拟合各种函数的能力。对于神经网络,这在很大程度上取决于它有多少神经元以及它们如何连接在一起。
    • 容量低的模型可能很难拟合训练集;使用集成学习方法,如Bagging ,将多个弱学习器Bagging

    2、对于深度学习
    欠拟合的原因以及解决办法(深度学习)

    • 对原始数据做归一化处理,这个会加速模型的收敛
    • 减少使用正则化,减少的dropout
    • 增加单层的神经元个数,加深网络层次
    • 正确使用激活函数

    3、过拟合

    3.1 出现的原因

    1、对于机器学习

    • 建模样本选取有误,如样本数量太少,选样方法错误,样本标签错误等,导致选取的样本数据不足以代表预定的分类规则

    • 样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则

    • 假设的模型无法合理存在,或者说是假设成立的条件实际并不成立
      参数太多,模型复杂度过高

    • 对于决策树模型,如果我们对于其生长没有合理的限制,其自由生长有可能使节点只包含单纯的事件数据(event)或非事件数据(no event),使其虽然可以完美匹配(拟合)训练数据,但是无法适应其他数据集

    2、对于神经网络模型

    • a)对样本数据可能存在分类决策面不唯一,随着学习的进行,BP算法使权值可能收敛过于复杂的决策面;
    • b)权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征

    3.2 解决的办法

    • 正则化(Regularization)(L1和L2)
    • 数据扩增,即增加训练数据样本(Data augmentation)
    • Dropout
    • Early stopping
    • 降低模型复杂度
    • 使用交叉验证

    4. Early stopping

    深度学习入门四----过拟合与欠拟合

    在这里插入图片描述
    在训练期间验证损失(validation loss)可能会开始增加,为了防止这种情况,在验证损失(validation loss)不再减少时停止训练。以这种方式中断训练称为early stopping。

    一旦检测到验证损失开始再次上升,可以将权重重置为最小值出现的位置。这可确保模型不会继续学习噪声和过度拟合数据。

    提前停止训练也意味着不太可能在网络完成学习信号之前过早停止训练。所以除了防止过拟合训练时间过长之外,提前停止还可以防止欠拟合训练时间不够长。只需将您的训练时期设置为一个较大的数字(比您需要的多),早期停止将处理其余部分。

    5、Dropout

    深度学习入门五----Dropout and Batch Normalization
    过拟合的原因以及解决办法(深度学习)
    在训练的每一步随机丢弃层输入单元的一部分,使网络更难学习训练数据中的那些虚假模式。相反,它必须搜索广泛的、通用的模式,其权重模式往往更加稳健。

    在这里插入图片描述

    6、L1 和 L2 正则化

    L1正则化就是在loss function后边所加正则项为L1范数,加上L1范数容易得到稀疏解(0比较多)。L2正则化就是loss function后边所加正则项为L2范数的平方,加上L2正则相比于L1正则来说,得到的解比较平滑(不是稀疏),但是同样能够保证解中接近于0(但不是等于0,所以相对平滑)的维度比较多,降低模型的复杂度。
    在这里插入图片描述

    7、参考资料

    机器学习防止欠拟合、过拟合方法
    欠拟合和过拟合出现原因及解决方案

    深度学习入门四----过拟合与欠拟合
    深度学习入门五----Dropout and Batch Normalization

    欠拟合的原因以及解决办法(深度学习)
    过拟合的原因以及解决办法(深度学习)

    机器学习中正则化项L1和L2的直观理解
    L1正则化与L2正则化

    展开全文
  • 过拟合、欠拟合及其解决方案模型选择、过拟合和欠拟合训练误差和泛化误差模型选择验证数据集K折交叉验证过拟合和欠拟合模型复杂度训练数据集大小多项式函数拟合实验初始化模型参数定义、训练和测试模型三阶多项式...
  • 2020 年参加伯禹教育pytorch培训-过拟合欠拟合及其解决方案知识单元 、 此为jupyter notebook格式源文件 文章见:https://blog.csdn.net/xiuyu1860/article/details/104313139
  • 过拟合欠拟合及其解决方案 模型在训练数据集上准确,测试数据集上不一定更准确 训练误差和泛化误差 训练误差:模型在训练数据集上表现出的误差。 泛化误差:模型在任意一个测试数据样本上表现出的误差的期望。常常...
  • 深度学习相关概念:过拟合与欠拟合1.过拟合与欠拟合2.应对过拟合2.1最优方案2.1次优方案2.1.1L2正则化2.1.2Dropout 随机失活3.应对欠拟合3.1解决方案:   在神经网络中,我们常常听到过拟合与欠拟合这2个名词,...


      在神经网络中,我们常常听到过拟合与欠拟合这2个名词,他们到底是什么意思呢?

    1.过拟合与欠拟合

      过拟合
      是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。这种情况下模型可能只是记住了训练集数据,而不是学习到了数据特征。
      欠拟合
      模型描述能力太弱,以至于不能很好地学习到数据中的规律。产生欠拟合的原因通常是模型过于简单。

      我们要知道机器学习的根本问题是解决优化和泛化的问题。
      优化:
      是指调节模型以在训练数据上得到最佳性能
      泛化:
      是指训练好的模型在前所未见的数据(测试集)上的性能好坏
    在这里插入图片描述

    2.应对过拟合

    2.1最优方案

      获取更多的训练数据。只要给足够多的数据,让模型学习尽可能多的情况,它就会不断修正自己,从而得到更好的结果。就类似于当初参加高考的你,训练数据就类比是你在刷题,当你刷了非常非常多的题,并学会他们的特征,那么你应对高考则是游刃有余了。

      如何获取更多数据,可以有以下几个方法:

       1. 从数据源头获取更多数据
       2. 根据当前数据集估计数据分布参数使用该分布产生更多数据:这个一般不用,因为估计分布参数的过程也会代入抽样误差。
       3. 数据增强(Data Augmentation):通过一定规则扩充数据。如在物体分类问题里,物体在图像中的位置、姿态、尺度,整体图片明暗度等都不会影响分类结果。我们就可以通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充。

      但是获取到有效的数据往往是非常困难的,代价很大(所以在多数情况下不使用此方案)。那么有没有代价适中,又可以解决过拟合的方案呢?

    2.1次优方案

      调节模型允许存储的信息量或者对模型允许存储的信息加以约束,该类方法也称为正则化。即:

       1. 调节模型大小
       2. 约束模型权重,即权重正则化(在机器学习中一般使用 L2正则化)
       3. 随机失活(Dropout)

    2.1.1L2正则化

      总损失:
    L ( W ) = 1 N ∑ i L i ( f ( x i , W ) , y i ) ⏟ + λ R ( W ) ⏟ L(W)=\underbrace{\frac{1}{N} \sum_{i} L_{i}\left(f\left(x_{i}, W\right), y_{i}\right)}+\underbrace{\lambda R(W)} L(W)= N1iLi(f(xi,W),yi)+ λR(W)
                    数据损失       权重正则损失
      L2正则损失 :
    R ( W ) = ∑ k ∑ l W k , l 2 R(W)=\sum_{k} \sum_{l} W_{k, l}^{2} R(W)=klWk,l2
      L2正则损失对于大数值的权值向量进行严厉惩罚,鼓励更加分散的权重向量,使模型倾向于使用所有输入特征做决策,此时的模型泛化性能好!

    2.1.2Dropout 随机失活

      随机失活:让隐层的神经元以一定的概率不被激活。
      实现方式:训练过程中,对某一层使用Dropout,就是随机将该层的一些输出舍弃(输出值设置为0),这些被舍弃的神经元就好像被网络删除了一样。
      随机失活比率( Dropout ratio):是被设为 0 的特征所占的比例,通常在 0.2~0.5范
    围内。

      例:

    假设某一层对给定输入样本的返回值应该是向量:[0.2, 0.5, 1.3, 0.8, 1.1]。
    使用Dropout后,这个向量会有几个随机的元素变成:[0, 0.5, 1.3, 0, 1.1]

      Dropout是通过遍历神经网络每一层的节点,然后通过对该层的神经网络设置一个 Dropout ratio(随机失活比率),即该层的节点有Dropout ratio的概率失活。以这种方式“dropped out”的神经元既不参与前向传播,也不参与反向传播。

      随机失活为什么能够防止过拟合呢?
      解释1:
      随机失活使得每次更新梯度时参与计算的网络参数减少了,降低了模型容量,所以能防止过拟合。
      解释2:
      随机失活鼓励权重分散,从这个角度来看随机失活也能起到正则化的作用,进而防止过拟合。
    总的来说通过Dropout每次输入一个样本,就相当于该神经网络就尝试了一个新的结构,但是所有这些结构之间共享权重。因为神经元不能依赖于其他特定神经元而存在,所以这种技术降低了神经元复杂的互适应关系。正因如此,网络需要被迫学习更为鲁棒的特征(泛化性更强)
      在这里插入图片描述

      训练时使用随机失活,测试时怎么办?
      测试时不使用随机失活,而是计算所有权重,如下图所示
    在这里插入图片描述

    p=0.5 #p是神经元保持激话概率
    def train(X):
    	H1 = np.maximum(0,np.dot(W1,X) + b1)
    	U1 = np.random.rand(*H1.shape) < p #第一层的mask 
    	H1 *= U1 #第一层dropout操作
    	H2 = np.maximun(0,np.dot(W2,H1) + b2)
    	U2 = np.random.rand(*H2.shape) < p #第二层的mask
    	H2 *= U2#第二层dropout操作
    	out = np.dot(W3,H2) + b3
    def predict(X):
    	H1 = np.maximum(0,np.dot(W1,X) + b1) * p
    	H2 = np.maximun(0,np.dot(W2,H1) + b2) * p
    	out = np.dot(W3,H2) + b3
    

    3.应对欠拟合

    3.1解决方案:

      欠拟合的情况比较容易克服,解决方法有:

       1. 增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间。
      2. 添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。
       3. 减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数。
       4. 使用非线性模型,比如核SVM 、决策树、深度学习等模型 。
       5. 调整模型的容量(capacity),通俗地,模型的容量是指其拟合各种函数的能力。
       6. 容量低的模型可能很难拟合训练集;使用集成学习方法,如Bagging ,将多个弱学习器Bagging。

    展开全文
  • task03过拟合、欠拟合

    2021-01-06 17:23:41
    过拟合、欠拟合及其解决方案 过拟合、欠拟合的概念 权重衰减 丢弃法 模型选择、过拟合和欠拟合 训练误差和泛化误差 在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)...
  • 机器学习:过拟合与欠拟合问题

    千次阅读 2022-03-14 22:34:03
    本文首发于AI柠檬博客,原文链接:机器学习:过拟合与欠拟合问题 | AI柠檬 过拟合(overfitting)与欠拟合(underfitting)是统计学中的一组现象。过拟合是在统计模型中,由于使用的参数过多而导致模型对观测数据...

    本文首发于 AI柠檬博客,原文链接:机器学习:过拟合与欠拟合问题 | AI柠檬

    过拟合(overfitting)与欠拟合(underfitting)是统计学中的一组现象。过拟合是在统计模型中,由于使用的参数过多而导致模型对观测数据(训练数据)过度拟合,以至于用该模型来预测其他测试样本输出的时候与实际输出或者期望值相差很大的现象,。欠拟合则刚好相反,是由于统计模型使用的参数过少,以至于得到的模型难以拟合观测数据(训练数据)的现象。

    我们总是希望在机器学习训练时,机器学习模型能在新样本上很好的表现。过拟合时,通常是因为模型过于复杂,学习器把训练样本学得“太好了”,很可能把一些训练样本自身的特性当成了所有潜在样本的共性了,这样一来模型的泛化性能就下降了。欠拟合时,模型又过于简单,学习器没有很好地学到训练样本的一般性质,所以不论在训练数据还是测试数据中表现都很差。我们形象的打个比方吧,你考试复习,复习题都搞懂了,但是一到考试就不会了,那是过拟合;如果你连复习题都还没搞懂,更不用说考试了,那就是欠拟合。所以,在机器学习中,这两种现象都是需要极力避免的。

    举一个简单的例子吧,我们来看一下下面这一张图。我们有一些数据样本,大致呈二次函数形式,可以看出,用二次函数来做回归拟合是最合适的。如果我们不呢?比如,我们用最高次为6次的函数来拟合,我们可能会得到如图左边那样的曲线,显然,这并不是我们想要的模型,它把个别数据的偶然偏差也当成了共性而完美拟合了进去;或者我们用线性的函数来拟合它,我们可以得到大概如右图的函数直线,这显然没有很好的拟合训练样本数据,更不用说测试数据了。

    (过拟合与欠拟合示意图)

    相对来说,欠拟合比较容易解决。如果是统计回归模型,我们只需要增加模型的参数就可以了,原来是线性模型,那么现在改为二次模型就行,原来是线性回归,现在改为二次回归即可。如果是神经网络模型,我们可以通过增加网络的层数和每一层的神经元数目即可,尤其是增加网络层数的效果更好。如果你现在不知道神经网络是什么东东也不要紧,只要你能理解统计回归就行。但是过拟合就不是那么简单的了。

    关于在神经网络方面的欠拟合问题的解决方法请查看:
    深度学习:欠拟合问题的几种解决方案

    发生过拟合说到底还是训练数据与训练参数的比例太小而导致的,所以,我们可以通过增加数据量或者适当减小参数数量来解决。增加训练数据量是根据大数定理,当数据量足够大时,训练模型会无限逼近实际,而减小参数数量则是人工根据模型的需要,剔除那些跟得到模型不太相关的参数来实现。但是如果我们无法增加数据量或者这些参数都是有用的不能去除怎么办?

    还有办法,那就是正则化(Regularization),这也是常用的一种方法。通常,为了防止过拟合,我们都会在目标方程中添加一个正则项(regularization term),且通过正则因子(或“正则化参数”,英文:Regularization Coefficient或Regularization Parameter)λ来平衡目标方程与正则项。比如,在对数几率回归(Logistic Regression)中,我们可以对其代价函数(Cost Function)和其梯度函数进行正则化,如下图:

    正则化后的代价函数:

    正则化后的梯度函数: 

    在相应的MATLAB代码文件CostFunction.m中,我们将其中的内容改写为如下代码:

    function [J, grad] = CostFunction(theta, X, y)
    m = length(y); % 训练样本数
    J = 0;
    grad = zeros(size(theta));
    
    theta_1=[0;theta(2:end)];    % 先把theta(1)拿掉,不参与正则化
    lambda = 1;    % 正则因子
    J = sum(-y .* log(sigmoid(X * theta)) - (1 - y) .* log(1 - sigmoid(X * theta)) )/m  + lambda/(2*m) * theta_1' * theta_1;
    grad = (X' * (sigmoid(X * theta) - y))/m + lambda/m * theta_1;
    
    end

     

    加入了正则项之后,我们明显可以发现训练之后的代价值(cost)明显增加,这说明之前的模型一定程度上出现了过拟合现象。比如,我们上次的那个对数几率回归2里面的模型,同样还是使用梯度下降,经过训练后代价值变为0.3492,θ参数变成[-1.5586; 1.4058; 1.2670]。

    你一定很好奇,为什么正则化可以防止过拟合呢?很多讲者并没有过多提及,而很多人的文章上也表示其原理不容易明白。简单地理解就是,通过加入一个正则项,在最小化新的代价函数的时候,正则项使得预测值与真实值之间的误差并不会达到最小,也就是说它是不会去完美拟合的,这样也就防止了过拟合,提高了机器学习模型的泛化能力。

    一种最常用的正则化技术是权重衰减,通过加入的正则项对参数数值进行衰减,得到更小的权值。对于一些本身权重就很小的参数来说,其本身对结果的影响微乎其微,尤其是λ较大的时候,正则项的加入使得其几乎衰减到零,相当于去掉了这一项特征,类似于减少特征维度。当然了,式子中一项减少,正则化使得其他项的权值可能还会有所增加。而当 λ 较小时,我们会得到相对来说更小一些的代价函数值,而此时拟合的会更精细一些。

    更确切的来说,根据吴恩达教授在斯坦福大学机器学习公开课中的讲解,我们来用多项式拟合来说,如果我们只需要到二次项就可以了,如果还有更高次项的话,加入正则项,相当于减小参数的大小,因为是更高次的项的出现导致了过拟合,那么我们就减小它们使其趋近于0就好了。所以,我们修改代价函数,对3次项4次项乃至更高次的项加入正则项,给予机器学习模型一些惩罚。不论是线性回归还是对数几率回归,我们可以对每一项都加入正则项来惩罚,不过根据惯例,我们不对θ0进行惩罚。

    如果我们令λ的值很大的话,为了使 Cost Function 尽可能的小,所有的 θ 的值(不包括 θ0)都会在一定程度上减小。不过我们要选一个合适的正则化参数λ,太大的话,使得参数都接近于零,只剩下θ0,又会出现欠拟合。至于具体选择什么值,我们可以通过多尝试几次来确定,如果你有更好的想法,欢迎在下面评论中跟我讨论。

    过拟合问题与欠拟合问题是一组很重要的机器学习问题,这是你在今后的机器学习实验中会经常遇到的。正则化是解决过拟合问题的法宝,掌握正则化这一方法是非常重要的。当你学会线性回归、对数几率回归、使用梯度下降法和正则化方法之后,你就已经掌握了丰富的机器学习知识,可以用这些知识来做一些机器学习产品。

     本文首发于 AI柠檬博客,原文链接:机器学习:过拟合与欠拟合问题 | AI柠檬

    如果你想学习更多机器学习的内容,欢迎访问AI柠檬博客~

    展开全文
  •  1,过拟合和欠拟合的定义  2, 过拟合和欠拟合的解决方法  3, 梯度消失和爆炸的定义  4,梯度消失和爆炸的解决方法 1,过拟合和欠拟合的定义  无论在机器学习还是深度学习建模当中都可能会遇到两种最常见...
  • 01欠拟合概念:模型在训练集、验证集和测试集上均表现不佳的情况,即我们的模型在效果上偏差较大。产生的主要原因:1、模型的复杂程度过低,无法很好的对数据进行拟合2、用于训练的有效特征量过少,模型无法学到有效...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,598
精华内容 12,239
关键字:

欠拟合

友情链接: fifo.rar