机器学习(课堂笔记)Day07:多项式回归

目录

0x00 什么是多项式回归

0x01 scikit-learn中的多项式回归

0x02 过拟合和欠拟合

0x03 为什么要有训练数据集 与测试数据集

0x04 学习曲线

0x05 验证数据集与交叉验证

0x06 k-folds 交叉验证

0x07 偏差方差权衡

0x08 模型泛化与岭回归

0x09 LASSO Regularization

0x0A L1 ,L2 和弹性网络


0x00 什么是多项式回归

线性回归假设数据之间存在线性关系,那么当数据之间不存在线性关系时,应该用什么来拟合数据呢?  多项式回归

例如:

从x的角度来看 y=ax^2 +bx +c 是一个多项式回归,但是如果将x^2 看成一个特征 ,x看成另一个特征,那么 y=ax^2 +bx +c  仍旧是一个线性回归。

编程实现:

0x01 scikit-learn中的多项式回归

0x02 过拟合和欠拟合

过拟合:overfitting 算法所训练出来的模型过多的表达了数据间的噪音关系。模型为了拟合所有的样本点,变得过于复杂了
欠拟合:underfitting 算法所训练出来的模型不能完整表述数据关系

以猫和狗的识别为例:

如果机器学习算法认为 有眼睛就是狗,显然是欠拟合

如果机器学习算法认为 有眼睛...毛发为黄色的是狗,显然是过拟合。毛发为黄色只是训练数据的特征,这个特征不是一般性的特征

下面的例子中:我们的样本点是用2次方程加上一点噪音生成的,如果用一次方程去拟合,就是欠拟合,如果用高于二次方程的高次方程去拟合,就很有可能过拟合

0x03 为什么要有训练数据集与测试数据集

之前过拟合的曲线,如果我们取x=2.5,那么得到y_predict= 0.5左右,很明显和其他样本点不在一个趋势上。虽然过拟合曲线将现有的样本点拟合的非常好,但是对于新样本,过拟合曲线就不能很好的预测了。我们称这种模型的泛化能力不是很好

对训练数据拟合程度有多好是没有意义的,我们真正需要的是模型的泛化能力,所以我们需要将原本的数据分离为训练数据与测试数据。如果用训练数据训练出来的模型,对测试数据也有很好的结果的话,我们就说我们的模型泛化能力是很强的。

例如kNN算法,k=样本个数时,模型复杂度是最低的,因为此时预测新样本,需要选择原有样本中个数最多的标签即可。而k=1时,模型是最复杂的,此时模型的泛化能力反而不好

编程:

0x04 学习曲线

学习曲线:随着训练样本的逐渐增多,算法训练出的模型的均方根误差的变化曲线

欠拟合的情况: 学习曲线稳定后,训练数据集和测试数据集的均方根误差都比最佳的图要大(1.5 左右),说明我们的模型对训练数据集以及测试数据集的拟合效果都不够好

过拟合的情况:学习曲线稳定后,均方根误差和最佳的图相当,但是训练数据集的学习曲线和测试数据集的学习曲线之间差距较大,说明模型对训练数据集的拟合很好,但是在测试数据集上表现不佳,泛化能力弱。

0x05 验证数据集与交叉验证

之前我们将我们现有的数据集分为训练数据集和测试数据集,用测试数据集来测试模型的泛化能力,但是这样仍然存在一个问题:我们可能只是针对特定测试数据集拟合的很好,也就说,针对特定测试数据集过拟合

解决方案一:

将现有的数据集分为三部分:

训练数据:用来训练模型

验证数据:用来测试训练出来的模型,不断调整超参数,保证训练出来的模型针对验证数据已经达到最优

测试数据:作为衡量最终模型性能的数据集

解决方案二:交叉验证

方案一具有一个缺点,因为我们只有一份验证数据集,所以容易过拟合验证数据集,一旦验证数据集中有比较极端的数据,就有可能导致训练出来的模型不准确。

为了解决该问题,便提出了交叉验证:

将原有的训练数据集分为k份,每份被称为一个折叠(fold)。这样一来,便有k种组合方式,每份都可以充当一次验证数据集的角色,其余的k-1份fold组成训练数据集。于是便得到了k个模型,每个模型在验证数据集上都会得到一个性能指标,一共得到k个性能指标(MAE/MSE/R2),这k个性能指标的均值作为衡量当前算法得到模型的最终标准,这个值通常被称为“交叉验证得分”。

除了k-fold cross-validation之外,还有以下几种常见的交叉验证方法:

  1. 留一法(Leave-One-Out Cross-Validation,LOOCV):在这种方法中,每个样本都被用作测试集,其余样本作为训练集,因此得名“留一法”。它是一种极端的交叉验证方法,对于小型数据集非常有效,但在大型数据集上计算成本较高。

  2. 随机分组交叉验证(Stratified Sampling Cross-Validation):在这种方法中,数据集被随机分成训练集和测试集,通常采用分层抽样的方式来保证训练集和测试集中的类别比例与原数据集相同。这种方法通常在不平衡数据集上使用。

  3. 滑动窗口交叉验证(Time Series Cross-Validation):这种方法通常用于时间序列数据。在这种方法中,数据被按照时间顺序分成若干份,每个时间窗口被用作测试集,其余时间窗口作为训练集。

