sklearn中的线性回归

sklearn中的线性回归

参考

  1. 菜菜的sklearn课堂09 - 线性回归和回归类模型的评估指标(非完整版)
  2. 课件

sklearn中的线性回归

  • 普通线性回归LinearRegression
类/函数 含义
linear_model.LinearRegression 使用普通最小二乘法的线性回归
  • 岭回归Ridge
类/函数 含义
linear_model.Ridge 岭回归,一种将L2作为正则化工具的线性最小二乘回归
linear_model.RidgeCV 带交叉验证的岭回归
linear_model.RidgeClassifier 岭回归的分类器
linear_model.RidgeClassifierCV 带交叉验证的岭回归的分类器
linear_model.ridge_regression 【函数】用正太方程法求解岭回归
  • LASSO
类/函数 含义
linear_model.Lasso Lasso,使用L1作为正则化工具来训练的线性回归模型
linear_model.LassoCV 带交叉验证和正则化迭代路径的Lasso
linear_model.LassoLars 使用最小角度回归求解的Lasso
linear_model.LassoLarsCV 带交叉验证的使用最小角度回归求解的Lasso
linear_model.LassoLarsIC 使用BIC或AIC进行模型选择的,使用最小角度回归求解的Lasso
linear_model.MultiTaskLasso 使用L1 / L2混合范数作为正则化工具训练的多标签Lasso
linear_model.MultiTaskLassoCV 使用L1 / L2混合范数作为正则化工具训练的,带交叉验证的多标签Lasso
linear_model.lasso_path 【函数】用坐标下降计算Lasso路径
  • 弹性网
类/函数 含义
linear_model.ElasticNet 弹性网,一种将L1和L2组合作为正则化工具的线性回归
linear_model.ElasticNetCV 带交叉验证和正则化迭代路径的弹性网
linear_model.MultiTaskElasticNet 多标签弹性网
linear_model.MultiTaskElasticNetCV 带交叉验证的多标签弹性网
linear_model.enet_path 【函数】用坐标下降法计算弹性网的路径
  • 最小角度回归
类/函数 含义
linear_model.Lars 最小角度回归(Least Angle Regression,LAR)
linear_model.LarsCV 带交叉验证的最小角度回归模型
linear_model.lars_path 【函数】使用LARS算法计算最小角度回归路径或Lasso的路径
  • 正交匹配追踪
类/函数 含义
linear_model.OrthogonalMatchingPursuit 正交匹配追踪模型(OMP)
linear_model.OrthogonalMatchingPursuitCV 交叉验证的正交匹配追踪模型(OMP)
linear_model.orthogonal_mp 【函数】正交匹配追踪(OMP)
linear_model.orthogonal_mp_gram 【函数】Gram正交匹配追踪(OMP)
  • 贝叶斯回归
类/函数 含义
linear_model.ARDRegression 贝叶斯ARD回归。ARD是自动相关性确定回归 (Automatic Relevance Determination Regression), 是一种类似于最小二乘的,用来计算参数向量的数学方 法。
linear_model.BayesianRidge 贝叶斯岭回归
  • 其他回归
类/函数 含义
linear_model.PassiveAggressiveClassifier 被动攻击性分类器
linear_model.PassiveAggressiveRegressor 被动攻击性回归
linear_model.Perceptron 感知机
linear_model.RANSACRegressor RANSAC(RANdom SAmple Consensus)算法。
linear_model.HuberRegressor 胡博回归,对异常值具有鲁棒性的一种线性回归模型
linear_model.SGDRegressor 通过最小化SGD的正则化损失函数来拟合线性模型
linear_model.TheilSenRegressor Theil-Sen估计器,一种鲁棒的多元回归模型

多元线性回归LinearRegression

虽然之前的吴恩达视频中已经有了关于单变量/多变量线性回归的简单讲解,不过在具体应用上使用的梯度下降法结合scipy.optimize中的优化器,但是尚不熟悉。这里为了了解sklearn,又重新作补充。

回归问题的经典案例是房价预测问题,这个预测函数可以表示成参数向量和特征的简单线性组合。本质则是通过损失函数的定义求得最佳参数向量。

