sklearn之线性回归算法类库介绍

转载自:http://blog.sina.com.cn/s/articlelist_1654066213_0_1.html
本文重点讲述scikit-learn线性回归算法类库的使用和参数调优。

线性回归的目标是要得到输出向量Y和输入特征X之间的线性关系,求出线性回归系数θ,也就是 Y=Xθ。其中Y的维度是mx1,X的维度是mxn,而θ的维度为nx1。其中m代表样本个数,n代表样本特征的维度。
为了得到线性回归系数θ,需要定义一个损失函数,一个极小化损失函数的优化方法,以及一个验证算法的方法。损失函数的不同,损失函数优化方法的不同和验证方法的不同,就形成了不同的线性回归算法。scikit-learn提供了比较多的线性回归算法类库,下面我们就一一来介绍它们。

1. 数据获取与预处理
这里我们使用UCI大学公开的机器学习数据来学习scikit-learn线性回归算法类库的用法。
这是一个循环发电场的数据集,共有9568个样本数据,每个数据有5列,分别是AT(温度),V(压力),AP(湿度),RH(压强)和PE(输出电力)。
我们的目标是找到一个线性关系,对应PE是样本输出,而AT/V/AP/RH是样本特征,机器学习的目的就是通过调节超参数α得到一个线性回归模型,即:PE = θ0 + θ1*AT + θ2*V + θ3*AP + θ4*RH,使得损失函数J(θ)最小,而需要学习的就是θ0、θ1、θ2、θ3、θ4这5个参数。
我们使用pandas库来读取数据集,代码如下所示:
—————————————————————————————————
import pandas as pd
# 读取数据集
data = pd.read_excel(“CCPP/Folds5x2_pp.xlsx”)
# 打印前五行数据
print “data.head()=\n”, data.head()
# 打印后五行数据
print “data.tail()=\n”, data.tail()
# 打印数据的维度信息
print data.shape
# 样本特征X
X = data[[‘AT’, ‘V’, ‘AP’, ‘RH’]]
# 样本输出Y
Y = data[[‘PE’]]
划分训练集和测试集,将数据集的70%划入训练集,30%划入测试集
from sklearn.model_selection import train_test_split
train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3, random_state=1)
—————————————————————————————————

2. LinearRegression
LinearRegression类就是我们平时所说的普通线性回归,它的损失函数如下所示:
scikit-learn(sklearn)线性回归算法类库介绍
对于这个损失函数,一般有梯度下降法和最小二乘法两种极小化损失函数的优化方法,而scikit-learn中的LinearRegression类使用的是最小二乘法。通过最小二乘法,可以解出线性回归系数θ为:scikit-learn(sklearn)线性回归算法类库介绍
验证方法:LinearRegression类并没有用到交叉验证之类的验证方法,需要我们自己把数据集分成训练集和测试集,然后进行训练优化。
使用场景:一般来说,只要我们觉得数据有线性关系,LinearRegression类就是我们的首选。如果发现拟合或者预测的不好,再考虑用其它线性回归类库。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
# 拟合训练集
linreg.fit(train_X, train_Y)
# 打印模型的系数
print linreg.intercept_
print linreg.coef_
# 其中的一组输出为
# [ 458.39877507]
# [[-1.97137593 -0.23772975  0.05834485 -0.15731748]]
# 线性模型 Y = theta0 + theta1 * x1 + theta2 * x2 + theta3 * x3 + theta4 * x4
# PE = 458.39877507 - 1.97137593 * AT - 0.23772975 * V + 0.05834485 * AP - 0.15731748 * RH

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = linreg.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))

# 可以通过交叉验证来持续优化模型, 下面采用的是10折交叉验证
from sklearn.model_selection import cross_val_predict
Y_pred = cross_val_predict(linreg, X, Y, cv=10)
print “10折交叉验证MSE:”, mean_squared_error(Y, Y_pred)
print “10折交叉验证RMSE:”, np.sqrt(mean_squared_error(Y, Y_pred))
—————————————————————————————————

