目录

1,多重共线性问题(Ridge回归和Lasso回归)

1.1,什么是多重共线性

1.2,多重共线性和相关性

2,岭回归(Ridge)

2.1,岭回归解决多重共线性问题

2.2,linear_model.Ridge

2.3,选择最佳正则化参数取值

3,Lasso回归

3.1,Lasso回归与多重共线性

3.2,使用Lasso做特征选择

3.3,选取最佳的正则化参数取值


1,多重共线性问题(Ridge回归和Lasso回归)

1.1,什么是多重共线性

我们在对多元线性回归的损失函数求导,并得出求解系数的式子和过程,在最后一步中我们需要左乘的逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重共线性。

首先解释一下逆矩阵存在的充分必要条件:也就是矩阵的行列式不等于零,对于线性回归而言,即是说不能为0。这是使用最小二乘法来求解线性回归的核心条件之一。但是行列式不为零的充分必要条件是矩阵要满秩,求矩阵的秩我们一般使用行变换的方法,转换为阶梯型的矩阵,这些概念都是线性代数中的基础概念,我们在这里只是稍稍的回顾一下即可。 接下来我们来看三种情况,对下面三个矩阵进行变换:

如此就转换成了梯形矩阵。我们可以看到,矩阵A明显不是满秩的,它有全零行所以行列式会为0。而矩阵B和C没有全零行所以满秩。而矩阵A和矩阵B的区别在于,A中存在着完全具有线性关系的两行(1,1,2和2,2,4),而B和C中则没有这样的两行。而矩阵B虽然对角线上每个元素都不为0,但具有非常接近于0的元素0.02,而矩阵C的对角线上没有任何元素特别接近于0。

矩阵A中第一行和第三行的关系,被称为“精确相关关系”,即完全相关,一行可使另一行为0。在这种精确相关关系下,矩阵A的行列式为0,则矩阵A的逆不可能存在。在我们的最小二乘法中,如果矩阵中存在这种精确相关关系,则逆不存在,最小二乘法完全无法使用,线性回归会无法求出结果

矩阵B中第一行和第三行的关系不太一样,他们之间非常接近于”精确相关关系“,但又不是完全相关,一行不能使另一行为0,这种关系被称为”高度相关关系“。在这种高度相关关系下,矩阵的行列式不为0,但是一个非常接近0数,矩阵A的逆存在,不过接近于无限大。在这种情况下,最小二乘法可以使用,不过得到的逆会很大,直接影响我们对参数向量的求解:

这样求解出来的参数向量会很大,因此会影响建模的结果,造成模型有偏差或者不可用。精确相关关系和高度相关关系并称为"多重共线性"。在多重共线性下,模型无法建立,或者模型不可用。

相对的,矩阵C的行之间结果相互独立,梯形矩阵看起来非常正常,它的对角线上没有任何元素特别接近于0,因此其行列式也就不会接近0或者为0,因此矩阵C得出的参数向量就不会有太大偏差,对于我们拟合而言是比较理想的。

从上面的所有过程我们可以看得出来,一个矩阵如果要满秩,则要求矩阵中每个向量之间不能存在多重共线性,这也构成了线性回归算法对于特征矩阵的要求。

1.2,多重共线性和相关性

多重共线性如果存在,则线性回归就无法使用最小二乘法来进行求解,或者求解就会出现偏差。幸运的是,不能存在多重共线性,不代表不能存在相关性——机器学习不要求特征之间必须独立,必须不相关,只要不是高度相关或者精确相关就好。

在现实中特征之间完全独立的情况其实非常少,因为大部分数据统计手段或者收集者并不考虑统计学或者机器学习建模时的需求,现实数据多多少少都会存在一些相关性,极端情况下,甚至还可能出现收集的特征数量比样本数量多的情况。通常来说,这些相关性在机器学习中通常无伤大雅(在统计学中他们可能是比较严重的问题),即便有一些偏
差,只要最小二乘法能够求解,我们都有可能会无视掉它。毕竟,想要消除特征的相关性,无论使用怎样的手段,都无法避免进行特征选择,这意味着可用的信息变得更加少,对于机器学习来说,很有可能尽量排除相关性后,模型的整体效果会受到巨大的打击。这种情况下,我们选择不处理相关性。