简单的L2范数形式的损失函数:不带正则项
损失函数
我们往往称呼这个上式为SSE(Sum of Sqaured Error,误差平方和)或者RSS(Residual Sum of Squares 残差平方和)。在sklearn所有官方文档和网页上都称之为RSS残差平方和

关于参数的矩阵形式求导(算法工程师基本要求): https://en.wikipedia.org/wiki/Matrix_calculus

linear_model.LinearRegression

  • class sklearn.linear_model.LinearRegression (fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
  • 参数解释
参数 含义
fit_intercept 布尔值,可不填,默认为True 是否计算此模型的截距。如果设置为False,则不会计算截距。
normalize 布尔值,可不填,默认为False。当fit_intercept设置为False时,将忽略此参数。如果为True,则特征矩阵X在进入回 之前 将会被减去均值(中心化)并除以L2范式(缩放)。如果你希望进行标准化,请在fit数据 前使用preprocessing模块中的标准化专用类StandardScaler。
copy_X b布尔值,可不填,默认为True。如果为真,将在X.copy()上进行操作,否则的话原本的特征矩阵X可能被线性回归影响并覆盖。
n_jobs 整数或者None,可不填,默认为None 用于计算的作业数。只在多标签的回归和数据量足够大的时候才生效。除非None在joblib.parallel_backend上下文中,否则None统一表示为1。如果输入 -1,则表示使用全 部的CPU来进行计算。更多详细内容,请参阅词汇表:https://scikit-learn.org/stable/glossary.html#term-n-jobs

实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from sklearn.linear_model import LinearRegression as LR
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.datasets import fetch_california_housing as fch #加利福尼亚房屋价值数据集
import pandas as pd

housevalue = fch() #没有下载过需要下载

X=housevalue.data
y=housevalue.target
print(X.shape,y.shape)
print(housevalue.feature_names) # 输出所有特征名称
'''
(20640, 8) (20640,)
['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
'''

# 分训练集和测试集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)

# 建模
reg = LR().fit(Xtrain, Ytrain) # 实例化+ fit来训练模型
yhat = reg.predict(Xtest) # 接口

# 探索建好的模型-属性
print(reg.coef_) # 参数向量
# *zip(Xtrain.columns,reg.coef_) # *zip 表示将数据打包变成一组一组的形式,可以转化成列表用tolist,或者[*]
print([*zip(housevalue.feature_names,reg.coef_)]) # 这个含义是特征对应的参数
'''
[ 4.37358931e-01 1.02112683e-02 -1.07807216e-01 6.26433828e-01 5.21612535e-07 -3.34850965e-03 -4.13095938e-01 -4.26210954e-01]
[('MedInc', 0.4373589305968407), ('HouseAge', 0.01021126829449407), ('AveRooms', -0.10780721617317679), ('AveBedrms', 0.6264338275363791),
('Population', 5.216125353556256e-07), ('AveOccup', -0.003348509646333535), ('Latitude', -0.41309593789477095), ('Longitude', -0.42621095362084693)]
'''
属性 含义
coef_ 参数数组,形状为 (n_features, )或者(n_targets, n_features) 线性回归方程中估计出的系数。如果在fit中传递多个标签(当y为二维或以上的时候),则返回的系数是形状为(n_targets,n_features)的二维数组,而如果仅传递一个标签,则返回 的系数是长度为n_features的一维数组或说向量
intercept_ 数组,线性回归中的截距项

多元线性回归的模型评估指标

回归类算法的模型评估一直都是回归算法中的一个难点,但不像我们曾经讲过的无监督学习算法中的轮廓系数等等评估指标,回归类与分类型算法的模型评估其实是相似的法则——找真实标签和预测值的差异。只不过在分类型算法中,这个差异只有一种角度来评判,那就是是否预测到了正确的分类,而在我们的回归类算法中,我们有两种不同的角度来看待回归的效果:

  • 我们是否预测到了正确的数值。
  • 我们是否拟合到了足够的信息。

这两种角度,分别对应着不同的模型评估指标

是否预测了正确的数值

RSS残差平方和,它的本质是我们的预测值与真实值之间的差异,也就是从第一种角度来评估我们回归的效力,所以RSS既是我们的损失函数,也是我们回归类模型的模型评估指标之一。但是,RSS有着致命的缺点:它是一个无界的和,可以无限地大。我们希望这个RSS越小越好,但并没有一个概念究竟多小才好。

为了应对这种状况,sklearn中使用RSS的变体,均方误差MSE(mean squared error)来衡量我们的预测值和真实值的差异:
均方误差
均方误差,本质是在RSS的基础上除以了样本总量,得到了每个样本量上的平均误差
在sklearn当中,我们有两种方式调用这个评估指标,一种是使用sklearn专用的模型评估模块metrics里的类mean_squared_error,另一种是调用交叉验证的类cross_val_score并使用里面的scoring参数来设置使用均方误差。

1
2
3
4
5
6
7
8
9
from sklearn.metrics import mean_squared_error as MSE
print(MSE(yhat,Ytest),y.max(),y.min()) # 0.5309012639324554 5.00001 0.14999
# 发现平均误差可到0.5,然而实际数据最小值才0.14,这个误差50%就有点大了,这个模型可能就不太好

print(cross_val_score(reg,X,y,cv=10,scoring="neg_mean_squared_error")) # 返回每次交叉验证的均方误差
'''
[-0.48922052 -0.43335865 -0.8864377 -0.39091641 -0.7479731 -0.52980278
-0.28798456 -0.77326441 -0.64305557 -0.3275106 ]
'''

说明:

  1. sklearn中评估指标并没有mean_squared_error,而是neg_mean_squared_error
  2. 但是返回的10个交叉验证的误差为什么为负数?
    均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss)。在sklearn当中,所有的损失都使用负数表示,因此均方误差也被显示为负数了。真正的均方误差MSE的数值,其实就 是neg_mean_squared_error去掉负号的数字
  3. 类似均方误差MSE,还有一种绝对值误差MAE(Mean absolute error)
    其表达的概念与均方误差完全一致,不过在真实标签和预测值之间的差异外我们使用的是L1范式(绝对值)。现实使用中,MSE和MAE选一个来使用就好了。在sklearn当中,我们使用命令from sklearn.metrics importmean_absolute_error来调用MAE,同时,我们也可以使用交叉验证中的scoring = "neg_mean_absolute_error",以此在交叉验证时调用MAE。
    MAE
