当前位置:   article > 正文

机器学习--线性回归

线性回归

1 线性回归简介

1.1 线性回归应⽤场景

  • 房价预测
  • 销售额预测
  • 贷款额度预测

1.2 什么是线性回归

1.2.1 定义与公式

线性回归(Linear regression)是利⽤回归⽅程(函数)对⼀个或多个⾃变量(特征值)和因变量(⽬标值)之间关系进⾏建模的 ⼀种分析⽅式。

  • 特点:只有⼀个⾃变量的情况称为单变量回归,多于⼀个⾃变量情况的叫做多元回归
    在这里插入图片描述
  • 线性回归⽤矩阵表示举例
    在这里插入图片描述

那么怎么理解呢?我们来看⼏个例⼦

  • 期末成绩:0.7×考试成绩+0.3×平时成绩
  • 房⼦价格=0.02×中⼼区域的距离+0.04×城市⼀氧化氮浓度+(-0.12×⾃住房平均房价)+0.254×城镇犯罪率

上⾯两个例⼦,我们看到特征值与⽬标值之间建⽴了⼀个关系,这个关系可以理解为线性模型

1.2.2线性回归的特征与⽬标的关系分析

线性回归当中主要有两种模型,⼀种是线性关系,另⼀种是⾮线性关系。在这⾥我们只能画⼀个平⾯更好去理解,所以都⽤单个特征或两个特征举例⼦。

  • 线性关系
    • 单变量线性关系:
      在这里插入图片描述

    • 多变量线性关系
      在这里插入图片描述
      单特征与⽬标值的关系呈直线关系,或者两个特征与⽬标值呈现平⾯的关系

    • ⾮线性关系
      在这里插入图片描述

2 线性回归api初步使用

2.1 线性回归API

  • sklearn.linear_model.LinearRegression()
    • LinearRegression.coef_:回归系数

2.2 举例

在这里插入图片描述

2.2.1 步骤分析
  1. 获取数据集
  2. 数据基本处理(该案例中省略)
  3. 特征⼯程(该案例中省略)
  4. 机器学习
  5. 模型评估(该案例中省略)
from sklearn.linear_model import LinearRegression



# 1. 获取数据
x = [[80, 86],
     [82, 80],
     [85, 78],
     [90, 90],
     [86, 82],
     [82, 90],
     [78, 80],
     [92, 94]]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]
# 2. 模型训练
## 2.1 实例化一个估计器
estimator=LinearRegression()


## 2.2 使用fit方法进行训练
estimator.fit(x,y)

## 打印对应的系数
print("线性回归的系数是:\n",estimator.coef_)
## 打印的预测结果是
print("输出预测结果:\n",estimator.predict([[100,80]]))


  • 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

3 数学:求导

3.1 常⻅函数的导数

在这里插入图片描述

3.2 导数的四则运算

在这里插入图片描述

4 线性回归的损失和优化

假设刚才的房⼦例⼦,真实的数据之间存在这样的关系:

真实关系:真实房⼦价格 = 0.02×中⼼区域的距离 + 0.04×城市⼀氧化氮浓度 + (-0.12×⾃住房平均房价) + 0.254×城镇犯罪率

我们随意指定⼀个关系(猜测)

随机指定关系:预测房⼦价格 = 0.25×中⼼区域的距离 + 0.14×城市⼀氧化氮浓度 + 0.42×⾃住房平均房价 + 0.34×城镇犯罪率

在这里插入图片描述

4.1 损失函数

总损失定义为:
在这里插入图片描述

  • yi为第i个训练样本的真实值
  • h(xi)为第i个训练样本特征值组合预测函数
  • ⼜称最⼩⼆乘法

4.2 优化算法

如何去求模型当中的W,使得损失最⼩?(⽬的是找到最⼩损失对应的W值)

  • 线性回归经常使⽤的两种优化算法
    • 正规⽅程
    • 梯度下降法
4.2.1 正规方程

在这里插入图片描述