3. Ridge
由于LinearRegression没有考虑过拟合的问题,有可能导致泛化能力较差,这时损失函数可以加入正则化项,如果加入的是L2范数的正则化项,就是Ridge回归的损失函数,如下所示:
scikit-learn(sklearn)线性回归算法类库介绍
其中α是常数系数,需要进行调优,scikit-learn(sklearn)线性回归算法类库介绍是L2范数。
Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使得模型相对而言比较稳定,不至于过拟合。
对于这个损失函数,一般有梯度下降法和最小二乘法两种极小化损失函数的优化方法,而scikit-learn中的Ridge类使用的是最小二乘法。通过最小二乘法,可以解出线性回归系数θ为:
scikit-learn(sklearn)线性回归算法类库介绍
其中E是单位矩阵。
验证方法:Ridge类并没有用到交叉验证之类的验证方法,需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数α,然后进行训练优化。
使用场景:一般来说,只要我们觉得数据有线性关系,并且使用LinearRegression类拟合的不是特别好,需要正则化时,可以考虑用Ridge类。但是这个类最大的缺点是每次我们要自己指定一个超参数α,然后自己评估α的好坏,比较麻烦,一般都会使用下面将会讲到的RidgeCV类来跑Ridge回归,不推荐直接用这个Ridge类,除非你只是为了学习Ridge回归。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import Ridge
# 在初始化Ridge类时, 指定超参数α, 默认值是1.0.
ridge = Ridge(alpha=1.0)
# 拟合训练集
ridge.fit(train_X, train_Y)
# 打印模型的系数
print ridge.intercept_
print ridge.coef_

# 其中的一组输出为
# [ 458.39070895]
# [[-1.97134533 -0.23774135  0.05835247 -0.15731236]]
# 线性模型 Y = theta0 + theta1 * x1 + theta2 * x2 + theta3 * x3 + theta4 * x4
# PE = 458.39070895 - 1.97134533 * AT - 0.23774135 * V + 0.05835247 * AP - 0.15731236 * RH

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = ridge.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

4. RidgeCV
RidgeCV类的损失函数和损失函数的优化方法与Ridge类完全相同,区别在于验证方法。
验证方法:RidgeCV类对超参数α使用了交叉验证,来帮助我们选择一个合适的α值。在初始化RidgeCV类时,我们可以提供一组备选的α值。RidgeCV类会帮我们选择一个合适的α值,免去了我们自己去一轮轮筛选α值的苦恼。
使用场景:一般来说,只要我们觉得数据有线性关系,并且使用LinearRegression类拟合的不是特别好,需要正则化时,可以考虑使用RidgeCV类。为什么这里只是考虑使用RidgeCV类呢?因为线性回归正则化有很多的变种,Ridge只是其中的一种。如果输入特征的维度很高,而且是稀疏线性关系的话,RidgeCV类就不合适了。这时应该主要考虑下面将会讲到的Lasso回归类家族。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import RidgeCV
# 在初始化RidgeCV类时, 提供一组备选的α值, RidgeCV类会帮我们选择一个合适的α值.
ridgecv = RidgeCV(alphas=[0.01, 0.1, 0.5, 1, 3, 5, 7, 10, 20, 100], cv=5)
# 拟合训练集
ridgecv.fit(train_X, train_Y)
# 打印最优的α值
print “最优的alpha值: “, ridgecv.alpha_
# 打印模型的系数
print ridgecv.intercept_
print ridgecv.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = ridgecv.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————
通过Ridge回归的损失函数表达式可以看出,α值越大,那么正则化项惩罚的就越厉害,得到回归系数θ就越小,最终趋近于0;而如果α值越小,即正则化项越小,那么回归系数θ就越来越接近于普通线性回归的系数。
我们使用一个例子来展示超参数α和回归系数θ之间的关系,本例参考了scikit-learn官网的例子,示例代码如下所示:
—————————————————————————————————
# 10x10的矩阵_X, 表示一组有10个样本, 每个样本有10个特征的数据.
_X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
# 10x1的向量_Y代表样本的输出.
_Y = np.ones(10)
# 超参数α的数目
n_alphas = 200
# 所有的超参数都在10的-10次方和10的-2次方之间
alphas = np.logspace(-10, -2, n_alphas)
_ridge = Ridge(fit_intercept=False)
coefs = []
# 遍历所有的超参数
for a in alphas:
    # 设置本次循环的超参数alpha
    _ridge.set_params(alpha=a)
    # 针对每一个超参数alpha做ridge回归
    _ridge.fit(_X, _Y)
    # 把每一个超参数alpha对应的theta存下来
    coefs.append(_ridge.coef_)