是否拟合了足够的信息

均方形式化的误差的一个缺陷是平均之后并无法反映到底正确拟合了多少数据信息。

为了衡量模型对数据上的信息量的捕捉,我们定义了R2可解释性方差分数(explained_variance_score,EVS)来帮助我们:

所以两者都衡量 1 - 我们的模型没有捕获到的信息量占真实标签中所带的信息量的比例,所以,两者都是越接近1越好。

  • R2:我们可以使用三种方式来调用,一种是直接从metrics中导入r2_score,输入预测值和真实值后打分。第二种是直接从线性回归LinearRegression的接口score来进行调用。第三种是在交叉验证中,输入”r2”来调用。

    1
    2
    3
    4
    from sklearn.metrics import r2_score
    print(r2_score(Ytest,yhat)) # 注意参数顺序,第一个参数需要是真实值
    r2 = reg.score(Xtest,Ytest)
    print(cross_val_score(reg,X,y,cv=10,scoring="r2").mean())
  • EVS有两种调用方法:可以从metrics中导入,也可以在交叉验证中输入”explained_variance“来调用

    1
    2
    3
    from sklearn.metrics import explained_variance_score as EVS
    print(EVS(Ytest,yhat))
    print(cross_val_score(reg,X,y,cv=10,scoring="explained_variance"))

注意:

  1. R2可能为负
  2. 当R2为负时说明模型对数据拟合非常糟糕,模型完全无法使用

补充:

  1. 解释平方和ESS(Explained Sum of Squares,也叫做SSR回归平方和)
  2. 总离差平方和TSS(Total Sum of Squares,也叫做SST总离差平方和)。
  3. 解释平方和ESS定义了我们的预测值和样本均值之间的差异,而总离差平方和定义了真实值和样本均值之间的差异,两个指标分别写作: