机器学习算法:线性回归

  线性回归是回归分析中的一种,评估的自变量 X X X和因变量 Y Y Y之间是一种线性关系。但自变量只有一个时,称为简单线性回归;当自变量有多个时,称为多元线性回归。

1.一般线性回归

  给定数据集 D = { ( x 1 , y i ) , ( x 2 , y 2 ) , … , ( x m , y m ) } D=\left\{(x_{1},y_{i}),(x_{2},y_{2}),\dots,(x_{m},y_{m}) \right\} D={(x1,yi),(x2,y2),,(xm,ym)},其中 x i = ( x i 1 ; x i 2 ; …   ; x i p ) x_{i}=(x_{i1};x_{i2};\dots;x_{ip}) xi=(xi1;xi2;;xip), y i ∈ R y_{i}\in R yiR。线性回归则试图找到一个通过属性的线性组合来进行预测的函数,即 f ( x ) = w 0 + w 1 x 1 + w 2 x 2 + ⋯ + w p x p + ϵ f(x)=w_{0}+w_{1}x_{1}+w_{2}x_{2}+\dots+w_{p}x_{p}+\epsilon f(x)=w0+w1x1+w2x2++wpxp+ϵ其中, y y y为因变量,是随机定量的观察值; x 1 , x 2 , … , x p \boldsymbol{x_{1}},\boldsymbol{x_{2}},\dots, \boldsymbol{x_{p}} x1,x2,,xp p p p个自变量; w 0 w_{0} w0为常数项, w 1 , w 2 , … , w p w_{1},w_{2},\dots,w_{p} w1,w2,,wp为偏回归系数。 w i ( i = 1 , 2 , … , p ) w_{i}(i=1,2,\dots,p) wi(i=1,2,,p)表示在其他自变量固定不变的情况下,自变量每改变一个单位时,其单独引起因变量 y y y的平均改变量。 ϵ \epsilon ϵ为随机误差,又称残差,它是 y y y的变化中不能用自变量解释的部分,服从 N ( 0 , σ 2 ) N(0,\sigma^{2}) N(0,σ2) 分布。
  多元线性回归模型参数求解常用最小二乘法(Ordinary Least Squares,简称OLS)。

2.正则化线性回归模型

  为了防止回归模型出现过拟合,通常是在损失函数后加上一个对参数的约束项,这个约束项即为正则化项。在线性回归模型中,通常有三种不同的正则化项:

  • Lasso回归:Lasso回归的正则化项为 L 1 L1 L1范数,即所有参数(不包括常数项)的绝对值之和。其完整的损失函数如下: J ( w ) = 1 2 m ∑ i = 1 m ( y i − w 0 − ∑ k = 1 p w i x i k ) ) 2 + λ ∑ k = 1 p ∥ w k ∥ J(w)=\frac{1}{2m}\sum_{i=1}^{m}(y_{i}-w_{0}-\sum_{k=1}^{p}w_{i}x_{ik}))^2+\lambda \sum_{k=1}^{p} \|w_{k}\| J(w)=2m1i=1m(yiw0k=1pwixik))2+λk=1pwk
    sklearn中提供的类如下:
    在这里插入图片描述
    alpha: L1正则化项的参数。
    fit_intercept:是否建立有截距的线性模型。
    normalize:只有当fit_intercept为True时此参数也能发挥作用。当其为True时,会对X进行正则化。
    precompute:是否使用Gram矩阵加速计算。
    max_inter: 最大迭代次数
    positive:当其为True时,所有参数均为正。
  • Ridge回归(岭回归):Ridge回归的正则化项为 L 2 L2 L2范数,即所有参数(不包括常数项)的平方和。其完整的损失函数公式如下: J ( w ) = 1 2 m ∑ i = 1 m ( y i − w 0 − ∑ k = 1 p w i x i k ) ) 2 + λ 2 ∑ k = 1 p w k 2 J(w)=\frac{1}{2m}\sum_{i=1}^{m}(y_{i}-w_{0}-\sum_{k=1}^{p}w_{i}x_{ik}))^2+\frac{\lambda}{2}\sum_{k=1}^{p}w_{k}^{2} J(w)=2m1i=1m(yiw0k=1pwixik))2+2λk=1pwk2
    sklearn中的类为:
    在这里插入图片描述Ridge()中的很多参数与Lasso()中的参数意义相同,solver为其新增参数:
    在这里插入图片描述
  • 弹性网络:弹性网络是结合了岭回归和Lasso回归,由两者加权平均所得。其完整的损失函数如下: J ( w ) = 1 2 m ∑ i = 1 m ( y i − w 0 − ∑ k = 1 p w i x i k ) ) 2 + 1 − λ 2 ∑ k = 1 p w k 2 + λ ∑ k = 1 p ∥ w k ∥ J(w)=\frac{1}{2m}\sum_{i=1}^{m}(y_{i}-w_{0}-\sum_{k=1}^{p}w_{i}x_{ik}))^2+\frac{1-\lambda}{2}\sum_{k=1}^{p}w_{k}^{2}+\lambda \sum_{k=1}^{p} \|w_{k}\| J(w)=2m1i=1m(yiw0k=1pwixik))2+21λk=1pwk2+λk=1pwk
    sklearn中的类:
    在这里插入图片描述