# 绘图, 以α为x轴, θ的10个维度为y轴
ax = plt.gca()
ax.plot(alphas, coefs)
# 将alpha的值取对数便于画图
ax.set_xscale(‘log’)
# 翻转x轴的大小方向, 让alpha从大到小显示
ax.set_xlim(ax.get_xlim()[::-1])
plt.xlabel(‘alpha’)
plt.ylabel(‘weights’)
plt.title(‘Ridge coefficients as a function of the regularization’)
plt.rc(‘font’, **{‘sans-serif’: ‘Arial’, ‘family’: ‘sans-serif’}) # 指定plt的显示字体
plt.axis(‘tight’)
plt.show()
—————————————————————————————————
得到的图如下所示:
scikit-learn(sklearn)线性回归算法类库介绍
从图上我们也可以看出,当α比较大,接近于10的-2次方时,θ的10个维度都趋于0;而当α比较小,接近于10的-10方时,θ的10个维度都趋于线性回归的回归系数。

5. Lasso
线性回归的L1正则化通常称为Lasso回归,它和Ridge回归的区别是在损失函数上增加的是L1正则化项,而不是L2正则化项。L1正则化项也有一个常数系数α来调节损失函数的均方差项和正则化项的权重,具体的Lasso回归的损失函数如下所示:
scikit-learn(sklearn)线性回归算法类库介绍
其中m是样本个数,α是常数系数,需要进行调优。scikit-learn(sklearn)线性回归算法类库介绍是L1范数。
Lasso回归可以使得一些特征的系数变小,甚至一些绝对值非常小的系数直接变为0,增强模型的泛化能力。
Lasso回归的损失函数的优化方法常用的有两种,分别是坐标轴下降法和最小角回归法。Lasso类采用的是坐标轴下降法,后面讲到的LassoLars类采用的是最小角回归法。
验证方法:Lasso类没有使用交叉验证之类的验证方法,和Ridge类类似,需要我们把数据集分成训练集和测试集,需要自己设置好超参数α,然后进行训练优化。
使用场景:一般来说,对于高维的特征数据,尤其是线性关系稀疏的数据,我们会采用Lasso回归;或者是要在一堆特征里面找出主要的特征,那么Lasso回归更是首选了。但是Lasso类需要自己对α调优,所以不是Lasso回归的首选,一般使用下面将会讲到的LassoCV类。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import Lasso
# 在初始化Lasso类时, 指定超参数α, 默认值是1.0.
lasso = Lasso(alpha=1.0)
# 拟合训练集
lasso.fit(train_X, train_Y)
# 打印模型的系数
print lasso.intercept_
print lasso.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = lasso.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

6. LassoCV
LassoCV类的损失函数和损失函数的优化方法与Lasso类完全相同,区别在于验证方法。
验证方法:LassoCV类对超参数α使用了交叉验证,来帮助我们选择一个合适的α值。在初始化LassoCV类时,可以传一组备选的α值。LassoCV类会帮助我们选择一个合适的α值。免去了我们自己去一轮轮筛选α的苦恼。
使用场景:LassoCV类是进行Lasso回归的首选。当我们面临在一堆高维特征中找出主要特征时,LassoCV类更是必选。当面对稀疏线性关系时,LassoCV也很好用。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import LassoCV
# 在初始化LassoCV类时, 提供一组备选的α值, LassoCV类会帮我们选择一个合适的α值.
lassocv = LassoCV(alphas=[0.01, 0.1, 0.5, 1, 3, 5, 7, 10, 20, 100], cv=5)
# 拟合训练集
lassocv.fit(train_X, train_Y.values.ravel())
# 打印最优的α值
print “最优的alpha值: “, lassocv.alpha_
# 打印模型的系数
print lassocv.intercept_
print lassocv.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = lassocv.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

7. LassoLars
LassoLars类的损失函数和验证方法与Lasso类相同,区别在于损失函数的优化方法。
Lasso回归的损失函数优化方法常用的有两种,分别是坐标轴下降法和最小角回归法。LassoLars类采用的是最小角回归法,前面讲的Lasso类采用的是坐标轴下降法。
使用场景:LassoLars类需要我们自己对α值进行调优,所以不是Lasso回归的首选,一般使用下面将会讲到的LassoLarsCV类。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import LassoLars
# 在初始化LassoLars类时, 指定超参数α, 默认值是1.0.
lassoLars = LassoLars(alpha=0.005)
# 拟合训练集
lassoLars.fit(train_X, train_Y)
# 打印模型的系数
print lassoLars.intercept_
print lassoLars.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = lassoLars.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

