LASSO
LASSO即L1正则线性回归:
倾向于将部分参数收缩为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为(样本数,任务数)的矩阵,每一列代表一种回归的输出,从而得到多个回归器。我们的优化目标也发生了一些变化:
其中 Fro 为弗罗贝尼乌斯范数= ∑ij∥aij∥−−−−−−−−√22 , ∥A∥21=∑i∑j∥aij∥22−−−−−−−−√
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
同样的,修改我们的优化目标:
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算法,他是用来求解满足一个约束条件的线性回归问题:
0范数即为非0的个数,上述优化问题也可写作:
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值