scikit-learn 线性回归算法总结

线性回归在机器学习算法中算是一个比较简单基础的算法。线性回归的目的是要得到输出向量Y和输入特征X之间的线性关系,求出线性回归系数θ,也就是 Y=Xθ。其中Y的维度为mx1,X的维度为mxn,而θ的维度为nx1。m代表样本个数,n代表样本特征的维度。为了得到线性回归系数θ,我们需要定义一个损失函数,一个极小化损失函数的优化方法,以及一个验证算法的方法。损失函数的不同,损失函数的优化方法的不同,验证方法的不同,就形成了不同的线性回归算法。scikit-learn中的线性回归算法库可以从这这三点找出各自的不同点。理解了这些不同点,对不同的算法使用场景也就好理解了。

###1.LinearRegression

  • 损失函数:

LinearRegression类就是我们平时说的最常见普通的线性回归,它的损失函数也是最简单的,如下:

J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) J(\theta)=\frac12(\mathbf{X}\theta-\mathbf{Y})^T(\mathbf{X}\theta-\mathbf{Y}) J(θ)=21(XθY)T(XθY)

  • 损失函数的优化方法:

对于这个损失函数,一般有梯度下降法和最小二乘法两种极小化损失函数的优化方法,而scikit中的LinearRegression类用的是最小二乘法。通过最小二乘法,可以解出线性回归系数θ为: θ = ( X T X ) − 1 X T Y \theta=(\mathbf{X^TX})^{-1}\mathbf{X^TY} θ=(XTX)1XTY

  • 验证方法:

LinearRegression类并没有用到交叉验证之类的验证方法,需要我们自己把数据集分成训练集和测试集,然后训练优化。

  • 使用场景:

一般来说,只要我们觉得数据有线性关系,LinearRegression类是我们的首先。如果发现拟合或者预测的不好,再考虑用其他的线性回归库。如果是学习线性回归,推荐先从这个类开始第一步的研究。

scikit-learn Linear Regression Example

LinearRegression 参数介绍

2. Ridge

####损失函数:

由于第一节的LinearRegression没有考虑过拟合的问题,有可能泛化能力较差,这时损失函数可以加入正则化项,如果加入的是L2范数的正则化项,这就是Ridge回归。损失函数如下:

J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) + 1 2 α ∣ ∣ θ ∣ ∣ 2 2 J(\theta)=\frac12(\mathbf{X}\theta-\mathbf{Y})^T(\mathbf{X}\theta-\mathbf{Y})+\frac12\alpha||\theta||_2^2 J(θ)=21(XθY)T(XθY)+21α∣∣θ22

其中α为常数系数,需要进行调优。||θ||2为L2范数。Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使得模型相对而言比较的稳定,不至于过拟合。

####损失函数的优化方法:

对于这个损失函数,一般有梯度下降法和最小二乘法两种极小化损失函数的优化方法,而scikit中的Ridge类用的是最小二乘法。通过最小二乘法,可以解出线性回归系数θ为:

θ = ( X T X + α E ) − 1 X T Y \theta=(\mathbf{X^TX}+\alpha\mathbf{E})^{-1}\mathbf{X^TY} θ=(XTX+αE)1XTY

其中E为单位矩阵。

####验证方法:

Ridge类并没有用到交叉验证之类的验证方法,需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数α。然后训练优化。

####使用场景:
    一般来说,只要我们觉得数据有线性关系,用LinearRegression类拟合的不是特别好,需要正则化,可以考虑用Ridge类。但是这个类最大的缺点是每次我们要自己指定一个超参数α,然后自己评估α的好坏,比较麻烦,一般我都用下一节讲到的RidgeCV类来跑Ridge回归,不推荐直接用这个Ridge类,除非你只是为了学习Ridge回归。
sklearn.linear_model.Ridge 实例使用及参数介绍

3.RidgeCV

RidgeCV类的损失函数和损失函数的优化方法完全与Ridge类相同,区别在于验证方法。

####验证方法:

RidgeCV类对超参数α使用了交叉验证,来帮忙我们选择一个合适的α。在初始化RidgeCV类时候,我们可以传一组备选的α值,10个,100个都可以。RidgeCV类会帮我们选择一个合适的α。免去了我们自己去一轮轮筛选α的苦恼。

####使用场景:
    一般来说,只要我们觉得数据有线性关系,用LinearRegression类拟合的不是特别好,需要正则化,可以考虑用RidgeCV类。不是为了学习的话就不用Ridge类。为什么这里只是考虑用RidgeCV类呢?因为线性回归正则化有很多的变种,Ridge只是其中的一种。所以可能需要比选。如果输入特征的维度很高,而且是 稀疏线性关系的话,RidgeCV类就不合适了。这时应该主要考虑下面几节要讲到的Lasso回归类家族。