8. LassoLarsCV
LassoLarsCV类的损失函数和损失函数的优化方法与LassoLars类完全相同,区别在于验证方法。
验证方法:LassoLarsCV类对超参数α使用了交叉验证,来帮助我们选择一个合适的α值。在初始化LassoLarsCV类时,我们可以传一组备选的α值。LassoLarsCV类会帮我们选择一个合适的α值。免去了我们自己去一轮轮筛选α的苦恼。 
使用场景:LassoLarsCV类是进行Lasso回归的第二选择。第一选择是前面讲到的LassoCV类。那么LassoLarsCV类有没有适用的场景呢?换句话说,用最小角回归法什么时候比坐标轴下降法好呢?场景一:如果我们想探索超参数α更多的相关值的话,由于最小角回归可以看到回归路径,此时用LassoLarsCV比较好。场景二: 如果我们的样本数远小于样本特征数的话,用LassoLarsCV也比LassoCV好。其余场景最好用LassoCV。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import LassoLarsCV
lassoLarscv = LassoLarsCV(cv=5)
# 拟合训练集
lassoLarscv.fit(train_X, train_Y.values.ravel())
# 打印模型的系数
print lassoLarscv.intercept_
print lassoLarscv.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = lassoLarscv.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

9. LassoLarsIC
LassoLarsIC类的损失函数和损失函数的优化方法与LassoLarsCV类完全相同,区别在于验证方法。
验证方法:LassoLarsIC类对超参数α没有使用交叉验证,而是使用Akaike信息准则(AIC)和贝叶斯信息准则(BIC)。此时我们并不需要指定备选的α值,而是由LassoLarsIC类基于AIC和BIC自己选择。使用LassoLarsIC类我们可以一轮找到超参数α,而用K折交叉验证的话,我们需要K+1轮才能找到。相比之下LassoLarsIC类寻找α更快。
使用场景:从验证方法可以看出,验证α,LassoLarsIC比LassoLarsCV快很多。那么是不是LassoLarsIC类一定比LassoLarsCV类好呢? 不一定!由于使用了AIC和BIC准则,我们的数据必须满足一定的条件才能使用LassoLarsIC类。这样的准则需要对解的自由度做一个适当的估计。该估计是来自大样本(渐近结果),并假设该模型是正确的(即这些数据确实是由假设的模型产生的)。当待求解的问题的条件数很差的时候(比如特征个数大于样本数量的时候),这些准则就会有崩溃的风险。所以除非我们知道数据是来自一个模型确定的大样本,并且样本数量够大,我们才能用LassoLarsIC。而实际上我们得到的数据大部分都不能满足这个要求,实际应用中很少使用这个看上去很美的类。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import LassoLarsIC
lassoLarsIC = LassoLarsIC()
# lassoLarsIC = LassoLarsIC(criterion=’bic’)
# 拟合训练集
lassoLarsIC.fit(train_X, train_Y.values.ravel())
# 打印模型的系数
print lassoLarsIC.intercept_
print lassoLarsIC.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = lassoLarsIC.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

10. ElasticNet
ElasticNet可以看做是Lasso和Ridge中庸化的产物。它也是对普通的线性回归做了正则化,但是它的损失函数既不全是L1正则化,也不全是L2正则化,而是用一个权重参数ρ来平衡L1和L2正则化的比重,形成了一个全新的损失函数,如下所示:  
scikit-learn(sklearn)线性回归算法类库介绍
其中α为正则化超参数,ρ为范数权重超参数。
ElasticNet回归的损失函数优化方法常用的有两种,分别是坐标轴下降法和最小角回归法。ElasticNet类采用的是坐标轴下降法。
验证方法:ElasticNet类并没有用到交叉验证之类的验证方法,和Lasso类类似,需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数α和ρ,然后进行训练优化。
使用场景:ElasticNet类需要自己对α和ρ调优,所以不是ElasticNet回归的首选,一般使用下面将会讲的ElasticNetCV类。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import ElasticNet
# 在初始化ElasticNet类时, 指定超参数α和ρ, 默认值分别是1.0和0.5.
elasticNet = ElasticNet(alpha=1.0, l1_ratio=0.5)
# 拟合训练集
elasticNet.fit(train_X, train_Y)
# 打印模型的系数
print elasticNet.intercept_
print elasticNet.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = elasticNet.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

