模型L1及L2正则化,欠拟合及过拟合讲解

一、欠拟合和过拟合

拟合是指机器学习模型在训练的过程中,通过更新参数,使得模型不断契合可观察数据的过程。
欠拟合:是指模型在训练集、验证集和测试集上均表现不佳的情况 。
过拟合:是指模型在训练集上表现很好,到了验证和测试阶段就很差,即模型的泛化能力很差。
在这里插入图片描述
案例
1、使用线性回归模型在比萨饼数据训练样本上进行拟合

# 使用线性回归模型在比萨训练样本上进行拟合
import numpy as np
from sklearn.linear_model import LinearRegression  #线性回归模型
import matplotlib.pyplot as plt
x_train = [[6],[8],[10],[14],[18]]
y_train = [[7],[9],[13],[17.5],[18]]
regressor=LinearRegression()
regressor.fit(x_train,y_train)
xx=np.linspace(0,26,100)  #在0-25上均匀采样100个数据点
xx=xx.reshape(xx.shape[0],1) #数据维度转化
yy=regressor.predict(xx)
plt.scatter(x_train,y_train)
plt1,=plt.plot(xx,yy,label='Degree=l')
plt.axis([0,25,0,25])
plt.xlabel('Diameter of pizza')
plt.ylabel('price of pizza')
plt.legend(handles=[plt1])
plt.show()

在这里插入图片描述

print('回归模型在训练集上的R方:',regressor.score(x_train,y_train))

在这里插入图片描述
2、使用2次多项式回归模型进行拟合

from sklearn.preprocessing import PolynomialFeatures #从sklearn.preproessing 中导入多项式特征产生器
poly2=PolynomialFeatures(degree=2)
x_train_poly2=poly2.fit_transform(x_train)
regressor_poly2 = LinearRegression() #以线性回归器为基础,初始化回归模型
regressor_poly2.fit(x_train_poly2,y_train) #2次多项式回归模型训练
xx_poly2=poly2.transform(xx)
yy_poly2=regressor_poly2.predict(xx_poly2)
plt.scatter(x_train,y_train)
plt1,=plt.plot(xx,yy,label='Degree=l')
plt2,=plt.plot(xx,yy_poly2,label='Degree=2')
plt.axis([0,25,0,25])
plt.xlabel('Diameter of pizza')
plt.ylabel('price of pizza')
plt.legend(handles=[plt1,plt2])
plt.show()

在这里插入图片描述

print('2次多项式回归模型在训练集上的R方:',regressor_poly2.score(x_train_poly2,y_train))

在这里插入图片描述
3、使用4次多项式回归模型进行拟合

from sklearn.preprocessing import PolynomialFeatures #从sklearn.preproessing 中导入多项式特征产生器
poly4=PolynomialFeatures(degree=4)
x_train_poly4=poly4.fit_transform(x_train)
regressor_poly4 = LinearRegression() #以线性回归器为基础,初始化回归模型
regressor_poly4.fit(x_train_poly4,y_train) #2次多项式回归模型训练
xx_poly4=poly4.transform(xx)
yy_poly4=regressor_poly4.predict(xx_poly4)
plt.scatter(x_train,y_train)
plt1,=plt.plot(xx,yy,label='Degree=l')
plt2,=plt.plot(xx,yy_poly2,label='Degree=2')
plt4,=plt.plot(xx,yy_poly4,label='Degree=4')
plt.axis([0,25,0,25])
plt.xlabel('Diameter of pizza')
plt.ylabel('price of pizza')
plt.legend(handles=[plt1,plt2,plt4])
plt.show()

在这里插入图片描述

print('4次多项式回归模型在训练集上的R方:',regressor_poly4.score(x_train_poly4,y_train))

在这里插入图片描述
评估3种模型在测试集上的性能表现

#测试数据
x_test = [[6],[8],[11],[16]]
y_test = [[8],[12],[15],[18]]
print('回归模型在测试集上的R方:',regressor.score(x_test,y_test))
x_test_poly2=poly2.transform(x_test) #使用测试数据对2次多项式回归模型的性能进行评估
print('2次多项式回归模型在测试集上的R方:',regressor_poly2.score(x_test_poly2,y_test))
x_test_poly4=poly4.transform(x_test) #使用测试数据对4次多项式回归模型的性能进行评估
print('4次多项式回归模型在测试集上的R方:',regressor_poly4.score(x_test_poly4,y_test))

在这里插入图片描述
  当模型复杂度很低时,模型不仅没有对训练集上的数据有良好的拟合状态,而且在测试集上也表现平平。一味追求模型复杂度,尽管模型几乎完全拟合所有的训练数据,但模型也变得非常被动,几乎丧失了对未知数据的拟合能力。这两种情况都是缺乏模型泛化能力的表现。
  期望模型可以充分利用训练数据,避免欠拟合,又不断追求模型泛化能力,这就要求在增加模型复杂度,提高在可观察数据上的性能表现的同时,又需要兼顾模型泛化能力,防止过拟合的现象,为了协调两难的选择,后面会主要细讲下常采用的两种模型正则化的方法,分别是L1范数正则化和L2范数正则化。