理解:X为特征值矩阵,y为⽬标值矩阵。直接求到最好的结果
缺点:当特征过多过复杂时,求解速度太慢并且得不到结果

在这里插入图片描述

1 正规⽅程求解举例

在这里插入图片描述

2 正规⽅程的推导

把该损失函数转换成矩阵写法
在这里插入图片描述
其中y是真实值矩阵,X是特征值矩阵,w是权重矩阵
对其求解关于w的最⼩值,起⽌y,X 均已知⼆次函数直接求导,导数为零的位置,即为最⼩值。
在这里插入图片描述

4.2.2 梯度下降(Gradient Descent)
1 什么是梯度下降

梯度下降法的基本思想可以类⽐为⼀个下⼭的过程。
假设这样⼀个场景:
⼀个⼈被困在⼭上,需要从⼭上下来(i.e. 找到⼭的最低点,也就是⼭⾕)。但此时⼭上的浓雾很⼤,导致可视度很低。 因此,下⼭的路径就⽆法确定,他必须利⽤⾃⼰周围的信息去找到下⼭的路径。这个时候,他就可以利⽤梯度下降算法 来帮助⾃⼰下⼭。
具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地⽅,然后朝着⼭的⾼度下降的地⽅⾛,(同 理,如果我们的⽬标是上⼭,也就是爬到⼭顶,那么此时应该是朝着最陡峭的⽅向往上⾛)。然后每⾛⼀段距离,都反 复采⽤同⼀个⽅法,最后就能成功的抵达⼭⾕。
在这里插入图片描述
梯度下降的基本过程就和下⼭的场景很类似。
⾸先,我们有⼀个可微分的函数。这个函数就代表着⼀座⼭。
我们的⽬标就是找到这个函数的最⼩值,也就是⼭底。
根据之前的场景假设,最快的下⼭的⽅式就是找到当前位置最陡峭的⽅向,然后沿着此⽅向向下⾛,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的⽅向,就能让函数值下降的最快!因为梯度的⽅向就是函数值变化最快的 ⽅向。 所以,我们重复利⽤这个⽅法,反复求取梯度,最后就能到达局部的最⼩值,这就类似于我们下⼭的过程。⽽ 求取梯度就确定了最陡峭的⽅向,也就是场景中测量⽅向的⼿段。

2 梯度的概念

梯度是微积分中⼀个很重要的概念

  • 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率;
  • 在多变量函数中,梯度是⼀个向量,向量有⽅向,梯度的⽅向就指出了函数在给定点的上升最快的⽅向;

在微积分⾥⾯,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是 梯度。

3.梯度下降(Gradient Descent)公式

在这里插入图片描述

  1. α是什么含义?

α在梯度下降算法中被称作为学习率或者步⻓,意味着我们可以通过α来控制每⼀步⾛的距离,以保证不要步⼦跨的 太⼤扯着蛋,哈哈,其实就是不要⾛太快,错过了最低点。同时也要保证不要⾛的太慢,导致太阳下⼭了,还没有 ⾛到⼭下。所以α的选择在梯度下降法中往往是很重要的!α不能太⼤也不能太⼩,太⼩的话,可能导致迟迟⾛不到 最低点,太⼤的话,会导致错过最低点!

在这里插入图片描述
2) 为什么梯度要乘以⼀个负号?
梯度前加⼀个负号,就意味着朝着梯度相反的⽅向前进!我们在前⽂提到,梯度的⽅向实际就是函数在此点上升最快的 ⽅向!⽽我们需要朝着下降最快的⽅向⾛,⾃然就是负的梯度的⽅向,所以此处需要加上负号

4.3 梯度下降和正规方程的对比

4.3.1 两种⽅法对⽐