3.评估指标

  常见的回归模型评估指标有MAE(Mean Absolute Error,平均绝对值误差)、MSE(Mean Square Error, 平均平方误差)、RMSE(Root Mean Square Error,平均平方误差的平方根)。下面来看另外两个评估指标: R 2 R^{2} R2和调整后的 R 2 R^{2} R2
(1) R 2 R^{2} R2
R 2 = 1 − ∑ i = 1 m ( y i − y ^ i ) 2 ∑ i = 1 m ( y i − y ‾ ) 2 = 1 − S S E S S T R^{2}=1-\frac{\sum_{i=1}^{m}(y_{i}-\widehat y_{i})^{2}}{\sum_{i=1}^{m} (y_{i}-\overline y)^{2} } =1-\frac{SSE}{SST} R2=1i=1m(yiy)2i=1m(yiy i)2=1SSTSSE其中 y i y_{i} yi为样本真实值, y ^ i \widehat y_{i} y i为模型预测值, y ‾ = 1 m ∑ i = 1 m y i \overline y=\frac{1}{m}\sum_{i=1}^{m}y_{i} y=m1i=1myi
   R 2 R^{2} R2表示模型输入的各自变量在多大程度上可以解释目标变量的可变性, R 2 R^{2} R2的取值范围在 [ 0 , 1 ] [0,1] [0,1]之间, R 2 R^{2} R2越大,说明模型拟合越好。但当模型的自变量数逐渐增多时, R 2 R^{2} R2也随之逐步增大。所以需要对 R 2 R^{2} R2的计算公式进行调整。
原因:当样本量保持固定不变时, R 2 R^{2} R2公式中的 S S T SST SST固定不变。假设当样本自变量为 k k k个时,记其模型 S S E SSE SSE S S E k SSE_{k} SSEk。若在原 k k k个变量的基础上再增加一个新解释变量 x k + 1 x_{k+1} xk+1时,记其模型的 S S E SSE SSE S S E k + 1 SSE_{k+1} SSEk+1。根据OLS的思想, S S E k SSE_{k} SSEk可看作变量 x k + 1 x_{k+1} xk+1的参数 w k + 1 = 0 w_{k+1}=0 wk+1=0条件下的极小值。而 S S E k + 1 SSE_{k+1} SSEk+1为无条件下的极小值,所以 S S E k + 1 ≤ S S E k SSE_{k+1}\le SSE_{k} SSEk+1SSEk
(2) 调整后的 R 2 R^{2} R2
a d j − R 2 = 1 − ( 1 − R 2 ) ∗ ( m − 1 ) / ( m − p − 1 ) adj-R^{2}=1-(1-R^{2})*(m-1)/(m-p-1) adjR2=1(1R2)(m1)/(mp1)其中 p p p为模型变量个数。

4.案例
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score,mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import Lasso,Ridge,ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

boston=load_boston()
X,y=boston.data,boston.target
X=pd.DataFrame(X,columns=boston.feature_names)

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0,
                                               test_size=0.25)

lr=LinearRegression()
ridge=Ridge()
lasso=Lasso()
elasticnet=ElasticNet()

lr.fit(X_train,y_train)
y_pred_lr=lr.predict(X_test)
r2_lr=r2_score(y_test,y_pred_lr)
mse_lr=mean_squared_error(y_test, y_pred_lr)
print("多元线性回归:r2为{:.3f},MSE为{:.3f}".format(r2_lr,mse_lr))

ridge.fit(X_train,y_train)
y_pred_ridge=ridge.predict(X_test)
r2_ridge=r2_score(y_test,y_pred_ridge)
mse_ridge=mean_squared_error(y_test, y_pred_ridge)
print("岭回归:r2为{:.3f},MSE为{:.3f}".format(r2_ridge,mse_ridge))

lasso.fit(X_train,y_train)
y_pred_lasso=lasso.predict(X_test)
r2_lasso=r2_score(y_test,y_pred_lasso)
mse_lasso=mean_squared_error(y_test, y_pred_lasso)
print("Lasso回归:r2为{:.3f},MSE为{:.3f}".format(r2_lasso,mse_lasso))

elasticnet.fit(X_train,y_train)
y_pred_eln=lr.predict(X_test)
r2_eln=r2_score(y_test,y_pred_eln)
mse_eln=mean_squared_error(y_test,y_pred_eln)
print("弹性网络回归:r2为{:.3f},MSE为{:.3f}".format(r2_lasso,mse_lasso))

参考资料
  1. https://www.cnblogs.com/Belter/p/8536939.html
  2. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html
  3. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html
  4. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html
  5. https://bbs.pinggu.org/thread-604958-1-1.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值