然而多重共线性就不是这样一回事了,它的存在会造成模型极大地偏移,无法模拟数据的全貌,因此这是必须解决的问题。为了保留线性模型计算快速,理解容易的优点,我们并不希望更换成非线性模型,这促使统计学家和机器学习研究者们钻研出了多种能够处理多重共线性的方法,其中有三种比较常见的:

使用统计学的先验思路 使用向前逐步回归 改进线性回归
在开始建模之前先对数据进行各种相关性检验,如果存在多重共线性则可考虑
对数据的特征进行删减筛查,或者使用
降维算法对其进行处理,最终获得一个
完全不存在相关性的数据集
逐步回归能够筛选对标签解释力度最强的特征,同时对于存在相关性
的特征们加上⼀个惩罚项,削弱其对标签的贡献,以绕过最小二乘法
对共线性较为敏感的缺陷
在原有的线性回归算法基础上进行修改,使其能够容忍特征列存在多重共线性的情况,并且能够顺利建模,且尽可能的保证RSS取得最小值

这三种手段中,第一种相对耗时耗力,需要较多的人工操作,并且会需要混合各种统计学中的知识和检验来进行使用。在机器学习中,能够使用一种模型解决的问题,我们尽量不用多个模型来解决,如果能够追求结果,我们会尽量避免进行一系列检验。况且,统计学中的检验往往以“让特征独立”为目标,与机器学习中的”稍微有点相关性也无妨“不太一致。第二种手段在现实中应用较多,不过由于理论复杂,效果也不是非常高效,因此向前逐步回归不是机器学习的首选。接下来我们使用第三种方式,也就是我们即将要学习的Ridge回归和Lasso回归。

2,岭回归(Ridge)

2.1,岭回归解决多重共线性问题

在线性模型之中,除了线性回归之外,最知名的就是岭回归与Lasso了。两个算法不是为了提升模型表现,而是为了修复漏洞而设计的(实际上,我们使用岭回归或者Lasso,模型的效果往往会下降一些,因为我们删除了一小部分信息),因此在结果为上的机器学习领域颇有些被冷落的意味。这一节我们就来了解一下岭回归。

岭回归,又称为吉洪诺夫正则化(Tikhonov regularization)。通常来说,大部分的机器学习教材会使用代数的形式来展现岭回归的原理,这个原理和逻辑回归及支持向量机非常相似,都是将求解的过程转化为一个带条件的最优化问题,然后用最小二乘法求解。然而,岭回归可以做到的事其实可以用矩阵非常简单地表达出来。

岭回归在多元线性回归的损失函数上加上了正则项,表达为系数的L2范式(即系数的平方项)乘以正则化系数。岭回归的损失函数的完整表达式写作:

这个操作看起来简单,其实带来了巨大的变化。在线性回归中我们通过在损失函数上对求导来求解极值,在这里虽然加上了正则项,我们依然使用最小二乘法来求解。假设我们的特征矩阵结构为(m,n),系数的结构是(1,n),则可以有:

现在,只要存在逆矩阵,我们就可以求解出。一个矩阵存在逆矩阵的充分必要条件是这个矩阵的行列式不为0。通过添加正则项,我们可以人为的控制,来保证的逆矩阵存在,而此时我们的就可以写作:

如此,正则化系数就非常爽快地避免了”精确相关关系“带来的影响,至少最小二乘法在存在的情况下是一定可以使用了。对于存在”高度相关关系“的矩阵,我们也可以通过调大,来让矩阵的行列式变大,从而让逆矩阵变小,以此控制参数向量的偏移。当越大,模型越不容易受到共线性的影响。如此,多重共线性就被控制住了:最小二乘法一定有解,并且这个解可以通过来进行调节,以确保不会偏离太多。当然了, 挤占了中由原始的特征矩阵贡献的空间,因此如果太大,也会导致的估计出现较大的偏移,无法正确拟合数据的真实面貌。我们在使用中,需要找出让模型效果变好的最佳取值。

2.2,linear_model.Ridge

class sklearn.linear_model.Ridge (alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None,tol=0.001, solver=’auto’, random_state=None)

和线性回归相比,岭回归的参数稍微多了那么一点点,但是真正核心的参数就是我们的正则项的系数,其他的参数是当我们希望使用最小二乘法之外的求解方法求解岭回归的时候才需要的,通常我们完全不会去触碰这些参数。