在这里插入图片描述
经过前⾯的介绍,我们发现最⼩⼆乘法适⽤简洁⾼效,⽐梯度下降这样的迭代法似乎⽅便很多。但是这⾥我们就聊聊最 ⼩⼆乘法的局限性。

  • ⾸先,最⼩⼆乘法需要计算X X的逆矩阵,有可能它的逆矩阵不存在,这样就没有办法直接⽤最⼩⼆乘法了。
    • 此时就需要使⽤梯度下降法。当然,我们可以通过对样本数据进⾏整理,去掉冗余特征。让X X的⾏列式不 为0,然后继续使⽤最⼩⼆乘法。
  • 第⼆,当样本特征n⾮常的⼤的时候,计算X X的逆矩阵是⼀个⾮常耗时的⼯作(nxn的矩阵求逆),甚⾄不可⾏。
    • 此时以梯度下降为代表的迭代法仍然可以使⽤。
    • 那这个n到底多⼤就不适合最⼩⼆乘法呢?如果你没有很多的分布式⼤数据计算资源,建议超过10000个特征 就⽤迭代法吧。或者通过主成分分析降低特征的维度后再⽤最⼩⼆乘法。
  • 第三,如果拟合函数不是线性的,这时⽆法使⽤最⼩⼆乘法,需要通过⼀些技巧转化为线性才能使⽤,此时梯度下 降仍然可以⽤。
  • 第四,以下特殊情况,
    • 当样本量m很少,⼩于特征数n的时候,这时拟合⽅程是⽋定的,常⽤的优化⽅法都⽆法去拟合数据。
    • 当样本量m等于特征数n的时候,⽤⽅程组求解就可以了。
    • 当m⼤于n时,拟合⽅程是超定的,也就是我们常⽤与最⼩⼆乘法的场景了
4.3.2 算法选择依据:

在这里插入图片描述
在这里插入图片描述

5. 梯度下降⽅法介绍

https://blog.csdn.net/qq_39759664/article/details/123503129

6. 线性回归api再介绍

https://blog.csdn.net/qq_39759664/article/details/123560519

7. 欠拟合和过拟合

https://blog.csdn.net/qq_39759664/article/details/123564346

8. 正则化线性模型

https://blog.csdn.net/qq_39759664/article/details/123564476

9. 模型的保存和加载

import joblib

  • 保存:joblib.dump(estimator, ‘test.pkl’)

  • 加载:estimator = joblib.load(‘test.pkl’)

  • 线性回归的模型保存加载案例


from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor,RidgeCV,Ridge
from sklearn.metrics import mean_squared_error
import joblib
import warnings
warnings.filterwarnings("ignore")

def linear_model3():
    """
    线性回归:岭回归
    :return:
    """
    # 1.获取数据
    boston=load_boston()
    # 2.数据基本数据
    # 2.1 分割数据
    x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22,test_size=0.2)
    # 3.特征工程--标准化
    transfer=StandardScaler()
    x_train=transfer.fit_transform(x_train)
    x_test=transfer.fit_transform(x_test)
    # 4.机器学习---线性回归
    # 4.1 模型训练
    #estimator=SGDRegressor(max_iter=1000,learning_rate="constant",eta0=0.001)
   # estimator=Ridge(alpha=1.0)
   #  estimator=RidgeCV(alphas=(0.001,0.01,0.1,1,10,100))
   #  estimator.fit(x_train,y_train)
   #
   #  print("这个模型的偏置是:\n",estimator.intercept_)
   #  print("这个模型的系数是:\n",estimator.coef_)
   #
   #  # 4.2 保存模型
   #  joblib.dump(estimator,"./data/test.pkl")
    ## 4.3 模型加载
    estimator=joblib.load("./data/test.pkl")

    # 5. 模型评估
    ## 5.1 预测值
    y_pre=estimator.predict(x_test)
   # print("预测值是:\n",y_pre)
    ## 5.2 均方误差
    ret=mean_squared_error(y_test,y_pre)
    print("均方误差:\n",ret)

if __name__ == '__main__':
    linear_model3()
  • 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
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

注意:
1.保存⽂件,后缀名是**.pkl
2.加载模型是需要通过⼀个变量进⾏承接

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/807428
推荐阅读
相关标签
  

闽ICP备14008679号