这些交叉验证方法的具体实现细节可能有所不同,但它们的目的都是评估模型在新数据上的性能和泛化能力,从而帮助选择最佳的模型或算法,并为超参数调整提供参考。在实践中,需要根据具体的问题和数据集特征来选择合适的交叉验证方法。

代码:

0x06 k-folds 交叉验证

把训练集分为k份,称为k-folds cross validation

缺点:每次需要训练k个模型,相当于整体性能慢了k倍

留一法:loo-cv leave-one-out cross validation

把训练数据集一共有m个样本,我们就将其分成m份,每次都将m-1份样本用于训练,然后去用模型测试剩下的一份样本,称为留一法。

优点:完全不受随机的影响,最接近模型真正的性能指标

缺点:m个中选1个,一共有m种情况,也就说我们需要训练m个模型来交叉验证,计算量巨大

0x07 偏差方差权衡

区分偏差和方差:

高偏差:模型准确率一直很低

高方差:模型准确率忽高忽低,即针对某些样本预测准确率很高,针对某些样本预测准确率很低。

模型误差 = 偏差(Bias)+方差(Variance)+不可避免的误差

导致偏差的主要原因:

对问题本身的假设不正确,如:非线性数据使用线性回归,例如:欠拟合

高方差:

数据的一点点扰动,都会较大的影响模型,通常原因:使用的模型太复杂,没有学习到本质,而是学习到了许多噪音,例如高阶多项式回归,过拟合

有一些算法天生是高方差的算法,例如kNN(数据敏感)

非参数学习算法通常都是高方差算法。因为不对数据进行任何假设

有一些算法天生是高偏差算法,如线性回归

参数学习通常都是高偏差算法,因为对数据具有极强的假设。

大多数算法具有相应的参数,可以调整偏差和方差,例如kNN中的k,如线性回归中使用多项式回归

偏差和方差通常是矛盾的

降低偏差,会提高方差

降低方差,会提高偏差

机器学习算法的主要挑战,来自于方差。

解决高方差的通常手段:

1.降低模型的复杂度

2.减少数据的维度,降噪

3.增加样本数

4.使用验证集

5.模型正则化

0x08 Ridge 正则化(L2 正则化)

模型正则化 Regularization: 指在模型训练过程中向目标函数中添加一些约束或者惩罚项,以减小模型复杂度、防止过拟合并提高模型的泛化能力

我们之前的损失函数是:使真实值和预测值的均方误差尽可能的小

但是当我们过拟合的时候,很有可能导致模型参数非常的大, 即曲线某些部分会非常陡峭,如下图:

我们如何才能让theta不要过大呢?可以使用L2正则化,向损失函数中添加一个惩罚项: 模型参数的平方和

我们在最小化损失函数的时候考虑到模型参数的大小,不要让曲线太陡峭

为什么没有theta0呢?因为theta0不是任何一个特征值的参数,theta0只是曲线的截距,决定了曲线的高低,而不会决定曲线的陡峭和缓和。

前面的1/2加不加都可以,只是为了求导后正好可以与theta头上的2约掉,方便计算。

α 是一个新的超参数,α代表了 theta平方和 占整个损失函数的比重的多少。我们有多重视对模型陡峭程度的优化。

以上这种模型正则化的方式称为 岭回归(Ridge Regression)

代码示例:

0x09 LASSO Regularization (L1 正则化)

LASSO: Least Absolute Shrinkage and Selection Opeartor Regression

代码:

如果一部分theta变为0了,就说明LASSO认为这些特征是完全没有用的,

但是有时会将一些原本有用的特征的参数变为0

0x0A L1 正则化,L2正则化 ,弹性网正则化

L1正则 L2正则:

Lp范数:xi到原点的明科夫斯基距离

L0正则:

让非零theta的个数尽可能少

实际用L1取代,因为L0正则的优化是一个NP难的问题

弹性网正则化:Elastic Net 正则化

向损失函数中同时添加了一个L1惩罚项和L2惩罚项,同时引入一个新的超参数 r ,来表示这两项的比例:

弹性网(Elastic Net)正则化之所以被称为“弹性网”,是因为它在L1(Lasso)和L2(Ridge)正则化之间具有弹性和灵活性。它将L1和L2正则化的优点结合起来,允许你在两者之间进行权衡。这种权衡让模型具有一定程度的稀疏性(由L1正则化引入),同时保持一定的平滑性(由L2正则化引入)。

弹性网正则化在以下情况下特别有用:

  1. 当特征之间存在多重共线性时(即特征之间高度相关),弹性网正则化可以更好地处理这种问题。
  2. 当有大量的特征和稀疏解时,弹性网正则化相较于Ridge正则化可以得到更稀疏的解,从而提高模型的可解释性。