1、欠拟合和过拟合的原因

造成过拟合原因:
(1)样本数据量太少
(2)样本噪声过大
(3)模型参数设置不当
(4)模型参数过多,复杂度过高
造成欠拟合原因:
(1)模型复杂度过低
(2)特征量过少

2、解决欠拟合和过拟合的方法

解决过拟合方法:
(1)获取更多数据:通过收集更多的数据,或者用数据增强的方法,产生更多的训练数据;从而阻止模型学习不相关的特征。
  使机器学习或深度学习模型泛化能力更好的办法就是使用更多的数据进行训练,只要给足够多的数据,让模型「看见」尽可能多的「例外情况」,它就会不断修正自己,从而得到更好的结果。
如何获取更多数据?
  增加训练样本数量:过拟合是由于模型学习到了数据的一些噪声特征导致,如果训练数据集中样本数过少,特别是比模型参数数量更少时,过拟合更容易发生。因此,在计算资源允许的范围之内,增加训练数据的量能够减少噪声的影响,让模型更多地学习数据的一般特征。常见的增加样本数量方式: SMOTE算法,使用生成对抗网络(GAN)来合成大量的新训练数据
  数据增强:是指在维持样本标签不变的条件下,根据先验知识改变样本的特征,使得新产生的样本也符合或者近似符合数据的真实分布,是增加训练数据的一种方式。常见的数据增强方式:翻转、平移、旋转、缩放、更改亮度、改变视角等方法实现。(图像/图片数据集)
(2)减少特征数:当特征数量过多时,可以通过减少相关性系数较小的特征来减少特征数量,防止过拟合的情况发生。
人工的选择保留哪些特征
  去掉那些取值变化小的特征(某特征的特征值只有0(95%)和1(5%))。
  从业务范围分析,观察特征与业务的相关性,有着直接关系的数据,建议保留,反之,可以考虑删除。
模型选择算法
  统计方法:皮尔逊相关系数、卡方检验、方差分析、互信息法等。
  机器学习模型:随机森林算法(根据特征的重要性来选择特征)和降维(主成分分析法PCA、线性判别分析法LDA)。
包装方法
  前向选择:从模型没有特征开始。在每次迭代中,不断添加特征直到添加新变量不会提高模型的性能。
  后向选择:在每次迭代中删除最微不足道的特征,从而提高模型的性能。重复直到在删除变量时未观察到任何改进。
  递归特征消除:原理上首先要指定一个基模型,可以是lr或者decisionTree,这个基模型通过coef_属性来描述特征的重要性,这样在每一轮训练过程中消除掉一些权重较小的特征直至训练结束。
(3)调整参数和超参数:通过网格搜索在所有候选的参数中,通过循环遍历尝试每一种可能性,表现最好的参数就是最终的结果。
  在机器学习模型中,需要人工选择的参数称为超参数。比如随机森林中决策树的个数,人工神经网络模型中隐藏层层数和每层的节点个数,正则项中常数大小等。超参数选择不恰当,就会出现欠拟合或者过拟合的问题。选择超参数的时候,有两个途径:凭经验微调和选择不同大小的参数,带入模型中挑选表现最好的参数组合。挑选超参数的一种方法是手动调整,这么做的问题是非常耗费开发时间。项目中一般使用自动化的搜索方法优化超参数。常见的方法包括网格搜索和随机搜索。
  网格搜索即穷举搜索,在所有候选参数中通过循环遍历尝试每一种可能性,表现最好的参数就是最终的结果。这种方法主要缺点是比较耗时。所以它适用于三四个(或者更少)的超参数。
实现:sklearn.model_selection.GridSearchCV。
  随机搜索使用方法和网格搜索很相似,他不是尝试所有可能的组合,而是通过选择每一个超参数的一个随机值的特定数量的随机组合,在超参数空间中搜索几十几百个点,其中就有可能有比较小的值。
实现:sklearn.model_selection. RandomizedSearchCV。可见网格搜索、随机搜索
(4)降低模型复杂度:神经网络,减少网络层数和神经元个数;决策树模型中降低树的深度,进行剪枝。
(5)增大正则化系数:加入正则化项并提高正则化项的系数。 对复杂模型和系数比较大的模型进行惩罚,使得算法倾向于训练简单的模型。
解决欠拟合方法
(1)增加模型特征
  从业务思路上构造新特征是最重要的优化措施,可以考虑加入进特征组合、高次特征,来增大假设空间。
(2)使用更复杂的模型
  使用一个更加复杂的算法或模型。例如用神经网络来替代线性回归,用随机森林来代替决策树等。
(3)减少正则化系数
  正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化系数。
(4)调整模型的容量
  容量低的模型可能很难拟合训练集;使用集成学习方法,如Bagging ,boosting,stacking。
