Lasso 的 python实现

本文介绍了如何使用坐标梯度下降法实现Lasso回归。通过分析sklearn库中的实现,发现其核心部分由C语言编写,因此作者决定自行编写Python代码。文中提到了相关论文和参考资料,并指出了实现过程中需要注意的点,包括损失函数的系数和截距项的处理。
摘要由CSDN通过智能技术生成

Lasso 的 python实现

由于最近一些任务需要在Lasso的基础上修改一些细节,需要重写Lasso的代码。而python的sklearn模块中, Lasso的坐标梯度下降是由c语言编写。于是自己重新写了一份代码,优化方法选择坐标梯度下降法。

代码在最下边。

sklearn中使用坐标梯度下降法求解

sklearn中的Lasso类的fit方法调用了sklearn.linear_model.coordinate_descent 的 enet_path方法。
而 enet_path 方法调用了 enet_coordinate_descent_multi_task 方法。
这个方法是由cpython所写,写在cd_fast.cp37-win_amd64.pyd中,具体内容看不见。
下边是代码片段:
enet_path方法片段:

if not multi_output and sparse.isspmatrix(X):
    model = cd_fast.sparse_enet_coordinate_descent(
        coef_, l1_reg, l2_reg, X.data, X.indices,
        X.indptr, y, X_sparse_scaling,
        max_iter, tol, rng, random, positive)
elif multi_output:
    model = cd_fast.enet_coordinate_descent_multi_task(
        coef_, l1_reg, l2_reg, X, y, max_iter, tol, rng, random)

cd_fast中的enet_coordinate_descent_multi_task方法:

def enet_coordinate_descent_multi_task(*args, **kwargs): # real signature unknown
    """
    Cython version of the coordinate descent algorithm
            for Elastic-Net mult-task regression
    
            We minimize
    
            (1/2) * norm(y - X w, 2)^2 + l1_reg ||w||_21 + (1/2) * l2_reg norm(w, 2)^2
    """
    pass

因此,考虑自己写一个代码。

使用坐标梯度下降法求解

论文:
Penalized Regressions: The Bridge versus the Lasso
论文地址:
http://www.gautampendse.com/software/lasso/webpage/Fu1998.pdf
参考文章:
https://blog.csdn.net/u012151283/article/details/77487729

代码

必须要说明,编写过程中的下标选取比较混乱。这可能会造成阅读上的障碍。但这似乎也没有啥好的办法。。。
比较麻烦的在于使用numpy的向量化处理减少了for循环的使用。
有以下几点需要注意:
1.sklearn中的损失函数如下:
在这里插入图片描述
注意二范数前的系数。不同的论文中系数不同,虽然是等价的,但是不确认的话,调参时会遇到麻烦。
2.sklearn中Lasso的截距项不在损失函数中的正则化部分中,所以在更新时需要单独拿出来处理。

代码如下

def coor_decent(X, y, w0, max_iter, alpha, max_e):
    w = w0
    nrows_w = X.shape[1
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值