11. ElasticNetCV
ElasticNetCV类的损失函数和损失函数的优化方法与ElasticNet类完全相同,区别在于验证方法。
验证方法:ElasticNetCV类对超参数α和ρ使用了交叉验证,来帮助我们选择合适的α值和ρ值。在初始化ElasticNetCV类时,我们可以传一组备选的α值和ρ。ElasticNetCV类会帮我们选择一个合适的α值和ρ值。免去了我们自己去一轮轮筛选α值和ρ值的苦恼。
使用场景:ElasticNetCV类用在我们发现使用Lasso回归太过(太多特征被稀疏为0),而使用Ridge回归又正则化不够(回归系数衰减的太慢)的时候。一般不推荐拿到数据就直接使用ElasticNetCV类。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import ElasticNetCV
# 在初始化ElasticNetCV类时, 提供一组备选的α值, ElasticNetCV类会帮我们选择一个合适的α值.
elasticNetCV = ElasticNetCV(l1_ratio=0.7, alphas=[0.01, 0.1, 0.5, 1, 3, 5, 7, 10, 20, 100], cv=5)
# 拟合训练集
elasticNetCV.fit(train_X, train_Y.values.ravel())
# 打印最优的α值
print “最优的alpha值: “, elasticNetCV.alpha_
# 打印模型的系数
print elasticNetCV.intercept_
print elasticNetCV.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = elasticNetCV.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

12. OrthogonalMatchingPursuit
OrthogonalMatchingPursuit(OMP)算法和普通线性回归算法的损失函数的区别是增加了一个限制项,来限制回归系数中非0元素的最大个数,形成了一个全新的损失函数,如下所示:
scikit-learn(sklearn)线性回归算法类库介绍,subject to scikit-learn(sklearn)线性回归算法类库介绍
其中scikit-learn(sklearn)线性回归算法类库介绍代表θ的L0范数,即非0回归系数的个数。
OrthogonalMatchingPursuit类使用前向选择算法来优化损失函数。它是最小角回归算法的缩水版。虽然精度不如最小角回归算法,但是运算速度很快。
验证方法:OrthogonalMatchingPursuit类并没有用到交叉验证之类的验证方法,和Lasso类类似,需要我们自己把数据集分成训练集和测试集,需要自己选择限制参数scikit-learn(sklearn)线性回归算法类库介绍,然后进行训练优化。
使用场景:OrthogonalMatchingPursuit类需要自己选择scikit-learn(sklearn)线性回归算法类库介绍,所以不是OrthogonalMatchingPursuit回归的首选,一般使用下面将会讲到的OrthogonalMatchingPursuitCV类,不过如果你已经定好了scikit-learn(sklearn)线性回归算法类库介绍的值,那么使用OrthogonalMatchingPursuit类比较方便。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import OrthogonalMatchingPursuit
# 在初始化OrthogonalMatchingPursuit类时, 指定参数n_nonzero_coefs, 默认值是None.
omp = OrthogonalMatchingPursuit(n_nonzero_coefs=3)
# 拟合训练集
omp.fit(train_X, train_Y)
# 打印模型的系数
print omp.intercept_
print omp.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = omp.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

13. OrthogonalMatchingPursuitCV
OrthogonalMatchingPursuitCV类的损失函数和损失函数的优化方法与OrthogonalMatchingPursuit类完全相同,区别在于验证方法。
验证方法:OrthogonalMatchingPursuitCV类使用了交叉验证,在S折交叉验证中以MSE最小为标准来选择最好的scikit-learn(sklearn)线性回归算法类库介绍
使用场景:OrthogonalMatchingPursuitCV类通常用在稀疏回归系数的特征选择上,这点和LassoCV类有类似的地方。不过由于它的损失函数优化方法是前向选择算法,精确度较低,一般情况不是特别推荐使用,而使用LassoCV就够了,除非你对稀疏回归系数的精确个数很在意,那可以考虑用OrthogonalMatchingPursuitCV类。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import OrthogonalMatchingPursuitCV
ompCV = OrthogonalMatchingPursuitCV(cv=5)
# 拟合训练集
ompCV.fit(train_X, train_Y.values.ravel())
# 打印最好的n_nonzero_coefs值
print “最好的n_nonzero_coefs值: “, ompCV.n_nonzero_coefs_
# 打印模型的系数
print ompCV.intercept_
print ompCV.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = ompCV.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

