scikit-learn中的Lasson回归和Elastic Net回归

原理:
我们知道岭回归是使用二范数(平方项)来对代价函数进行有偏分析。Lasson回归则是使用一范数(绝对值项)对代价函数进行有偏分析。而Elastic net是将二者结合,即使用平方项又使用绝对值项。

用法:
>>> from sklearn import linear_model
>>> reg = linear_model.Lasso(alpha = 0.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
>>> reg.predict([[1, 1]])
array([ 0.8])

源码分析:
在scikit-learn中,class Lasso 继承自class ElasticNet,ElasticNet继承于LinearModel和RegressorMixin,而 fit 方法实现于ElasticNet下。可以看出在scikit中,lasso和elastic net是共用了代码。
代码实现了如下代价公式:
1 / (2 * n_samples) * ||y - Xw||^2_2
+ alpha * l1_ratio * ||w||_1
+ 0.5 * alpha * (1 - l1_ratio) * ||w||^2_2
如果说是lasso调用时,则l1_ratio=1.
PS:其实让l1_ratio=0就是岭回归,为什么岭回归要单独实现一套。。。
fit方法里面调用了enet_path方法:
def enet_path(X, y, l1_ratio=0.5, eps=1e-3, n_alphas=100, alphas=None,
              precompute='auto', Xy=None, copy_X=True, coef_init=None,
              verbose=False, return_n_iter=False, positive=False,
              check_input=True, **params):
......
for i, alpha in enumerate(alphas):
        l1_reg = alpha * l1_ratio * n_samples
        l2_reg = alpha * (1.0 - l1_ratio) * n_samples
        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)
......
可以看出enet_path方法下调用了cd_fast模块下的sparse_enet_coordinate_descent方法。cd_fast是pyx格式,是使用cython写成的,以提高坐标下降的计算速度。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值