在统计学中,我们会通过VIF或者各种检验来判断数据是否存在共线性,然而在机器学习中,我们可以使用模型来判断——如果一个数据集在岭回归中使用各种正则化参数取值下模型表现没有明显上升(比如出现持平或者下降),则说明数据没有多重共线性,顶多是特征之间有一些相关性。反之,如果一个数据集在岭回归的各种正则化参数取值下表现出明显的上升趋势,则说明数据存在多重共线性。

  • 接下来我们还是使用房屋数据集来验证是否存在多重共线性的问题
# 岭回归,消除多重共线性
import numpy as np
import pandas as pd
from sklearn.linear_model import Ridge, LinearRegression, Lasso
from sklearn.model_selection import train_test_split as TTS
from sklearn.datasets import fetch_california_housing as fch
import matplotlib.pyplot as plthousevalue = fch()X = pd.DataFrame(housevalue.data)y = housevalue.targetX.columns = ["住户收入中位数","房屋使用年代中位数","平均房间数目"
,"平均卧室数目","街区人口","平均入住率","街区的纬度","街区的经度"]Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420)
#数据集索引恢复
for i in [Xtrain,Xtest]:i.index = range(i.shape[0])# 实例化岭回归模型
# alpha代表我们的正则化项系数,现在我们设置系数为10
ridge=Ridge(alpha=10).fit(Xtrain,Ytrain)
ridge.score(Xtest,Ytest)
# 作出的预测比较低,所以可以猜测加利福尼亚房屋数据不是共线性问题# 在交叉验证下面,岭回归的表现如何
alpharange=range(1,1001,100)
lrscore=[]
ridgescore=[]
for i in alpharange:ridge=Ridge(alpha= i)reg=LinearRegression()score_l=cross_val_score(reg,X,y,cv=10,scoring='r2').mean()score_r=co=cross_val_score(ridge,X,y,cv=10,scoring="r2").mean()lrscore.append(score_l)ridgescore.append(score_r)
plt.figure(figsize=(20,8))
plt.plot(alpharange,lrscore,label="LinearRegression view")
plt.plot(alpharange,ridgescore,label="Ridge view")
plt.legend()
plt.show()

从绘制的图中可以看出,加利佛尼亚数据集上,岭回归的结果轻微上升,随后骤降。可以说,加利佛尼亚房屋价值数据集带有很轻微的一部分共线性,这种共线性被正则化参数消除后,模型的效果提升了一点点,但是对于整个模型而言是杯水车薪。在过了控制多重共线性的点后,模型的效果飞速下降,显然是正则化的程度太重,挤占了参数本来的估计空间。从这个结果可以看出,加利佛尼亚数据集的核心问题不在于多重共线性,岭回归不能够提升模型表现。

# 1-均值=偏差
# 偏差越大,均值越小
# r的平方就代表对模型的解释度,也就是r平方越小,代表偏差就越大
# 均值就代表我们的偏差,
# 泛化误差=偏差+方差+噪声# 在交叉验证下面,岭回归的方差表现如何
alpharange=range(1,1001,100)
lrscore=[]
ridgescore=[]
for i in alpharange:ridge=Ridge(alpha= i)reg=LinearRegression()score_l=cross_val_score(reg,X,y,cv=10,scoring='r2').var()score_r=co=cross_val_score(ridge,X,y,cv=10,scoring="r2").var()lrscore.append(score_l)ridgescore.append(score_r)
plt.figure(figsize=(20,8))
plt.plot(alpharange,lrscore,label="LinearRegression view")
plt.plot(alpharange,ridgescore,label="Ridge view")
plt.legend()
plt.show()

可以发现,模型的方差上升快速,不过方差的值本身很小,其变化不超过上升部分的1/3,因此只要噪声的状况维持恒定,模型的泛化误差可能还是一定程度上降低了的。虽然岭回归和Lasso不是设计来提升模型表现,而是专注于解决多重共线性问题的,但当在一定范围内变动的时候,消除多重共线性也许能够一定程度上提高模型的泛化能力。

2.3,选择最佳正则化参数取值

我们应该使用交叉验证来选择最佳的正则化系数。在sklearn中,我们有带交叉验证的岭回归可以使用,我们来看一看:

class sklearn.linear_model.RidgeCV (alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, scoring=None,cv=None, gcv_mode=None, store_cv_values=False)

可以看到,这个类于普通的岭回归类Ridge非常相似,不过在输入正则化系数的时候我们可以传入元祖作为正则化系数的备选,非常类似于我们在画学习曲线前设定的for i in 的列表对象。来看RidgeCV的重要参数,属性和接口:

重要参数 含义
alphas 需要测试的正则化参数的取值的元祖
scoring 用来进行交叉验证的模型评估指标,默认是,可自行调整
store_cv_values store_cv_values 是否保存每次交叉验证的结果,默认False
cv 交叉验证的模式,默认是None,表示默认进行留一交叉验证。
可以输入Kfold对象和StratifiedKFold对象来进行交叉验证
注意,仅仅当为None时,每次交叉验证的结果才可以被保存下来。
当cv有值存在(不是None)时,store_cv_values无法被设定为True
重要属性 含义
alpha_ 查看交叉验证选中的alpha
cv_values_ 调用所有交叉验证的结果,只有当store_cv_values=True的时候才能够调用,因此返回的结构是(n_samples, n_alphas)
重要接口 含义
score 调用Ridge类不进行交叉验证的情况下返回的R平方
  • 接下来使用加利福尼亚房屋数据来进行的选取。
import numpy as np
import pandas as pd
from sklearn.linear_model import RidgeCV, LinearRegression
from sklearn.model_selection import train_test_split as TTS
from sklearn.datasets import fetch_california_housing as fch
import matplotlib.pyplot as plthousevalue = fch()
X = pd.DataFrame(housevalue.data)
y = housevalue.targetX.columns = ["住户收入中位数","房屋使用年代中位数","平均房间数目"
,"平均卧室数目","街区人口","平均入住率","街区的纬度","街区的经度"]# 带交叉验证的岭回归
Ridge_ = RidgeCV(alphas=np.arange(1,1001,100)
,scoring="neg_mean_squared_error" # 默认使用的评估指标是r的平方,现在使用我们-的均方误差
,store_cv_values=True
#,cv=5 #cv使用的是默认值,所以可以保存交叉啊验证的值,并且可以查看,cv现在默认使用none,也就是留一交叉验证
).fit(X, y)#无关交叉验证的岭回归结果,score是一个接口,没有使用交叉验证的岭回归
Ridge_.score(X,y)#调用所有交叉验证的结果
Ridge_.cv_values_.shape
# 10代表10个数字下的交叉验证的结果
# 因为是留一交叉验证,所以有20640个结果,也就是每一次一个样本作为测试集,其余全部作为训练集,这样进行20640次测试#进行平均后可以查看每个正则化系数取值下的交叉验证结果
Ridge_.cv_values_.mean(axis=0)
# 使用负的均方误差评估,返回的是负值#查看被选择出来的最佳正则化系数
Ridge_.alpha_

3,Lasso回归

3.1,Lasso回归与多重共线性

除了岭回归之外,最常被人们提到还有模型Lasso。Lasso全称最小绝对收缩和选择算子(least absolute shrinkage and selection operator),由于这个名字过于复杂所以简称为Lasso。和岭回归一样,Lasso是被创造来作用于多重共线性问题的算法,不过Lasso使用的是系数的L1范式(L1范式则是系数的绝对值)乘以正则化系数,所以Lasso的损失函数表达式为:

我们来看看Lasso的数学过程。当我们使用最小二乘法来求解Lasso中的参数,我们依然对损失函数进行求导:

现在问题又回到了要求的逆必须存在。在岭回归中,我们通过正则化系数能够向方阵加上一个单位矩阵,以此来防止方阵的行列式为0,而现在L1范式所带的正则项在求导之后并不带有这个项,因此它无法对造成任何影响。也就是说,Lasso无法解决特征之间”精确相关“的问题。当我们使用最小二乘法求解线性回归时,如果线性回归无解或者报除零错误,换Lasso不能解决任何问题。岭回归可以解决特征间的精确相关关系导致的最小二乘法无法使用的问题,而Lasso不行。

在现实中我们其实会比较少遇到“精确相关”的多重共线性问题,大部分多重共线性问题应该是“高度相关“,而如果我们假设方阵的逆是一定存在的,那我们可以有:

