线性回归

线性回归(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,就是一元线性回归,也就是在找一个直线来拟合数据。

线性回归就是要找一条直线,并且让这条直线尽可能地拟合图中的数据点

二.损失函数

  1. 残差:真实值和预测值间的差值:
    e = y − y ^ e=y-\hat{y} e=yy^

  2. 残差平方和(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=1n(yiyi^)2=1n(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^未知,有两个未知参数的二次方程,画出来是一个三维空间中的图像,类似于:
在这里插入图片描述

这类函数在数学中叫做凸函数

  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的下方

在这里插入图片描述

  1. 代数特征:

    在线段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)

在这里插入图片描述

  1. 所以,我们可以得出,当导数为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 \\ β0Q=21n(yiβ^0β^1xi)=0β1Q=21n(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)
  1. fit_intercept:是否有截距,如果没有则直线过原点
  2. normalize:是否将数据归一化
  3. copy_X:默认为True,当为True时,X会被copied,否则X将会被覆写
  4. 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_)]

五.回归类模型的评估指标

回归类与分类型算法的模型评估其实是相似的法则——找到真实标签和预测值的差异,只不过在分类型算法中,这个差异只有一种角度来评判,那就是是否预测到了正确的分类,而在回归类算法中,有两种不同的角度来看待回归的效果。

  1. 是否预测到了正确的数值
  2. 是否拟合到了足够的信息

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

是否预测到了正确的数值

回顾一下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=1m(yiyi^)2
均方误差,本质是在RSS的基础上除以样本总量,得到了每个样本量上的平均误差,有了平均误差,就可以将平均误差和标签的取值范围在一起比较,以此获得一个较为可靠的评估依据,在sklearn中,有两种方式:

  1. 使用sklearn专用的模型评估模块metrics里的类mean_squared_eerror
  2. 调用交叉验证的类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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值