14. MultiTaskLasso
从14节到17节,类里面都带有’MultiTask’前缀,不过它不是编程里面的多线程,而是指多个线性回归模型共享样本特征,但是有不同的回归系数和特征输出。具体的线性回归模型是Y=XW,其中X是mxn维的矩阵,W是nxk维的矩阵,Y是mxk维的矩阵,m是样本个数,n是样本特征,而k就代表多个回归模型的个数。所谓的’MultiTask’这里其实就是指k个线性回归的模型一起去拟合。
损失函数:由于这里是多个线性回归一起拟合,所以损失函数和前面的都不一样:scikit-learn(sklearn)线性回归算法类库介绍
其中,scikit-learn(sklearn)线性回归算法类库介绍是Y=XW的Frobenius范数,而scikit-learn(sklearn)线性回归算法类库介绍代表W的各列的根平方和之和。

MultiTaskLasso类使用坐标轴下降法来优化损失函数。
验证方法:MultiTaskLasso类并没有用到交叉验证之类的验证方法,和Lasso类类似,需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数α,然后进行训练优化。
使用场景:MultiTaskLasso类需要自己对α调优,所以不是共享特征协同回归的首选,一般使用下面将会讲到的MultiTaskLassoCV类。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import MultiTaskLasso
# 在初始化MultiTaskLasso类时, 指定参数alpha, 默认值是1.0.
multiTaskLasso = MultiTaskLasso(alpha=1.0)
# 拟合训练集
multiTaskLasso.fit(train_X, train_Y)
# 打印模型的系数
print multiTaskLasso.intercept_
print multiTaskLasso.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = multiTaskLasso.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

15. MultiTaskLassoCV
MultiTaskLassoCV类的损失函数和损失函数的优化方法与MultiTaskLasso类完全相同,区别在于验证方法。
验证方法:MultiTaskLassoCV类对超参数α使用了交叉验证,来帮助我们选择一个合适的α值。在初始化MultiTaskLassoCV类时,我们可以传一组备选的α值。MultiTaskLassoCV类会帮我们选择一个合适的α值。
使用场景:MultiTaskLassoCV是多个回归模型需要一起共享样本特征一起拟合时的首选。它可以保证选到的特征每个模型都用到,不会出现某个模型选到了某个特征而另一个模型没选到这个特征的情况。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import MultiTaskLassoCV
# 在初始化MultiTaskLassoCV类时, 提供一组备选的α值, MultiTaskLassoCV类会帮我们选择一个合适的α值.
multiTaskLassoCV = MultiTaskLassoCV(alphas=[0.01, 0.1, 0.5, 1, 3, 5, 7, 10, 20, 100], cv=5)
# 拟合训练集
multiTaskLassoCV.fit(train_X, train_Y)
# 打印最优的α值
print “最优的alpha值: “, multiTaskLassoCV.alpha_
# 打印模型的系数
print multiTaskLassoCV.intercept_
print multiTaskLassoCV.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = multiTaskLassoCV.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

16. MultiTaskElasticNet
MultiTaskElasticNet类和MultiTaskLasso类的模型是相同的,不同的是损失函数。其损失函数如下所示:
scikit-learn(sklearn)线性回归算法类库介绍
其中, scikit-learn(sklearn)线性回归算法类库介绍是Y=XW的Frobenius范数,而 scikit-learn(sklearn)线性回归算法类库介绍代表W的各列的根平方和之和。
MultiTaskElasticNet类使用坐标轴下降法来优化损失函数。
验证方法:MultiTaskElasticNet类并没有用到交叉验证之类的验证方法,和Lasso类类似,需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数α和ρ,然后进行训练优化。 
使用场景:MultiTaskElasticNet类需要自己对α调优,所以不是共享特征协同回归的首选,如果需要用MultiTaskElasticNet,一般使用下面将会讲到的MultiTaskElasticNetCV类。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import MultiTaskElasticNet
# 在初始化MultiTaskElasticNet类时, 指定超参数α和ρ, 默认值分别是1.0和0.5.
multiTaskElasticNet = MultiTaskElasticNet(alpha=0.01, l1_ratio=0.7)
# 拟合训练集
multiTaskElasticNet.fit(train_X, train_Y)
# 打印模型的系数
print multiTaskElasticNet.intercept_
print multiTaskElasticNet.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = multiTaskElasticNet.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

17. MultiTaskElasticNetCV
MultiTaskElasticNetCV类的损失函数和损失函数的优化方法与MultiTaskElasticNet类完全相同,区别在于验证方法。
验证方法:MultiTaskElasticNetCV类对超参数α和ρ使用了交叉验证,来帮助我们选择合适的α值和ρ值。在初始化MultiTaskElasticNetCV类时,我们可以传一组备选的α值和ρ值。MultiTaskElasticNetCV类会帮我们选择一个合适的α值和ρ值。免去了我们自己去一轮轮筛选α值和ρ值的苦恼。
使用场景:MultiTaskElasticNetCV是多个回归模型需要一起共享样本特征一起拟合时的两个备选之一,首选是MultiTaskLassoCV。如果我们发现使用MultiTaskLassoCV时回归系数衰减得太快,那么就可以考虑使用MultiTaskElasticNetCV了。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import MultiTaskElasticNetCV
# 在初始化MultiTaskElasticNetCV类时, 提供一组备选的α值, MultiTaskElasticNetCV类会帮我们选择一个合适的α值.
multiTaskElasticNetCV = MultiTaskElasticNetCV(alphas=[0.01, 0.1, 0.5, 1, 3, 5, 7, 10, 20, 100], cv=5)
# 拟合训练集
multiTaskElasticNetCV.fit(train_X, train_Y)
# 打印最优的α值
print “最优的alpha值: “, multiTaskElasticNetCV.alpha_
# 打印模型的系数
print multiTaskElasticNetCV.intercept_
print multiTaskElasticNetCV.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = multiTaskElasticNetCV.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

18. BayesianRidge
第18和19节讲的都是贝叶斯回归模型。贝叶斯回归模型假设先验概率,似然函数和后验概率都是正态分布。先验概率是假设模型输出Y符合均值为Xθ的正态分布,正则化参数α被看作是一个需要从数据中估计得到的随机变量。回归系数θ的先验分布规律为球形正态分布,超参数为λ。我们需要通过最大化边际似然函数来估计超参数α和λ向量,以及回归系数θ。
此处对损失函数即负的最大化边际似然函数不多讨论,不过其形式和Ridge回归的损失函数很像,所以也取名BayesianRidge。
使用场景:如果我们的数据有很多缺失或者矛盾的病态数据,可以考虑BayesianRidge类,它对病态数据鲁棒性很高,也不用交叉验证选择超参数。但是极大化似然函数的推断过程比较耗时,一般情况不推荐使用。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import BayesianRidge
bayesianRidge = BayesianRidge()
# 拟合训练集
bayesianRidge.fit(train_X, train_Y.values.ravel())
# 打印模型的系数
print bayesianRidge.intercept_
print bayesianRidge.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = bayesianRidge.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

19. ARDRegression
ARDRegression和BayesianRidge很像,唯一的区别在于对回归系数θ的先验分布假设。BayesianRidge假设θ的先验分布规律为球形正态分布,而ARDRegression丢掉了BayesianRidge中的球形高斯的假设,采用与坐标轴平行的椭圆形高斯分布。这样对应的超参数λ有n个维度,各不相同。而上面的BayesianRidge中球形分布的θ对应的λ只有一个。
ARDRegression也是通过最大化边际似然函数来估计超参数α和λ向量,以及回归系数θ。
使用场景:如果我们的数据有很多缺失或者矛盾的病态数据,可以考虑BayesianRidge类,如果发现拟合地不好,可以换ARDRegression试一试。因为ARDRegression对回归系数先验分布的假设没有BayesianRidge严格,某些时候会比BayesianRidge产生更好的后验结果。
具体的示例代码如下所示:
—————————————————————————————————
from sklearn.linear_model import ARDRegression
ardRegression = ARDRegression()
# 拟合训练集
ardRegression.fit(train_X, train_Y.values.ravel())
# 打印模型的系数
print ardRegression.intercept_
print ardRegression.coef_

# 对于线性回归模型, 一般使用均方误差(Mean Squared Error,MSE)或者
# 均方根误差(Root Mean Squared Error,RMSE)在测试集上的表现来评该价模型的好坏.
test_Y_pred = ardRegression.predict(test_X)
print “测试集MSE:”, mean_squared_error(test_Y, test_Y_pred)
print “测试集RMSE:”, np.sqrt(mean_squared_error(test_Y, test_Y_pred))
—————————————————————————————————

猜你喜欢

转载自blog.csdn.net/zztingfeng/article/details/80590321