L2正则化(Ridge)相对于L1正则化(Lasso)有以下优点:

  1. 平滑性:L2正则化倾向于将模型参数均匀地减小,而不是完全消除它们。这可以导致模型在预测时更加平滑和稳定。

  2. 多重共线性处理:在特征之间存在多重共线性的情况下(即特征之间高度相关),L2正则化可以更好地处理这种问题。L1正则化可能会随机选择其中一个具有高度相关性的特征并将其它特征的权重设置为零,而L2正则化会保留所有相关特征并为它们分配较小的权重,这有助于提高模型的稳定性。

  3. 解的存在性:在某些情况下,L1正则化可能无法找到唯一解(例如,在特征数量大于训练样本数量时)。L2正则化通常可以找到唯一解,因为它的目标函数是严格凸的。

  4. 梯度计算:L2正则化的梯度计算更为简单,因为它是可微的。L1正则化在参数为零处不可微,因此在实现梯度下降法时可能需要特殊处理。

然而,L1正则化在产生稀疏模型(即具有许多零权重参数的模型)方面具有优势,这可以提高模型的可解释性以及在某些情况下的性能。在实际应用中,根据具体问题的需求和特点选择合适的正则化方法是很重要的。弹性网正则化(Elastic Net)是一种将L1和L2正则化结合起来的方法,可以在两者之间进行权衡。

选择使用L1(Lasso)还是L2(Ridge)正则化取决于具体问题的特点和需求。以下是一些决定使用哪种正则化的指导原则:

  1. 特征选择:

    • 如果你希望进行特征选择,即希望模型具有稀疏性并只保留一部分重要特征,那么应该使用L1正则化。L1正则化可以将某些参数权重压缩至零,从而产生稀疏模型。
    • 如果你认为所有特征对模型预测都有一定的贡献,应该使用L2正则化。L2正则化不会将参数完全压缩至零,而是分配较小的权重给所有特征。
  2. 多重共线性:

    • 如果数据集中存在多重共线性(特征之间高度相关),那么L2正则化会更好地处理这种问题,因为它会为所有相关特征分配较小的权重。
    • 在这种情况下,L1正则化可能会随机选择一个相关特征并将其它特征的权重设置为零,这可能导致模型稳定性较差。
  3. 数据集大小和特征数量:

    • 当特征数量大于训练样本数量时,L1正则化可能更适合,因为它可以产生稀疏模型,减少过拟合的风险。
    • 在这种情况下,L2正则化可能导致模型过于复杂,从而引起过拟合。
  4. 模型解释性:

    • 如果模型的解释性很重要,那么应该使用L1正则化。稀疏模型只保留了一部分重要特征,这使得解释模型预测的原因更加容易。
    • 如果模型的平滑性和稳定性更重要,那么应该使用L2正则化。

在实践中,如果不确定哪种正则化方法更适合你的问题,可以尝试使用弹性网(Elastic Net)正则化,它结合了L1和L2正则化,通过调整参数可以在两者之间进行权衡。通过交叉验证等模型选择方法,可以确定最佳的正则化参数和方法。

总结:

模型正则化中的“正则”通常是指在模型训练过程中添加一些约束或者惩罚项,以减小模型复杂度、防止过拟合并提高模型的泛化能力。正则化是一种优化策略,通过在损失函数中加入额外的项(正则项)来实现对模型的约束。

正则化方法主要有两种:L1正则化(Lasso)和L2正则化(Ridge)。这两种正则化方法都是在损失函数中添加一个与模型参数相关的惩罚项。

  1. L1正则化(Lasso):在损失函数中添加模型参数的绝对值之和。L1正则化有助于产生稀疏参数矩阵,即许多参数为零。这种稀疏性有助于特征选择,使得模型更加简单。

  2. L2正则化(Ridge):在损失函数中添加模型参数的平方和。L2正则化会使得模型参数值较小,但不至于完全为零。这有助于防止过拟合现象,使模型更加稳定。

在实际应用中,根据问题的不同,可以选择适当的正则化方法来优化模型的泛化能力。

Lasso正则化被称为L1正则化,是因为它在损失函数中引入了模型参数(权重)绝对值之和作为惩罚项。这种惩罚项的形式与L1范数(L1-norm)相对应。

L1范数是指一个向量中所有元素的绝对值之和。对于一个向量x = (x1, x2, ..., xn),它的L1范数可以表示为:

||x||1 = |x1| + |x2| + ... + |xn|

Ridge正则化被称为L2正则化,是因为它在损失函数中引入了模型参数(权重)平方和作为惩罚项。这种惩罚项的形式与L2范数(L2-norm)相对应。

L2范数是指一个向量中所有元素的平方和的平方根。对于一个向量x = (x1, x2, ..., xn),它的L2范数可以表示为:

||x||2 = √(x1² + x2² + ... + xn²)

弹性网正则化(Elastic Net Regularization)是一种结合了L1正则化(Lasso)和L2正则化(Ridge)的正则化方法。弹性网正则化在损失函数中同时引入了L1和L2惩罚项,这使得它既具有Lasso正则化的特点(产生稀疏解),又具有Ridge正则化的特点(处理多重共线性问题)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值