过拟合及应对方法

训练误差和泛化误差
    训练误差
        模型在训练数据集上表现的误差
    泛化误差
        模型在任意一个测试数据样本上表现的误差期望,常常通过测试数据集上的误差来近似
    计算训练误差和泛化误差可以使用损失函数(loss),线性回归使用平方误差损失函数  softmax回归使用交叉熵损失函数
模型选择
    从严格意义上讲,测试集只能在所有超参数和模型参数选定后使用一次,不可以使用测试集选择模型,如调参。、
    也无法从训练误差来估计泛化误差,因此也不能依赖训练数据选择模型。鉴于此,可以预留一部分在训练数据集和测试数据集以外的数据
    进行模型选择。这部分数据叫做验证数据集,也称为验证集。
    在实践中验证数据集和测试数据集的界限比较模糊。
K折交叉验证
    由于验证数据集不参与模型训练,当训练数据不够时,预留大量的验证数据是太奢侈了。通常使用K折交叉验证,来改善这种状况.
    K折交叉验证
        把原始训练集分割成k个不重合的子数据集,然后我们做k次模拟训练和验证。每次使用一个数据子集作为验证数据集,其他k-1个
        子数据集来训练模型。在这个k次训练和验证中,每次用来验证模型的子数据集都不同,最后对k次训练误差和验证误差分别求平均
'''
'''
欠拟合 过拟合
    欠拟合
        模型无法得到较低的训练误差
    过拟合
        训练误差远小于他在测试集上的误差
    一般我们要尽可能的同时应对过拟合 欠拟合 现在一般讨论的两个因素是 模型复杂度和训练数据集大小
'''
'''
模型复杂度
    在高阶多项式函数模型中,参数更多,所以可选的模型函数更多,所以高阶多项式函数的复杂度更高。因此高阶多项式函数模型比
    低阶多项式函数模型更容易在相同的训练集上得到更低的训练误差。给定训练数据集,如果模型的复杂度过低,很容易出现欠拟合
    模型复杂度更高,容易出现过拟合,因此要根据数据集选择合适复杂度模型
训练数据集大小
    一般来说训练数据集样本数过少,特别是比模型参数(按元素计算)更少时,容易过拟合
    泛化误差不会随着训练数据集里面的样本数量增加而增大。在计算资源允许的情况下,我们希望数据集大一些,特别是
    模型复杂度比较高时。
'''

控制过拟合的四种方法

(1)L1正则化

我们经常听到这样的话:“L1正则化是为了产生稀疏矩阵”,L1正则化的实现是在loss函数后面添加一个权重绝对值之和的项,该和再乘以一个系数,这个系数就是L1正则化的系数。这样做可以使得一些权重的值为0,降低了模型的复杂度,从而控制过拟合。

 

(2)L2正则化

L2正则化跟L1正则化的区别在于loss函数后加的是权重^2之和,该和再乘以一个系数,这个系数就是L2正则化的系数。这样做可以使得一些高次方项的权重为0,从而也降低了模型复杂度,控制了过拟合。以下是L2正则化的简单实现


weight_decay (float, optional): weight decay (L2 penalty) (default: 0)

optimizer_w = torch.optim.SGD(params=[net.weight], lr=lr, weight_decay=wd)

def l2_penalty(w):
    return (w**2).sum()/2

(3)早停法

早停是在训练过程中所采用的方法,在训练模型的时候观察验证集上的表现,如果验证集上的loss开始上升的时候,停止训练模型,从而阻止了模型进一步变得复杂

(4)丢弃法

丢弃法一般用于全连接神经网络,它指的是一些神经元不继续传递其值,从而活动的神经元的数量变少,减少了模型的复杂度。



 

你可能感兴趣的:(数据分析)