特征选择是机器学习中的一个重要步骤,涉及很多方法。而有些模型天生具有对特征重要性的解释,可以直接用来实现特征选择。
本篇将要介绍使用 Lasso 回归这类模型来进行特征选择。Lasso 方法通过引入惩罚项,可以将特征的系数进行压缩甚至降为
,从而达到特征选择的目的。
1
线性回归
当我们碰到回归问题时,一般来说线性回归始终是首选。线性回归模型将目标变量建模为输入特征的线性组合,
其中,系数
待求,往往是通过最小化某些代价函数而来的。
例如,线性模型可以通过估计最小化如下均方误差代价函数求得系数。
其中,
为 ,最小化该代价函数很容易求得解,即系数
。
不过,线性模型难以特征之间的,对噪声或者异常值也较为敏感。我们可以通过增加对系数的惩罚项来改善这些问题。
.
Ridge 线性回归
.
Ridge 线性回归背后的思路是降低系数的值以减弱相关特征的作用。如果
是
,就回到上面的线性回归。Ridge 线性回归通过引入
惩罚项来修改代价函数,
其中,
是特征
的系数。也可以写成向量的形式,
由于我们只有一个
参数,因此一般需要预先对特征进行规范化。
.
Lasso 线性回归
.
实际上,Ridge 回归中的
惩罚项往往并没有带来系数的稀疏性(很多系数为
)。于是,我们修改一下惩罚项,使用
惩罚项,因此代价函数变为,
这就是 Lasso 回归,它的向量形式为
上式第二项称为
惩罚,而
是一个超参数,用于调整该惩罚项的强度。一个特征的系数越高,代价函数的值就越高。因此,Lasso 回归的想法是通过减少系数的绝对值来优化代价函数。
具体实施中,需要对特征进行规范化处理,并使用交叉验证方法找到
超参数值。
2
Lasso 用于特征选择
为了最小化代价函数,Lasso 回归会自动选择那些有用的特征,而丢弃无用或冗余的特征。在 Lasso 回归中,丢弃一个特征相当于让该特征对应的系数等于
。
因此,使用 Lasso 回归进行特征选择的想法非常简单:首先对数据作规范化处理,再进行 Lasso 回归,然后只保留那些系数不为
的那些特征。
但是,还有一个事情非常重要,那就是需要设定超参数
的值,以获得正确的 Lasso 回归。
让我们看看如何在 Python 中做到使用 Lasso 回归来自动选择特征。
3
例子演示
在此示例中,我将展示如何使用 Lasso 在 Python 中使用糖尿病数据集进行特征选择。
首先,让我们导入一些库,
然后,导入数据集和特征的名称。
将数据集拆分为训练集和测试集,并仅在训练集上执行所有计算。
由于我们的数据集需要预先规范化,我们可以利用 scikit-learn 中强大的对象将和对象封装成一个管线。
然后是设置 Lasso 回归的
超参数。对于这个例子,我们将以
步长测试从
到
的几个值。
对于每个值,我们在
折交叉验证中计算均方误差的平均值,并选择最小化此类平均性能指标的
值。为此,我们可以使用 GridSearchCV 对象。
这里使用 ,因为网格搜索试图最大化性能指标,所以我们添加了一个减号来最小化均方误差。
参数
的最佳值是,
现在,我们查看 Lasso 回归的系数值,
一个特征的重要性是它的系数的绝对值,即
我们来看看重要性:
如我们所见,有 3 个特征的重要性为 0。这些特征已被我们的模型丢弃。
在 Lasso 回归中幸存下来的特征是:
而被丢弃的 3 个特征是:
通过这种方式,我们使用了适当优化的 Lasso 回归来根据给定的目标变量获取有关数据集最重要特征的信息。
另外,有兴趣也可以试试 Ridge 回归用来处理上述例子。
4
小结
特征选择方法众多,通过本篇可以快速了解这种既方便又有效的正则化方法。
Lasso 回归具有非常强大的内置特征选择功能,可以在多种情况下使用。但是,它也有一些缺点。例如,如果特征和目标变量之间的关系不是线性的,那么使用线性模型可能并不是一个好主意。此时,适当的探索性数据分析可以帮助我们更好地理解特征和目标之间最重要的关系,从而使我们选择最好的模型。
三连在看,月入百万
领取专属 10元无门槛券
私享最新 技术干货