线性回归(Linear-Regression)
一.定义
将y作为因变量,x作为自变量,得到方程:
y
=
β
0
+
β
1
x
y=\beta_0+\beta_1x
y=β0+β1x
当给定参数
β
0
\beta_0
β0和
β
1
\beta_1
β1的时候,画在坐标图内是一条直线。当我们只用一个x来预测y,就是一元线性回归,也就是在找一个直线来拟合数据。
线性回归就是要找一条直线,并且让这条直线尽可能地拟合图中的数据点
二.损失函数
-
残差:真实值和预测值间的差值:
e = y − y ^ e=y-\hat{y} e=y−y^ -
残差平方和(SSE - Sum of Squares for Error),回归问题中最常用的损失函数:
Q = ∑ 1 n ( y i − y i ^ ) 2 = ∑ 1 n ( y i − ( β 0 ^ + β 1 ^ x i ) ) 2 Q=\sum_1^n(y_i-\hat{y_i})^2=\sum_1^n(y_i-(\hat{\beta_0}+\hat{\beta_1}x_i))^2 Q=1∑n(yi−yi^)2=1∑n(yi−(β0^+β1^xi))2
损失函数是衡量回归模型误差的函数,也就是我们要的直线的评价标准。这个函数的值越小,说明直线越能拟合我们的数据
三.最小二乘估计
我们知道,两点确定一线,有两组x, y的值,就能算出 β 0 \beta_0 β0和 β 1 \beta_1 β1。但是现在有很多点,且并不是正好落在一条直线上,这么多点,两点都能确定一条直线,那最后应该选择哪条直线?
当给出两条确定的直线后,我们可以用损失函数评价,试着倒推。
给定一组样本观测值 x i , y i ( i = 1 , 2 , … , n ) x_i,y_i(i=1,2,\ldots,n) xi,yi(i=1,2,…,n),要求回归函数尽可能拟合这组值。
判断标准:SSE的值达到最小
SSE公式中,有
β
0
^
\hat{\beta_0}
β0^和
β
1
^
\hat{\beta_1}
β1^未知,有两个未知参数的二次方程,画出来是一个三维空间中的图像,类似于:
这类函数在数学中叫做凸函数
-
凸函数(简单理解):
- 几何特征:在函数f(x)上任取两个点 m ( x 1 , f ( x 1 ) ) , n ( x 2 , f ( x 2 ) ) m(x_1,f(x_1)), n(x_2,f(x_2)) m(x1,f(x1)),n(x2,f(x2)),连接mn,可以看出函数f(x)在区间 x 1 , x 2 x_1,x_2 x1,x2上的图像,总是在线段mn的下方
-
代数特征:
在线段mn上去取中间点A,那么A的坐标为: ( x 1 + x 2 2 , f ( x 1 ) + f ( x 2 ) 2 ) (\frac{x_1+x_2}{2},\frac{f(x_1)+f(x_2)}{2}) (2x1+x2,2f(x1)+f(x2)),B点的坐标为 ( x 1 + x 2 2 , f ( x 1 + x 2 2 ) ) (\frac{x_1+x_2}{2},{f(\frac{x_1+x_2}{2})}) (2x1+x2,f(2x1+x2))
可以看出A在上,B在下,所以A的纵坐标就大于B的纵坐标,这就是凸函数的代数特征。
只要是凸函数,在函数定义域内,都有 f ( x 1 ) + f ( x 2 ) 2 > f ( x 1 + x 2 2 ) \frac{f(x_1)+f(x_2)}{2}>f(\frac{x_1+x_2}{2}) 2f(x1)+f(x2)>f(2x1+x2)。
- 所以,我们可以得出,当导数为0时,Q取最小值,因此,我们分别对 β ^ 0 \hat\beta_0 β^0和 β ^ 1 \hat\beta_1 β^1求偏导,并令其为0:
∂ Q ∂ β 0 = 2 ∑ 1 n ( y i − β ^ 0 − β ^ 1 x i ) = 0 ∂ Q ∂ β 1 = 2 ∑ 1 n ( y i − β ^ 0 − β ^ 1 x i ) x i = 0 \frac{\partial Q}{\partial \beta_0}=2\sum_1^n(y_i-\hat\beta_0-\hat\beta_1x_i)=0 \\ \frac{\partial Q}{\partial \beta_1}=2\sum_1^n(y_i-\hat\beta_0-\hat\beta_1x_i)x_i=0 \\ ∂β0∂Q=21∑n(yi−β^0−β^1xi)=0∂β1∂Q=21∑n(yi−β^0−β^1xi)xi=0
x i , y i ( i = 1 , 2 , … , n ) x_i, y_i(i=1,2,\ldots,n) xi,yi(i=1,2,…,n)都是已知的,全部代入上面两个式子,就可以求得 β ^ 0 \hat\beta_0 β^0和 β ^ 1 \hat\beta_1 β^1的值。这就是最小二乘法,二乘是平方的意思
四.小结
线性回归的定义:利用最小二乘法对一个或多个自变量关系进行建模的方法
如果有多个特征,那就是多元线性回归:
y
=
β
0
+
β
1
x
1
+
β
2
x
2
+
⋯
+
β
i
x
i
y=\beta_0+\beta_1x_1+\beta_2x_2+\cdots+\beta_ix_i
y=β0+β1x1+β2x2+⋯+βixi
pandas调包实现线性回归
调包以及标准化数据
# 导入线性回归模型
from sklearn.linear_model import LinearRegression
# 导入划分训练集和测试集的模块
from sklearn.model_selection import train_test_split
# 导入交叉验证验证
from sklearn.model_selection import cross_val_score
# 数据有量纲的问题,应该对数据进行标准化(线性模型和度量模型一定要做标准化)
from sklearn.preprocessing import StandardScaler
# 实例化标准化的类
STD = StandardScaler()
# 传入X - 计算X的均值和方差
STD.fit(X)
# 将X转换成标准的正态分布
STD.transform(X)
trans_X = pd.DataFrame(STD.transform(X))
# 分训练集和测试集
xtrain,xtest,ytrain,ytest = train_test_split(trans_X,y)
参数解释:
LinearRegression(fit_intercept=True,normalize=False,copy_X=True,n_jobs=1)
- fit_intercept:是否有截距,如果没有则直线过原点
- normalize:是否将数据归一化
- copy_X:默认为True,当为True时,X会被copied,否则X将会被覆写
- n_jobs:用于计算的作业数,只在多标签的回归和数据量足够大的时候才生效,默认为1,如果 为-1,则表示使用全部的CPU来进行计算。
# 建立模型并训练
LR = LinearRegression().fit(xtrain,ytrain)
# 预测,得到y_hat
y_hat = LR.predict(xtest)
# 查看模型的系数β
LR.coef_
# 查看截距项
LR.intercept_
# 将系数和特征对应
[*zip(X.columns,LR.coef_)]
五.回归类模型的评估指标
回归类与分类型算法的模型评估其实是相似的法则——找到真实标签和预测值的差异,只不过在分类型算法中,这个差异只有一种角度来评判,那就是是否预测到了正确的分类,而在回归类算法中,有两种不同的角度来看待回归的效果。
- 是否预测到了正确的数值
- 是否拟合到了足够的信息
这两种角度,分别对应着不同的模型评估指标
是否预测到了正确的数值
回顾一下RSS残差平方和,它的本质是我们的预测值与真实值之间的差异,也就是从第一种角度来评估回归的效果。所以RSS既是损失函数,也是回归类模型的模型评估指标之一。但是,RSS有致命的缺点:它是以一个无界的和,可以无限放大,我们只知道,想要求解最小的RSS,从RSS的公式来看,它不能为负,所以RSS越接近0越好,但我们没有一个概念,“究竟多小才算好,多接近0才算好”,为了应对这种状况,sklearn中使用RSS的变体,**均方误差MSE(Mean Squared Error)**来衡量预测值和真实值的差异:
M
S
E
=
1
m
∑
i
=
1
m
(
y
i
−
y
i
^
)
2
MSE=\frac{1}{m}\sum_{i=1}^m(y_i-\hat{y_i})^2
MSE=m1i=1∑m(yi−yi^)2
均方误差,本质是在RSS的基础上除以样本总量,得到了每个样本量上的平均误差,有了平均误差,就可以将平均误差和标签的取值范围在一起比较,以此获得一个较为可靠的评估依据,在sklearn中,有两种方式:
- 使用sklearn专用的模型评估模块metrics里的类mean_squared_eerror
- 调用交叉验证的类cross_val_score并使用里面scoring参数来设置使用均方误差
# 导入均方误差
from sklearn.metrics import mean_squared_error as MSE
# 得到误差
MSE(y_hat,yest)
# 查询测试集的y平均值
ytest.mean()
# 交叉验证(模型、特征、标签、k折,Sklearn中用负均方误差)
# cv=k,k个子集,每个子集均做一次测试集,其余的作为训练集。交叉验证重复k次,每次选择一个子集作为测试集,并将k次的平均交叉验证识别正确率作为结果。
# 优点:所有的样本都被作为了训练集和测试集,每个样本都被验证一次。
cross_val_score(LR,trans_X,y,cv=10,scoring='neg_mean_squared_error').mean()
六.多项回归
# 多项式回归
from sklearn.preprocession import PolynomialFeatures
# degree表示几项,默认为2项
poly = PolynomialFeatures(degree=3).fit(xtrain)
x_poly = poly.transform(xtrain)
x_test_poly = poly.transform(xtest)
LR = LinearRegression().fit(x_poly,ytrain)
LR.coef_, LR.intercept_
y_test_poly = LR.predict(x_test_poly)
x_poly = poly.transform(xtrain)
x_test_poly = poly.transform(xtest)
LR = LinearRegression().fit(x_poly,ytrain)
LR.coef_, LR.intercept_
y_test_poly = LR.predict(x_test_poly)