通过增大,我们可以为的计算增加一个负项,从而限制参数估计中的大小,而防止多重共线性引起的参数被估计过大导致模型失准的问题。Lasso不是从根本上解决多重共线性问题,而是限制多重共线性带来的影响。何况,这还是在我们假设所有的系数都为正的情况下,假设系数无法为正,则很有可能我们需要将我们的正则项参数设定为负,因此可以取负数,并且负数越大,对共线性的限制也越大。

L1和L2正则化一个核心差异就是他们对系数的影响:两个正则化都会压缩系数的大小,对标签贡献更少的特征的系数会更小,也会更容易被压缩。不过,L2正则化只会将系数压缩到尽量接近0,但L1正则化主导稀疏性,因此会将系数压缩到0。这个性质,让Lasso成为了线性模型中的特征选择工具首选。

3.2,使用Lasso做特征选择

class sklearn.linear_model.Lasso (alpha=1.0, fit_intercept=True, normalize=False, precompute=False,copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection=’cyclic’)

sklearn中我们使用类Lasso来调用lasso回归,众多参数中我们需要比较在意的就是参数,正则化系数。另外需要注意的就是参数positive。当这个参数为"True"的时候,是我们要求Lasso回归出的系数必须为正数,以此来保证我们的一定以增大来控制正则化的程度。

需要注意的是,在sklearn中我们的Lasso使用的损失函数是:

其中只是作为系数存在,用来消除我们对损失函数求导后多出来的那个2的(求解时所带的1/2),然后对整体的RSS求了一个平均而已,无论时从损失函数的意义来看还是从Lasso的性质和功能来看,这个变化没有造成任何影响,只不过计算上会更加简便一些。

# Lasso回归案例
# lasso应用于特征选择
import numpy as np
import pandas as pd
from sklearn.linear_model import Ridge, LinearRegression, Lasso
from sklearn.model_selection import train_test_split as TTS
from sklearn.datasets import fetch_california_housing as fch
import matplotlib.pyplot as plthousevalue = fch()
X = pd.DataFrame(housevalue.data)
y = housevalue.target
X.columns = ["住户收入中位数","房屋使用年代中位数","平均房间数目"
,"平均卧室数目","街区人口","平均入住率","街区的纬度","街区的经度"]xtrain,xtest,ytrain,ytest=TTS(X,y,test_size=0.3,random_state=420)# 恢复索引
for i in [xtrain,xtest]:i.index=range(i.shape[0])# 先使用线性回归对数据进行拟合
lr=LinearRegression().fit(xtrain,ytrain)
(lr.coef_*100).tolist()# 使用岭回归进行拟合,alpha参数为0,标示没有进行任何的拟合
ridge=Ridge(alpha=0).fit(xtrain,ytrain)
(ridge.coef_*100).tolist()
# 使用线性回归和岭回归进行拟合得出的结果几乎一样# 使用lasso进行拟合,alpha=0标示没有进行任何的正则化
lasso=Lasso(alpha=0).fit(xtrain,ytrain)
(lasso.coef_*100).tolist()

上面在做拟合的过程中,线性回归和岭回归产生的结果基本相似,但是使用Lasso拟合时候结果发生警告:

  • 正则化系数为0,这样算法不可收敛!如果你想让正则化系数为0,请使用线性回归吧
  • 没有正则项的坐标下降法可能会导致意外的结果,不鼓励这样做!
  • 目标函数没有收敛,你也许想要增加迭代次数,使用一个非常小的alpha来拟合模型可能会造成精确度问题!

这是由于sklearn中的Lasso类不是使用最小二乘法来进行求解,而是使用坐标下降。Lasso既然不能够从根本解决多重共线性引起的最小二乘法无法使用的问题,那我们为什么要坚持最小二乘法呢?比如坐标下降就可以。有了坐标下降,就有迭代和收敛的问题,因此sklearn不推荐我们使用0这样的正则化系数。如果我们的确希望取到0,那我们可以使用一个比较很小的数,比如0.01。

