机器学习系列12:减少过拟合——降维(特征选择)

降维(特征选择)

对于不支持正则化的模型来说,我们可以通过降低数据的特征维度来减小模型复杂度,从而避免过拟合。

有两种降维方法:

  • 特征选择(feature selection):从原始特征集中选择一部分特征子集。

  • 特征抽取(feature extraction):从现有的特征集中抽取信息形成新的特征空间。

顺序特征选择是一种贪心算法,它通过自动选择与问题最相关的特征子集来提升计算效率,剔除不相关的特征或噪声数据来降低模型泛化误差(这对那些不支持正则化的算法来说非常有用)。最终将原始特征从 d 维降低到 k 维。

经典的特征选择算法是顺序反向选择(Sequential Backward Selection,SBS),它旨在通过牺牲一点点模型性能来降低原始数据集的特征维度。在某种程度上,SBS 可以提升过拟合模型的预测性能。

SBS 算法很简单:不断从原始的特征空间中移除特征,直到剩余的特征数达到既定的阈值。

我们需要定义一个判别函数来确定每次移除哪个特征。比如我们可以以移除某个特征之前和之后模型的性能差异作为判别指标。

在 scikit-learn 中实现了两种顺序特征选择算法:顺序反向选择(Sequential Backward Selection,SBS)和顺序前向选择(Sequential Forward Selection,SFS)。

SFS是一种从底向上的方法,第一个特征选择单独最优的特征,第二个特征从其余所有特征中选择与第一个特征组合在一起后表现最优的特征,后面的每一个特征都选择与已经入选的特征组合最优的特征。

scikit-learn 默认使用的是 SFS,所以我们需要指定方向参数为 direction='forward'。

图片

我从 1 开始依次选择红酒数据集的全部 13 个特征,从下图可以看到当特征数量增加到 3 个之后,再增加特征数量模型在训练集上就不会再有明细的性能提升了。

图片

我们可以看是哪 3 个特征能产生这么好的贡献。

图片

通过以下结果可以看到,模型在测试集上仅仅损失了一点点性能。

图片

在实际工作中我们可以牺牲一点点泛化能力来节约大量的计算资源。

L1、L2正则化

如果我们注意到模型在训练集上的表现明显优于模型在测试集上的表现,那么这就是模型过拟合了,也称为 high variance。

产生的过拟合的原因是对于给定的训练集数据来说,模型太复杂了。有几种可以减少过拟合的方法:

  • 收集更多的训练数据(通常可行性不大)

  • 通过正则化引入对模型复杂度的惩罚

  • 选择一个含有较少参数的简单模型

  • 减少数据的维度

假设模型的参数是向量 w,那么 L1 和 L2 正则化的定义如下。

图片

图片

L1 正则化通常会产生更稀疏的特征空间,大部分的特征对应的权重都是 0。

如果我们在处理高维且大多数特征都互不相关的数据集时,稀疏性就会十分有用,尤其是在训练数据集样本数比样本特征数还少时。此时 L1 正则化也可以被视为是一种特征选择工具,我们将在下一课学习特征选择。

我们在训练机器学习模型时的目标是使模型在训练集和测试集上的损失不断降低,损失是通过损失函数计算出来的。L1 正则化和 L2 正则化就是在损失函数后面再加上惩罚模型复杂度的因子,并且还附带一个取值在 [0.0, 1.0] 之前的参数 λ 控制惩罚力度。

图片

在 scikit-learn 库中,我们只需要指定 penalty='l1' 或 penalty='l2' 就可以选择使用 L1 还是 L2 正则化了。注意!solver 参数指定了优化算法,lbfgs 优化算法不支持 L1 正则化。

图片

我们用逻辑回归算法拟合了经过标准化的红酒数据集后发现,模型在训练集和测试集上的准确率都达到了 100%!

除此之外,你可能还注意到还有两个参数:

  • C 就是 λ 的倒数,默认值是 1.0

  • multi_class='ovr',这表示使用 one-versus-rest 方法将二分类模型应用到多分类

one-versus-rest(OVR)也称为 one-versus-all,是一种将二分类模型应用到多分类任务中的方法。以红酒数据集为例,这是数据集具有三种类别,那么就训练三个二分类器,每个二分类器都将其中一种类别作为正例,其他两种类别作为反例。最终预测时选择得分结果最高的分类器预测的正例对应的类别作为最终的预测类别。

我们可以看到有 3 个权重和对应的偏置(bias)。

图片

我们也能看到有几个特征对应的权重值为 0,所以 L1 正则化也能用作特征选择。我们可以增大正则化项系数 λ(减小参数 C)时会剔除更多的特征,当 C < 0.01(λ > 100)时,所有特征对应的权重都是 0。

图片

数据预处理——特征缩放

这里我们要换使用 UCI 上面的红酒数据集了。下载地址:

https://archive.ics.uci.edu/dataset/109/wine

这个数据集含有三种不同的红酒,共 178 个样本,每个样本由 13 个不同化学属性。

我们首先将数据集分层采样划分 70% 出来作为训练集,剩余 30% 用作测试集。

特征缩放(feature scaling)是数据预处理步骤中及其容易被忽略的一步。除了决策树和随机森林这两种不需要进行特征缩放的算法之外。绝大多数机器学习算法及优化算法(比如梯度下降)都期望特征取值在同样的范围。

为什么要特征缩放,考虑一下 kNN 算法,如果我们有两个特征,特征 A 的取值范围在 [1,10],特征 B 的取值范围在 [1, 100000]。那么在计算欧式距离时,特征 A 的贡献几乎被特征 B 给覆盖了。

目前有归一化(normalization)和标准化(standardization)两种方法将数据集的所有特征缩放到同一个范围内。

归一化


归一化是最小最大缩放(min-max scaling)的一种特殊形式,它将特征的取值范围缩放到 [0,1]。

我们在每个特征列上执行下面的操作就可以实现最小最大缩放。

通过 scikit-learn 提供的 MinMaxScaler 实现最小最大缩放。

我们用训练集拟合(fit)了每个特征的列的最大值最小值,然后在训练集上执行最小最大缩放转换(transform),不过我们用一个 fit_transform 函数同时做了这两步。

然后根据训练集上每列的最大值最小值,我们对测试集进行转换(transform)。

标准化
尽管通过最小最大缩放实现的归一化在我们需要特征列中取值在一个限定范围时很常用。

但是对于许多机器学习算法而言,标准化更具有实际意义,尤其是像梯度下降这样的优化算法。

标准化使得我们将特征列的取值缩放成均值为 0 和标准差为 1,这样就和正态分布具有同样的参数了(0 均值、单位方差)。通过标准化,模型学习参数就更加简单,因为像逻辑回归和 SVM 算法都是将模型参数初始化成 0 或者其他很小的随机值。

但是标准化不会改变数据分布的形状,也不会将非正态分布的数据转成正态分布。

相对于最小最大缩放来说,标准化之后,算法对异常值不那么不敏感。

标准化的公式如下。

不用担心,scikit-learn 也提供了 StandardScaler 实现标准化。

同样地,我们用训练集拟合得到每个特征列的均值和标准差,然后再去转换训练集和测试集数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值