应用实例
>>> from sklearn import linear_model
>>> reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])
>>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])       
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None,
    normalize=False)
>>> reg.alpha_                                      
0.1

###4. Lasso
####损失函数:
    线性回归的L1正则化通常称为Lasso回归,它和Ridge回归的区别是在损失函数上增加了的是L1正则化的项,而不是L2正则化项。L1正则化的项也有一个常数系数α来调节损失函数的均方差项和正则化项的权重,具体Lasso回归的损失函数表达式如下:

J ( θ ) = 1 2 m ( X θ − Y ) T ( X θ − Y ) + α ∣ ∣ θ ∣ ∣ 1 J(\theta)=\frac1{2m}(\mathbf{X}\theta-\mathbf{Y})^T(\mathbf{X}\theta-\mathbf{Y})+\alpha||\theta||_1 J(θ)=2m1(XθY)T(XθY)+α∣∣θ1

其中n为样本个数,α为常数系数,需要进行调优。||θ||1为L1范数。

Lasso回归可以使得一些特征的系数变小,甚至还是一些绝对值较小的系数直接变为0。增强模型的泛化能力。

####损失函数的优化方法:

Lasso回归的损失函数优化方法常用的有两种,坐标轴下降法和最小角回归法。Lasso类采用的是坐标轴下降法,后面讲到的LassoLars类采用的是最小角回归法

####验证方法:

Lasso类并没有用到交叉验证之类的验证方法,和Ridge类类似。需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数α。然后训练优化。

####使用场景:

一般来说,对于高维的特征数据,尤其线性关系是稀疏的,我们会采用Lasso回归。或者是要在一堆特征里面找出主要的特征,那么Lasso回归更是首选了。但是Lasso类需要自己对α调优,所以不是Lasso回归的首选,一般用到的是下一节要讲的LassoCV类。

###5.LassoCV
LassoCV类的损失函数和损失函数的优化方法完全与Lasso类相同,区别在于验证方法。

####验证方法:
    LassoCV类对超参数α使用了交叉验证,来帮忙我们选择一个合适的α。在初始化LassoCV类时候,我们可以传一组备选的α值,10个,100个都可以。LassoCV类会帮我们选择一个合适的α。免去了我们自己去一轮轮筛选α的苦恼。

####使用场景:  
    LassoCV类是进行Lasso回归的首选。当我们面临在一堆高位特征中找出主要特征时,LassoCV类更是必选。当面对稀疏线性关系时,LassoCV也很好用。

9.ElacticNet

损失函数:

ElasticNet可以看做Lasso和Ridge的中庸化的产物。它也是对普通的线性回归做了正则化,但是它的损失函数既不全是L1的正则化,也不全是L2的正则化,而是用一个权重参数ρ来平衡L1和L2正则化的比重,形成了一个全新的损失函数如下:

J ( θ ) = 1 2 m ( X θ − Y ) T ( X θ − Y ) + α ρ ∣ ∣ θ ∣ ∣ 1 + α ( 1 − ρ ) 2 ∣ ∣ θ ∣ ∣ 2 2 J(\theta)=\frac{1}{2m}(\mathbf{X}\theta-\mathbf{Y})^T(\mathbf{X}\theta-\mathbf{Y})+\alpha\rho||\theta||_1+\frac{\alpha(1-\rho)}2||\theta||_2^2 J(θ)=2m1(XθY)T(XθY)+αρ∣∣θ1+2α(1ρ)∣∣θ22

其中α为正则化超参数,ρ为范数权重超参数。

####损失函数的优化方法:

ElasticNet回归的损失函数优化方法常用的有两种,坐标轴下降法和最小角回归法。ElasticNet类采用的是坐标轴下降法。

####验证方法:
    ElasticNet类并没有用到交叉验证之类的验证方法,和Lasso类类似。需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数α和ρ。然后训练优化。

####使用场景:
    ElasticNet类需要自己对α和ρ调优,所以不是ElasticNet回归的首选,一般用到的是下一节要讲的ElasticNetCV类。

###10.ElasticNetCV
ElasticNetCV类的损失函数和损失函数的优化方法完全与ElasticNet类相同,区别在于验证方法。

####验证方法:
    ElasticNetCV类对超参数α和 ρ使用了交叉验证,来帮忙我们选择合适的α和ρ。在初始化ElasticNetCV类时候,我们可以传一组备选的α值和ρ,10个,100个都可以。ElasticNetCV类会帮我们选择一个合适的α和ρ。免去了我们自己去一轮轮筛选α和ρ的苦恼。

####使用场景:
    ElasticNetCV类用在我们发现用Lasso回归太过(太多特征被稀疏为0),而用Ridge回归又正则化的不够(回归系数衰减的太慢)的时候。一般不推荐拿到数据就直接就上ElasticNetCV。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值