# 使用lasso进行拟合
# alpha参数值为1
lasso=Lasso(alpha=1).fit(xtrain,ytrain)
(lasso.coef_*100).tolist()
# 现在增大alpha的数值,我们发现有些特征前面的系数已经被压缩到0,所以说lasso回归可以做特征选择
# 说明我们的lasso算法对alpha值更加的敏感# 使用岭回归进行拟合
# alpha参数值为10000,我们发现有些特征的系数已经被压缩的接近于0
ridge=Ridge(alpha=10**4).fit(xtrain,ytrain)
(ridge.coef_*100).tolist()# 使用lasso进行拟合
# alpha参数值为10000,我们发现所有的特征系数全部被压缩为0
lasso=Lasso(alpha=10**4).fit(xtrain,ytrain)
(lasso.coef_*100).tolist()#将系数进行绘图
plt.plot(range(1,9),(lr.coef_*100).tolist(),color="red",label="LR")
plt.plot(range(1,9),(ridge.coef_*100).tolist(),color="orange",label="Ridge")
plt.plot(range(1,9),(lasso.coef_*100).tolist(),color="k",label="Lasso")
plt.plot(range(1,9),[0]*8,color="grey",linestyle="--")
plt.xlabel('w') #横坐标是每一个特征所对应的系数
plt.legend()
plt.show()
# 岭回归会把特征的系数压缩的接近与0,而不会直接压缩为0,
# 但是lasso回归对alpha值更加敏感,他会把系数直接压缩为0
# 横坐标代表的是我们的8个特征的系数
# 所以,对于lasso,只要我们找到一个合适的alpha值,压缩某一些特征的系数为0,我们就可以删除系数为0的那些特征

可见,比起岭回归,Lasso所带的L1正则项对于系数的惩罚要重得多,并且它会将系数压缩至0,因此可以被用来做特征选择。也因此,我们往往让Lasso的正则化系数在很小的空间中变动,以此来寻找最佳的正则化系数。

3.3,选取最佳的正则化参数取值

class sklearn.linear_model.LassoCV (eps=0.001, n_alphas=100, alphas=None, fit_intercept=True,normalize=False, precompute=’auto’, max_iter=1000, tol=0.0001, copy_X=True, cv=’warn’, verbose=False,n_jobs=None, positive=False, random_state=None, selection=’cyclic’)

使用交叉验证的Lasso类的参数看起来与岭回归略有不同,这是由于Lasso对于alpha的取值更加敏感的性质决定的。之前提到过,由于Lasso对正则化系数的变动过于敏感,因此我们往往让在很小的空间中变动。这个小空间小到超乎人们的想象(不是0.01到0.02之间这样的空间,这个空间对lasso而言还是太大了),因此我们设定了一个重要概念“正则化路径”,用来设定正则化系数的变动

正则化路径:

假设我们的特征矩阵中有个特征,则我们就有特征向量。对于每一个的取值,我们都可以得出一组对应这个特征向量的参数向量,其中包含了n+1个参数,分别是。这些参数可以被看作是一个n+1维空间中的一个点(想想我们在主成分分析和奇异值分解中讲解的n维空间)。对于不同的取值,我们就将得到许多个在n+1维空间中的点,所有的这些点形成的序列,就被我们称之为是正则化路径。

我们把形成这个正则化路径的的最小值除以的最大值得到的量称为正则化路径的长度(length of the path)。在sklearn中,我们可以通过规定正则化路径的长度(即限制的最小值和最大值之间的比例),以及路径中的个数,来让sklearn为我们自动生成的取值,这就避免了我们需要自己生成非常非常小的的取值列表来让交叉验证类使用,类LassoCV自己就可以计算了。

和岭回归的交叉验证类相似,除了进行交叉验证之外,LassoCV也会单独建立模型。它会先找出最佳的正则化参数,然后在这个参数下按照模型评估指标进行建模。需要注意的是,LassoCV的模型评估指标选用的是均方误差,而岭回归的模型评估指标是可以自己设定的,并且默认是