Bagging
  Bagging方法中,利用bootstrap方法从整体数据集中采取有放回抽样得到N个数据集,在每个数据集上学习出一个模型,最后的预测结果利用N个模型的输出得到,具体地:分类问题采用N个模型预测投票的方式,回归问题采用N个模型预测平均的方式。 Bagging中有代表性的是随机森林算法。
Boosting
  提升方法(Boosting)是一种可以用来减小监督学习中偏差的机器学习算法。主要也是学习一系列弱分类器,并将其组合为一个强分类器。Boosting中有代表性的是AdaBoost、GBDT算法。
Stacking
  Stacking方法是指训练一个模型用于组合其他各个模型。首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。

二、L1范数正则化

损失函数、经验风险、结构风险
损失函数:是定义在单个训练样本的损失/误差。
0-1损失函数:
在这里插入图片描述
平方损失函数:
在这里插入图片描述
绝对值损失函数:
在这里插入图片描述
对数损失:
在这里插入图片描述
指数损失:
在这里插入图片描述
经验风险:是定义模型关于训练集的平均损失。
在这里插入图片描述
  所谓经验风险最小化即对训练集中的所有样本点损失函数的平均最小化。经验风险越小说明模型f(x)对训练集的拟合程度越好,用于衡量模型性能的指标。
结构风险:是定义在经验风险的基础上加上表示模型复杂度的正则项,它是为了防止过拟合提出的策略。
在这里插入图片描述
  J(f) 是模型的复杂度,模型 f 越复杂,J(f)值就越大,模型越简单,J(f)值就越小。J(f) 是对复杂模型的惩罚。为什么说是惩罚呢?因为求解的目标是整体达到最小值,经验风险越小,模型越复杂,J(f) 的值越大,就迫使模型不要太复杂,就是惩罚。λ 是正则项的系数,λ≥0 ,用以权衡经验风险和模型复杂度。
模型的复杂度和参数向量有关,正则化的目的是限制参数过多或者过大,避免模型更加复杂。
在这里插入图片描述
在这里插入图片描述
L1正则化
  正则化就是在损失函数后加上一个正则化项(惩罚项),作用是选择经验风险与模型复杂度同时较小的模型。一般有L1正则与L2正则,通常模型越复杂,正则化值越大。正则化参数太小容易产生过拟合,太大容易产生欠拟合。正则化的一种理论解释是它试图引入奥卡姆剃刀原则,其思想为:在所有可能选择的模型中,我们应该选择能够很好地解释已知数据并且十分简单的模型。
  L1正则是基于L1范数,即在目标函数后面加上参数的L1范数和项,即:
在这里插入图片描述
  其中C0代表原始的损失函数,后面一项就是L1正则化项,它是所有参数w的绝对值和,除以训练集的样本大小n, λ就是正则项系数,权衡正则项与C0项的比重。 这种正则化方法的结果会让参数向量中的许多元素趋向于0,使得大部分特征失去对优化目标的贡献。而这种让有效特征变的稀疏的L1正则化模型,通常被称为Lasso。

#LASSO模型在4次多项式特征上的拟合表现
from sklearn.linear_model import Lasso
Lasso_poly4=Lasso()
Lasso_poly4.fit(x_train_poly4,y_train)  #使用Lasso对4次多项式特征进行拟合
print('Lasso模型在测试集上的R方:',Lasso_poly4.score(x_test_poly4,y_test))
print('Lasso模型参数:',Lasso_poly4.coef_)  #Lasso模型参数

在这里插入图片描述

print('4次多项式回归模型在测试集上的R方:',regressor_poly4.score(x_test_poly4,y_test))
print('4次多项式回归模型参数:',regressor_poly4.coef_)

在这里插入图片描述
综上所述:
(1)相比普通4次多项式回归模型在测试集上的表现,Lasso模型性能提高大约3%
(2)Lasso模型拟合后的参数列表中,4次和3次特征的参数均为0,使特征更加稀疏

三、L2范数正则化

  L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即:
在这里插入图片描述
  其中C0代表原始的损失函数,后面一项就是L2正则化项,它是所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。而这种让有效特征变的稀疏的L2正则化模型,通常被称为Ridge。

print('4次多项式回归模型参数:',regressor_poly4.coef_)
#输出这些参数的平方和,验证参数之间的巨大差异
print('4次多项式回归模型参数的平方和:',np.sum(regressor_poly4.coef_**2))

在这里插入图片描述

from sklearn.linear_model import Ridge
Ridge_poly4=Ridge()
Ridge_poly4.fit(x_train_poly4,y_train)  #使用Ridge对4次多项式特征进行拟合
print('Ridge模型在测试集上的R方:',Ridge_poly4.score(x_test_poly4,y_test))
print('Ridge模型参数:',Ridge_poly4.coef_)  #Ridge模型参数
print('Ridge模型参数的平方和:',np.sum(Ridge_poly4.coef_**2))

在这里插入图片描述
综上所述:
(1)相比普通4次多项式回归模型在测试集上的表现,Ridge模型性能提高大约3%
(2)相比普通4次多项式回归模型,Ridge模型拟合后的参数之间差异非常小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值