sklearn浅析(三)——Generalized Linear Models之二

LASSO

  LASSO即L1正则线性回归:

min12nsamplesXwY22+λw1

  倾向于将部分参数收缩为0

LASSO的使用
from sklearn.linear_model import LASSO
lr = LASSO()
LASSO类的定义
class Lasso(ElasticNet):
    def __init__(self, alpha=1.0, fit_intercept=True, normalize=False,
                 precompute=False, copy_X=True, max_iter=1000,
                 tol=1e-4, warm_start=False, positive=False,
                 random_state=None, selection='cyclic'):
        super(Lasso, self).__init__(**args)

  它的初始化直接调用的弹性网络的初始化方法,两者的参数含义也相同。

LASSO类的fit函数和返回值

  我们发现lasso中并没有fit()函数,而是直接沿用的父类的fit()函数,所以求解方法同弹性网络,都是使用坐标下降法进行求解。当弹性网络的 α 初始化为1, ρ 初始化为1时,即是lasso。因此返回值也和弹性网络相同。

Multi-task Elastic Net

  当我们的多个分类器共享样本特征时,即称为Multi-task,也就是说我们的样本矩阵X相同,y为(样本数,任务数)的矩阵,每一列代表一种回归的输出,从而得到多个回归器。我们的优化目标也发生了一些变化:

min12nsamplesXwy2Fro+αρw21+α(1ρ)2w2Fro

  其中 Fro 为弗罗贝尼乌斯范数= ijaij22 A21=ijaij22

Multi-task Elastic Net的使用
from sklearn.linear_model import MultiTaskElasticNet
lr = MultiTaskElasticNet()
MultiTaskElasticNet类的定义
class MultiTaskElasticNet(Lasso):
    def __init__(self, alpha=1.0, l1_ratio=0.5, fit_intercept=True,
                 normalize=False, copy_X=True, max_iter=1000, tol=1e-4,
                 warm_start=False, random_state=None, selection='cyclic'):
                 ...

  多任务弹性网络并没有直接继承弹性网络,而是继承了Lasso,初始化方式同弹性网络。

MultiTaskElasticNet类的fit方法
def fit(self, X, y):
    类型检查
    if hasattr(self, 'l1_ratio'):
        model_str = 'ElasticNet'
    else:
        model_str = 'Lasso'
MultiTaskElasticNet的返回值

  同弹性网络

Multi-task Lasso

  同样的,修改我们的优化目标:

min12nsamplesXwy2Fro+αw21

Multi-task Lasso的使用
from sklearn.linear_model import MultiTaskLasso
lr = MultiTaskLasso()
MultiTaskLasso类的定义
class MultiTaskLasso(MultiTaskElasticNet):
    def __init__(self, alpha=1.0,  fit_intercept=True,
                 normalize=False, copy_X=True, max_iter=1000, tol=1e-4,
                 warm_start=False, random_state=None, selection='cyclic'):
                 ...

  多任务的LASSO继承自多任务弹性网络,只不过初始化参数没有l1_ratio。

MultiTaskLasso类的fit函数和返回值

  同弹性网络,其实仅仅通过多任务弹性网络就可以实现LASSO(通过设置l1_ration=1)。

Least Angle Regression

  最小角回归是一种优化问题的求解策略,类似于前向选择算法, 只不过它每次在进行优化方向选择时,保证当前的前进方向能平分与其他特征的夹角,也即确定了每一步前进的方向和步长。它可以用来求解LR,LASSO和Ridge回归问题。

关于最小角回归,详见:最小角回归LARS

Lars的使用
from sklearn.linear_model import Lars
lr = Lars()
Lars类的定义
class Lars(LinearModel, RegressorMixin):
    def __init__(self, fit_intercept=True, verbose=False, normalize=True,
                 precompute='auto', n_nonzero_coefs=500,
                 eps=np.finfo(np.float).eps, copy_X=True, fit_path=True,
                 positive=False):
                 ...
                 self.method = 'lasso'
  • eps:求解Cholesky diagonal的正则化项,在病态系统中,可以增大eps来缓解病态问题,不同于tol,它并不能控制迭代终止的阈值

  其余的参数在之前都介绍过,意义相同。