参数 含义
eps 正则化路径的长度,默认0.001
n_alphas 正则化路径中的个数,默认100
alphas 需要测试的正则化参数的取值的元祖,默认None。当不输入的时候,自动使用eps和n_alphas来自动生成带入交叉验证的正则化参数
cv 交叉验证的次数,默认3折交叉验证,将在0.22版本中改为5折交叉验证
属性 含义
alpha_ 调用交叉验证选出来的最佳正则化参数
alphas_ 使用正则化路径的长度和路径中的个数来自动生成的,用来进行交叉验证的正则化参数
mse_path 返回所有交叉验证的结果细节
coef_ 调用最佳正则化参数下建立的模型的系数
# lasso交叉验证
# LassoCV这个类专门使用交叉验证来选择我们的正则化参数
from sklearn.linear_model import LassoCV
#自己建立Lasso进行alpha选择的范围
# logspace()函数标示在-10,到-2之间以10位底数生成200个数
alpharange = np.logspace(-10, -2, 200,base=10)
#其实是形成10为底的指数函数
#10**(-10)到10**(-2)次方alpharange
# 生成200个数据集lasso_ = LassoCV(alphas=alpharange #自行输入的alpha的取值范围
,cv=5 #交叉验证的折数
).fit(xtrain, ytrain)#查看被选择出来的最佳正则化系数
lasso_.alpha_#调用所有交叉验证的结果
lasso_.mse_path_.shape
# 一共200行5列,因为一共取出200个数,并且每一alpha取值进行5此交叉验证
# 返回每一个alpha取值下的5折交叉验证结果,一共有200个alpha值lasso_.mse_path_.mean(axis=1).shape #有注意到在岭回归中我们的轴向是axis=0吗?
# 返回每一个alpha交叉验证的均值,一共200个数
# 返回每一个alpha下,5折交叉验证下的结果
# 返回的结果是均方误差,但是岭回归可以改变评估指标,lassoCV只可以使用均方误差进行评估
# lassoCV不仅可以选择最佳alpha值,还会在最佳正则化系数下面进行建模,建模完成会为我们生成特征对应的系数结果#在岭回归当中,我们是留一验证,因此我们的交叉验证结果返回的是,每一个样本在每个alpha下的交叉验证结果
#因此我们要求每个alpha下的交叉验证均值,就是axis=0,跨行求均值
#而在这里,我们返回的是,每一个alpha取值下,每一折交叉验证的结果
#因此我们要求每个alpha下的交叉验证均值,就是axis=1,跨列求均值
#最佳正则化系数下获得的模型的系数结果
lasso_.coef_
# 选择最佳正则化系数的同时,进行建模,生成我们的特征系数
# 一共8个特征,所以有8个系数# 测试数据
lasso_.score(xtest,ytest)
# 返回的是r的平方#与线性回归相比如何?
reg = LinearRegression().fit(xtrain,ytrain)
reg.score(xtest,ytest)
# 带交叉验证的lasso回归略低于线性回归
#使用lassoCV自带的正则化路径长度和路径中的alpha个数来自动建立alpha选择的范围,不需要我们手工选取a数值
ls_ = LassoCV(eps=0.00001 #代表我们正则化路径的长度
,n_alphas=300 # 代表我们在正则化路径长度中选取多少个alpha值
,cv=5
).fit(xtrain, ytrain)# 调出我们选择的最佳参数
ls_.alpha_ls_.alphas_ #查看所有自动生成的alpha取值,因为是算法帮助我们生成的参数,所以在这里我们可以根据属性查看alpha值# 查看预测的准确度,返回的是r的平方
ls_.score(xtest,ytest)# 查看特征的系数
ls_.coef_ls_.intercept_
# 保存的是截距
# 我们选择的正则化路径越大,特征的系数被压缩到0的可能性就越大

这些方法下做的模型选择和模型计算,其实在模型效果上表现和普通的Lasso没有太大的区别,不过他们都在各个方面对原有的Lasso做了一些相应的改进(比如说提升了本来就已经很快的计算速度,增加了模型选择的维度,因为均方误差作为损失函数只考虑了偏差,不考虑方差的存在)。除了解决多重共线性这个核心问题之外,线性模型还有更重要的事情要做:提升模型表现(多项式回归)。这才是机器学习最核心的需求,而Lasso和岭回归不是为此而设计的。


参考资料:

[1] https://www.bilibili.com/video/BV1Bb411S73w

[2] https://www.cnblogs.com/pinard/p/6004041.html


