线性回归
一、形式化定义
在统计学中,线性回归是一种线性方法,用于建模标量响应与一个或多个解释变量之间的关系。
当只有一个解释变量时,我们称之为简单线性回归:
数据假设:yi∈R模型假设:yi=xiTw+ϵiϵi∼N(0,σ2),yi∣xi∼N(xiTw,σ2)
根据对分布的模型假设,我们最终得到的条件概率为:
P(yi∣xi,w)=2πσ21e−2σ2(xiTw−yi)2
我们假设模型是一条过原点的直线(类似于感知机通过升维即可使得函数过原点)而对于每个特征xi,它的标签yi则从一个平均值为wTxi,方差为σ2的高斯分布中得出,我们在线性回归建模中的任务便是根据数据集估计斜率w。
单标量预测变量x和单标量响应变量y的最简单情况称为简单线性回归,而多个预测变量x参与的预测为多元线性回归,几乎所有现实世界的回归模型都涉及多个预测因子,线性回归的基本描述通常用多元回归模型来表述。
二、参数估计
线性回归模型中的重要参数就是“斜率”w,我们同样可以通过MLE和MAP两种方式对它进行估计。
进行下列推导之前,我们先了解几个常用的矩阵求导公式:
∂x∂Ax=AT,∂x∂xTA=A,∂x∂ATxB=ABT∂x∂ATxTB=BAT,∂x∂ATxxTB=(ABT+BAT)x,∂x∂xTAx=2Ax
再了解一些矩阵的相关性质:
(AT)T=A,(A+B)T=AT+BT,(AB)T=BTAT
2.1 极大似然估计MLE
w^MLE=wargmax P(Y,X∣w)=wargmax i=1∏nP(yi,xi∣w) =wargmax i=1∏nP(yi∣xi,w)P(xi∣w)=wargmax i=1∏nP(yi∣xi,w) =wargmax i=1∑nlogP(yi∣xi,w)=wargmax i=1∑nlog2πσ21e−2σ2(wTxi−yi)2 =wargmin i=1∑n(xiTw−yi)2=wargmin n1i=1∑n(xiTw−yi)2
我们可以发现,线性回归问题的极大似然估计结果与最小二乘法(OLS)的形式完全相同。
此外我们还可以推导出w的闭合形式解,这样会使得计算更加方便:根据上述估计值,我们可以定义损失函数l(w)
l(w)=(Xw−Y)2
我们要求解l(w)′=0时所对应的w,X为n×d维矩阵,w为d×1维矩阵,Y为n×1维矩阵:
l(w)=(Xw−Y)T(Xw−Y)=(wTXT−YT)(Xw−Y) =wTXTXw−wTXTY−YTXw−YTY∂w∂l(w)=2XTXw−2XTY=0则有:w=(XTX)−1XTY
2.2 极大后验估计MAP
引入一个附加的模型假设:
P(w)=2πτ21e−2τ2wTw
则极大后验估计的过程为:
w^MAP=wargmax P(w∣Y,X)=wargmax P(Y,X)P(Y,X∣w)P(w) =wargmax P(Y,X∣w)P(w)=wargmax i=1∏nP(yi,xi∣w)P(w) =wargmax i=1∑nlogP(yi,xi∣w)+logP(w) =wargmax −i=1∑n(xiTw−yi)2−2τ21wTw =wargmin i=1∑n(xiTw−yi)2+λ∣∣w∣∣22
我们将这一回归称为岭回归,它同样存在闭合形式:我们定义损失函数为:
l(w)=(Xw−Y)2+λwTw
我们要求解l(w)′=0时所对应的w:
∂w∂l(w)=2XTXw−2XTY+2λIw=0则有:w=(XTX+λI)−1XTY
三、模型实现
对于简单的线性回归模型,我们通过闭合形式可以直接求解,将分别通过手动实现和调库的方式构造模型。
3.1 数据集
我们使用波士顿房价数据集,查看数据集的内容并对其进行存储依靠以下部分代码:
'''屏蔽warning'''
import warnings
warnings.filterwarnings("ignore")
'''导入重要的库'''
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
boston=load_boston()
print(boston.data)#输出数据集内容
print(boston.target)#输出每个数据集的标签
print(boston.feature_names)#输出数据集每一列对应的特征
print(len(boston.data))#输出样本数量
print(len(boston.feature_names))#输出特征数量
'''将数据集存储为csv文件'''
df=pd.DataFrame(data=boston.data,columns=boston.feature_names)#构建二维表格
df['label']=boston.target
df.to_csv("data/boston_data.csv",index=False)
波士顿房价数据集有506个样本,每个样本有13个特征,接下来我们利用线性回归模型对数据集进行拟合。
3.2 手动实现模型
我们的评估指标选择r2系数,其定义如下:
R2=1−∑i=1n(yi−y)2∑i=1n(yi−yi^)2=1−VarMSE
显然,预测越准r2系数越趋近于1。
'''屏蔽warning'''
import warnings
warnings.filterwarnings("ignore")
'''导入重要的库'''
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
class LinearRegression(object):
'''初始化'''
def __init__(self,b,lam):
self.b=b #偏差项
self.lam=lam #岭回归所要用到的岭系数
'''求解闭合形式'''
def fit_OLS(self,X,Y): #最小二乘法的闭合形式
self.w=np.dot(np.dot(np.linalg.inv(np.dot(X.T,X)),X.T),Y)
def fit_Ridge(self,X,Y): #岭回归的闭合形式
self.w=np.dot(np.dot(np.linalg.inv(np.dot(X.T,X)+self.lam*np.eye(len(X[0]))),X.T),Y)
'''预测结果'''
def predict(self,X_test):
return np.dot(X_test,self.w)
'''载入数据'''
boston=load_boston()
X=boston.data
Y=boston.target
'''数据集划分'''
X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)#选取20%的数据作为测试集
'''模型拟合'''
linear_regression=LinearRegression(0,1)
# linear_regression.fit_OLS(X_train,y_train)
linear_regression.fit_Ridge(X_train,y_train)
'''模型预测'''
y_pred=linear_regression.predict(X_test)
print(r2_score(y_test,y_pred)) #0.7797762734166735
for i in range(len(y_test)):
print("true:",y_test[i],"pred:",y_pred[i])
3.3 调库实现模型
调库主要用到的是sklearn中的LinearRegression模型,其具体参数请查阅文档
'''屏蔽warning'''
import warnings
warnings.filterwarnings("ignore")
'''导入重要的库'''
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.linear_model import LinearRegression
'''载入数据'''
boston=load_boston()
X=boston.data
Y=boston.target
'''数据集划分'''
X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)#选取20%的数据作为测试集
'''模型拟合'''
linear_regression=LinearRegression()
linear_regression.fit(X_train,y_train)
'''模型预测'''
y_pred=linear_regression.predict(X_test)
print(r2_score(y_test,y_pred)) #0.748825851468819
for i in range(len(y_test)):
print("true:",y_test[i],"pred:",y_pred[i])