Lars类的fit方法
def fit(self, X, y, Xy=None):
    类型检查和与计算(Gram矩阵)
     for k in xrange(n_targets):
                this_Xy = None if Xy is None else Xy[:, k]
                alphas, active, coef_path, n_iter_ = lars_path(
                    X, y[:, k], Gram=Gram, Xy=this_Xy, copy_X=self.copy_X,
                    copy_Gram=True, alpha_min=alpha, method=self.method,
                    verbose=max(0, self.verbose - 1), max_iter=max_iter,
                    eps=self.eps, return_path=True,
                    return_n_iter=True, positive=self.positive)

def lars_path(X, y, Xy=None, Gram=None, max_iter=500,
              alpha_min=0, method='lar', copy_X=True,
              eps=np.finfo(np.float).eps,
              copy_Gram=True, verbose=0, return_path=True,
              return_n_iter=False, positive=False):                                      

  fit()调用了一个全局方法lars_path,该方法有一个参数method,默认是lar,即用最小角回归求解线性回归问题,该参数还可以选择为lasso,此时则用lar求解Lasso(L1正则线性回归)问题,该值初始化为lar

fit()返回值:
  • self:Lars实例对象
lars_path()返回值:
  • alphas:每一轮迭代的最大协方差(绝对值)
  • active:迭代路径末的处于活动状态的参数索引(有些很小的参数不会被激活)
  • coefs:模型参数
  • n_iter:迭代次数
属性:
  • alphas_:同上
  • active_:同上
  • coef_:同上
  • coef_path_:每一轮迭代的参数
  • n_iter_:同上
  • intercept_:b值

LARS Lasso

  使用LARS求解lasso问题,不同于LARS使用坐标下降法求解,这里求得是一个精确解。

LARS Lasso的使用
from sklearn.linear_model import LassoLars
lr = LassoLars()
LassoLars类的定义
class LassoLars(Lars):
    def __init__(self, alpha=1.0, fit_intercept=True, verbose=False, normalize=True,
                 precompute='auto', n_nonzero_coefs=500,
                 eps=np.finfo(np.float).eps, copy_X=True, fit_path=True,
                 positive=False):
                 ...
                 self.method = 'lasso'

  LassoLars继承Lars,不同于Lars,它的method被初始化为lasso,并且多一个alpha参数

LassoLars的fit方法

  即Lars的fit()方法,同样调用的是lars_path方法,只不过method=lasso。

PS:Lars可以通过修改self.method=’lasso’实现LassoLars,但是官方没有给出接口,不建议这么做;LassoLars比Lars多出两个用于交叉验证的方法_check_copy_and_writeable和_lars_path_residues

Orthogonal Matching Pursuit

  基于MP算法,他是用来求解满足一个约束条件的线性回归问题:

minXwY22
s.t.w0<L

  0范数即为非0的个数,上述优化问题也可写作:
argminw0
s.t.minXwY22<tol

OMP的使用
from sklearn.linear_model import OrthogonalMatchingPursuit
lr = OrthogonalMatchingPursuit()
OrthogonalMatchingPursuit类的定义
class OrthogonalMatchingPursuit(LinearModel, RegressorMixin):
    def __init__(self, n_nonzero_coefs=None, tol=None, fit_intercept=True,
                 normalize=True, precompute='auto'):
                 ...
  • n_nonzero_coefs:int,模型参数非0的个数,如果为None则取特征数的10%
OrthogonalMatchingPursuit的fit方法
def fit(self, X, y):
    ...
    if Gram is False:
        调用orthogonal_mp
    else:
        调用orthogonal_mp_gram
    ...

  根据是否进行percompute调用不同的函数,前者使用cholesky分解法进行求解,后者使用预计算得到的Gram矩阵进行求解。

返回值:
  • coef_:模型参数
  • n_iter_:迭代次数
属性:
  • coef_:模型参数
  • n_iter_:迭代次数
  • intercept_:b值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值