使用sklearn库学习线性回归(二)相关推荐

  1. 使用sklearn库学习线性回归(一)

    目录 1,概述 1.1,判别式方法 1.2,线性回归介绍 1.3,sklearn中的线性回归 2,多元线性回归LinearRegression 2.1,多元线性回归的基本原理 2.2,最小二乘法求解多 ...

  2. HandsFree——OpenRE库学习(二)

    HandsFree--OpenRE库学习(二) Board类介绍 Board类对硬件进行抽象,封装了STM32F1和F4的底层配置函数,使得上层功能包的开发变得简洁. Board类的定义如下: cla ...

  3. sklearn 线性回归_使用sklearn库做线性回归拟合

    背景资料 随着海拔高度的上升,温度越来越低,经过气象专家的研究,在一定的海拔高度范围内,高度和温度呈线性关系.现有一组实测资料,我们需要对这些数据进行处理拟合,获得此线性关系. 解决思路 采用skle ...

  4. 【Python之pymysql库学习】二.游标cursor的相关知识(保姆级图文+实现代码)

    目录 读取的数据类型 读取的数据转为字典类型效果 读取的数据转为字典类型实现思路 读取的数据转为字典类型实现代码 关于游标的重置 总结 欢迎关注 『Python之pymysql库学习』 系列,持续更新 ...

  5. 使用Sklearn库学习数据预处理和特征工程

    目录 1,概述 1.1,数据预处理和特征工程 1.2,sklearn中的数据预处理和特征工程 2,数据预处理 Preprocessing & Impute 2.1,数据无量纲化 2.2,缺失值 ...

  6. 【Python-ML】SKlearn库多元线性回归性能评估

    # -*- coding: utf-8 -*- ''' Created on 2018年1月24日 @author: Jason.F @summary: 有监督回归学习-多元线性回归的性能评估 ''' ...

  7. stm32HALL库学习之二

    文章目录 stm32定时器 通过代码介绍中断 串口和定时器的中断回调函数 后记. stm32定时器 定时器的组成包括四部分:时钟选择单元,时基单元 ,输入捕获 ,输出比较. 一,时钟选择单元: 内部时 ...

  8. GIS开源库GEOS库学习教程(二):geos中的几何图形(Geometry)

    前言   上一节我们学过了GEOS库的介绍和环境编译及示例代码,在这一节我们将了解一下geos中的各种几何图形类,它们大部分都是从Geometry类派生的.而几何图形(Geometry)是geos里面 ...

  9. OpenCV的viz库学习(二)

    学习目标 这次学习中将学会下面三部分: 如何使用makeTransformToGlobal计算位姿 如何使用makeCameraPose和Viz3d :: setViewerPose 如何通过轴和视锥 ...

最新文章

  1. docker-compose 命令
  2. Spring Cloud Alibaba 2.2.6发布:新增Nacos注册快速失败的配置
  3. 图的遍历DFS与BFS(邻接表)
  4. 测试社交软件有哪些,性格测试:测你适合哪个社交平台
  5. 300 Longest Increasing Subsequence 最长上升子序列
  6. Python 函数详解
  7. Typescript 下 Mongoose 外键类型外键数组类型定义类型保护联合类型理解
  8. svm对未知数据的分类_SVM多分类之一对一与一对多
  9. 34个省域统计年鉴合集(32省更新至2020年)
  10. 免费开源Blazor在线Ico转换工具
  11. 软件测试工程师APUS一面二面汇总
  12. HDU3579 Hello Kiki(CRT非互质)
  13. 面经_京东广告部_实习_广告推荐_I面_20191105
  14. 类ChatGPT的部署与微调(上):从LLaMA、Alpaca/Vicuna/BELLE、中文版
  15. 夏黑葡萄水果发朋友圈的文案
  16. 国内外网站空间优劣势
  17. Sicily 1048. Inverso
  18. java迷你DVD管理器
  19. java图片处理类(图片水印,图片缩放)
  20. 如何从61850中获益

热门文章

  1. 【电脑的任务栏失灵怎么办?】
  2. android 软键盘的从属关系,Android控件属性大全
  3. 转载java基础总结大全(使用)
  4. vue3 require.context 实现基础组件的自动化全局注册 模块自动化加载(霸霸看了都说好)
  5. 苹果最新系统ios7_安卓微信7.0.16内测版 诚邀你参加内测!ios7.0.13正式版发布
  6. 矢量图斑局部狭长判断和定位局部狭长部分(PostGIS、Java、C#实现)
  7. 结婚的80后 VS 飘着的70后
  8. 鲁班学院-java架构师线上培训机构哪家好
  9. 古人航海怎么定位?带你领略古人的智慧
  10. 谷歌浏览器打开普通用户_Chrome浏览器的用户账户和密码如何导入其他浏览器