线性回归

线性回归简介

线性回归应用场景
  1. 房价预测
  2. 销售额度预测
  3. 贷款额度预测
什么是线性回归
  1. 定义与公式

    线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式

  2. 特点:只有一个自变量的情况称为单变量回归,多于一个自变量情况的叫做多元回归

  3. 通用公式:

    \[h(x) = w_1x+w_2x+w_3x+...+b=w^Tx+b\\其中w,x可以理解为矩阵:w=\left[\begin{matrix} b\\ w_1 \\w_2\end{matrix}\right],x=\left[\begin{matrix} 1\\ x_1 \\x_2\end{matrix}\right]\]

  4. 我们看到特征值与目标值之间建立了一个关系,这个关系可以理解为线性模型

线性回归的特征与目标的关系分析
  1. 线性回归当中主要有两种模型,一种是线性关系,另一种是非线性关系。在这里我们只能画一个平面更好去理解,所以都用单个特征或两个特征举例子
  2. 线性关系
    1. 单变量线性关系
    2. 多变量线性关系
    3. 单特征与目标值的关系呈直线关系,或者两个特征与目标值呈现平面的关系更高维度的我们不用自己去想,记住这种关系即可
  3. 非线性关系
    1. 如果是非线性关系,那么回归方程可以理解为:\[w_1x_1+w_2x_2^2+w_3x_3^2...\]

线性回归API初步使用

线性回归API
  1. sklearn.linear_model.LinearRegression()
    1. LinearRegression.coef_:回归系数
步骤分析
  1. 获取数据集
  2. 数据基本处理
  3. 特征工程
  4. 机器学习
  5. 模型评估
代码过程
  1. 导入模块

    from sklearn.linear_model import LinearRegression
    
  2. 构造数据集

    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]
  3. 机器学习-- 模型训练

    # 实例化API
    estimator = LinearRegression()
    # 使用fit方法进行训练
    estimator.fit(x,y)
    estimator.coef_
    estimator.predict([[100, 80]])

数学:求导

常见函数的导数
  1. 公式

    公式
    \[(C)'=0\]
    \[(x^\alpha)'=\alpha x^{\alpha-1}\]
    \[(a^x)'=a^xlna\]
    \[(e^x)'=e^x\]
    \[(log_ax)'=\frac{1}{xlna}\]
    \[(lnx)'=\frac{1}{x}\]
    \[(sinx)'=cosx\]
    \[(cosx)'=-sinx\]
导数的四则运算
  1. 公式

    \[[u(x)\pm v(x)]'=u'(x)\pm v'(x)\]
    \[[u(x) \cdot v(x)]'=u'(x) \cdot v(x)+ u(x) \cdot v'(x)\]
    \[[\frac{u(x)}{v(x)}]'=\frac{u'(x) \cdot v(x) - u(x) \cdot v'(x)}{v^2(x)}\]
    \[g[h(x)]'=g'(h)\cdot h'(x)\]
矩阵(向量)求导
  1. 公式

    Condition Expression Numberator layout, i,e by y and xT^ Denominator layout, i,e by yT^ andx
    a is not a function of x \[\frac{\partial a}{\partial X}\] 0 0
    \[\frac{\partial X}{\partial X}\] I I
    A is not a function of x \[\frac{\partial AX}{\partial X}\] A AT^
    A is not a function of x \[\frac{\partial X^T A}{\partial X}\] AT^ A
    a is not a function of x,u=u(x) \[\frac{\partial au}{\partial X}\] \[a\frac{\partial u}{\partial X}\] \[a\frac{\partial u}{\partial X}\]
    v=v(x),u=u(x) \[\frac{\partial vu}{\partial X}\] \[v\frac{\partial u}{\partial X}+u\frac{\partial v}{\partial X}\] \(v\frac{\partial u}{\partial X}+\frac{\partial v}{\partial X}u^T\)
    A is not a function of x,u=u(x) \[\frac{\partial Au}{\partial X}\] \[A\frac{\partial u}{\partial X}\] \[\frac{\partial u}{\partial X}A^T\]
    u=u(x),v=v(x) \[\frac{\partial (u+v)}{\partial X}\] \[\frac{\partial u}{\partial X}+\frac{\partial v}{\partial X}\] \[\frac{\partial u}{\partial X}+\frac{\partial v}{\partial X}\]
    u=u(x) \[\frac{\partial g(u)}{\partial X}\] \[\frac{\partial g(u)}{\partial u}\frac{\partial u}{\partial X}\] \[\frac{\partial u}{\partial X}\frac{\partial g(u)}{\partial u}\]
    u=u(x) \[\frac{\partial f[g(u)]}{\partial X}\] \[\frac{\partial f(g)}{\partial g}\frac{\partial g(u)}{\partial u}\frac{\partial u}{\partial X}\] \[\frac{\partial u}{\partial X}\frac{\partial g(u)}{\partial u}\frac{\partial f(g)}{\partial g}\]

线性回归的损失和优化

损失函数
  1. 总损失定义为:

    \[J(\theta) = (h_w(x_1)-y_1)^2+(h_w(x_2)-y_2)^2+...+(h_w(x_n)-y_n)^2\\=\sum^m_{i=1}(h_w(x_i)-y_i)^2\]

  2. \[y_i\]为第i个训练样本的真实值

  3. \[h(x_i)\]为第i个训练样本特征值组合预测函数

  4. 又称最小二乘法

  5. 如何去减少这个损失,使我们预测的更加准确些?既然存在了这个损失,我们一直说机器学习有自动学习的功能,在线性回归这里更是能够体现。这里可以通过一些优化方法去优化(其实是数学当中的求导功能)回归的总损失

优化算法
  1. 如何去求模型当中的W,使得损失最小?(目的是找到最小损失对应的W值)

  2. 正规方程

    1. 什么是正规方程

      \[w=(X^TX)^{-1}X^Ty\]

      1. 理解X为特征值矩阵,y为目标值矩阵。直接求到最好的结果
      2. 当特征过多过复杂时,求解速度太慢并且得不到结果
    2. 正规方程的推导

      1. 推导方式一

      2. 把该损失函数转换成矩阵写法

        \[J(\theta) = (h_w(x_1)-y_1)^2+(h_w(x_2)-y_2)^2+...+(h_w(x_n)-y_n)^2\\=\sum^m_{i=1}(h_w(x_i)-y_i)^2\\=(y-Xw)^2\]

      3. 其中y是真实值矩阵,X是特征值矩阵,w是权重矩阵

      4. 对其求解关于w的最小值,起止y,X 均已知二次函数直接求导,导数为零的位置,即为最小值

        \[2(Xw-y)*X=0\\2(Xw-y)*(XX^T)=0X^T\\2(Xw-y)*(XX^T)(XX^T)^{-1}=0X^T(XX^T)^{-1}\\2(Xw-y)=0\\Xw=y\\X^TXw=X^Ty\\(X^TX)^{-1}(X^TX)*w=(X^TX)^{-1}*X^Ty\\w=(X^TX)^{-1}*X^Ty\]

      5. 推导过程中, X是一个m行n列的矩阵,并不能保证其有逆矩阵,但是右乘XT把其变成一个方阵,保证其有逆矩阵

  3. 梯度下降(Gradient Descent)

    1. 什么是梯度下降

      1. 梯度下降法的基本思想可以类比为一个下山的过程
      2. 首先,我们有一个可微分的函数。这个函数就代表着一座山
      3. 我们的目标就是找到这个函数的最小值,也就是山底
      4. 根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向。 所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段
    2. 梯度的概念

      1. 梯度是微积分中一个很重要的概念
      2. 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
      3. 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向
      4. 这也就说明了为什么我们需要千方百计的求取梯度!我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的反方向一直走,就能走到局部的最低点!
    3. 梯度下降Gradient Descent)公式

      \[\theta_i=\theta_i-\alpha\frac{\partial}{\partial\theta_i}J(\theta)\]

      1. α是什么含义
        1. α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,以保证不要步子跨的太大扯着蛋,哈哈,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山下。所以α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点
      2. 为什么梯度要乘以一个负号
        1. 梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们在前文提到,梯度的方向实际就是函数在此点上升最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号
      3. 所以有了梯度下降这样一个优化算法,回归就有了"自动学习"的能力
  4. 梯度下降和正规方程对比

    梯度下降 正规方程
    需要选择学习率 不需要
    需要迭代求解 一次运算得出
    特征数量较大可以使用 需要计算方程,时间复杂度高O(n3)
  5. 选择

    1. 小规模数据
      1. LinearRegression(不能解决拟合问题)
      2. 岭回归
    2. 大规模数据
      1. SGDRegressor

梯度下降法方法介绍

全梯度下降算法(FG)
  1. 计算训练集所有样本误差,对其求和再取平均值作为目标函数

  2. 权重向量沿其梯度相反的方向移动,从而使当前目标函数减少得最多

  3. 因为在执行每次更新时,我们需要在整个数据集上计算所有的梯度,所以批梯度下降法的速度会很慢,同时,批梯度下降法无法处理超出内存容量限制的数据集

  4. 批梯度下降法同样也不能在线更新模型,即在运行的过程中,不能增加新的样本

  5. 其是在整个训练数据集上计算损失函数关于参数θ的梯度

    \[\theta=\theta-\eta \cdot \nabla_\theta J(\theta)\]

随机梯度下降算法(SG)
  1. 由于FG每迭代更新一次权重都需要计算所有样本误差,而实际问题中经常有上亿的训练样本,故效率偏低,且容易陷入局部最优解,因此提出了随机梯度下降算法

  2. 其每轮计算的目标函数不再是全体样本误差,而仅是单个样本误差,即每次只代入计算一个样本目标函数的梯度来更新权重,再取下一个样本重复此过程,直到损失函数值停止下降或损失函数值小于某个可以容忍的阈值,此过程简单,高效,通常可以较好地避免更新迭代收敛到局部最优解

    \[\theta=\theta-\eta \cdot \nabla_\theta J(\theta;x^{(i)};y^{i}),其中,x^{(i)}表示一条训练样本的特征值,y^{(i)}表示一条训练样本的标签值\]

  3. 每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解,但是由于,SG每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解

小批量梯度下降算法(mini-bantch)
  1. 小批量梯度下降算法是FG和SG的折中方案,在一定程度上兼顾了以上两种方法的优点

  2. 每次从训练样本集上随机抽取一个小样本集,在抽出来的小样本集上采用FG迭代更新权重

  3. 被抽出的小样本集所含样本点的个数称为batch_size,通常设置为2的幂次方,更有利于GPU加速处理

  4. 特别的,若batch_size=1,则变成了SG;若batch_size=n,则变成了FG.其迭代形式为

    \[\theta=\theta-\eta \cdot \nabla_\theta J(\theta;x^{(i:i+n)};y^{i:i+n})\]

随机平均梯度下降算法(SAG)
  1. 在SG方法中,虽然避开了运算成本大的问题,但对于大数据训练而言,SG效果常不尽如人意,因为每一轮梯度更新都完全与上一轮的数据和梯度无关
  2. 随机平均梯度算法克服了这个问题,在内存中为每一个样本都维护一个旧的梯度,随机选择第i个样本来更新此样本的梯度,其他样本的梯度保持不变,然后求得所有梯度的平均值,进而更新了参数
  3. 如此,每一轮更新仅需计算一个样本的梯度,计算成本等同于SG,但收敛速度快得多
算法比较
  1. FG方法由于它每轮更新都要使用全体数据集,故花费的时间成本最多,内存存储最大
  2. SAG在训练初期表现不佳,优化速度较慢。这是因为我们常将初始梯度设为0,而SAG每轮梯度更新都结合了上一轮梯度值
  3. 综合考虑迭代次数和运行时间,SG表现性能都很好,能在训练初期快速摆脱初始梯度值,快速将平均损失函数降到很低。但要注意,在使用SG方法时要慎重选择步长,否则容易错过最优解
  4. mini-batch结合了SG的“胆大”和FG的“心细”,它的表现也正好居于SG和FG二者之间。在目前的机器学习领域,mini-batch是使用最多的梯度下降算法,正是因为它避开了FG运算效率低成本大和SG收敛效果不稳定的缺点
梯度下降优化算法(拓展)
  1. 以下这些算法主要用于深度学习优化
  2. 动量法
    1. 其实动量法(SGD with monentum)就是SAG的姐妹版
    2. SAG是对过去K次的梯度求平均值
    3. SGD with monentum 是对过去所有的梯度求加权平均
  3. Nesterov加速梯度下降法
    1. 类似于一个智能球,在重新遇到斜率上升时候,能够知道减速
  4. Adagrad
    1. 让学习率使用参数
    2. 对于出现次数较少的特征,我们对其采用更大的学习率,对于出现次数较多的特征,我们对其采用较小的学习率
  5. Adadelta
    1. Adadelta是Adagrad的一种扩展算法,以处理Adagrad学习速率单调递减的问题
  6. RMSProp
    1. 其结合了梯度平方的指数移动平均数来调节学习率的变化
    2. 能够在不稳定(Non-Stationary)的目标函数情况下进行很好地收敛
  7. Adam
    1. 结合AdaGrad和RMSProp两种优化算法的优点
    2. 是一种自适应的学习率算法

线性回归API进阶

LinearRegression
  1. sklearn.linear_model.LinearRegression(fit_intercept=True)
    1. 通过正规方程优化
    2. fit_intercept:是否计算偏置
    3. LinearRegression.coef_:回归系数
    4. LinearRegression.intercept_:偏置
SGDRegressor
  1. sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
    1. SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型
    2. loss:损失类型
      1. loss=”squared_loss”: 普通最小二乘法
    3. fit_intercept:是否计算偏置
    4. learning_rate : string, optional
      1. 学习率填充
      2. constant: eta = eta0
      3. optimal: eta = 1.0 / (alpha * (t + t0)) [default]
      4. invscaling: eta = eta0 / pow(t, power_t)
        1. power_t=0.25:存在父类当中
      5. 对于一个常数值的学习率来说,可以使用learning_rate=’constant’ ,并使用eta0来指定学习率
    5. SGDRegressor.coef_:回归系数
    6. SGDRegressor.intercept_:偏置

案例:波士顿房价预测

分析
  1. 回归当中的数据大小不一致,是否会导致结果影响较大。所以需要做标准化处理
    1. 数据分割与标准化处理
    2. 回归预测
    3. 线性回归的算法效果评估
回归性能评估
  1. 均方误差(Mean Squared Error)MSE)评价机制

    \[MSE=\frac{1}{m}\sum^m_{i=1}(y^i-\bar y)^2\]

  2. \[y_i\]为预测值,\[\bar y\]为真实值

  3. sklearn.metrics.mean_squared_error(y_true, y_pred)

    1. 均方误差回归损失
    2. y_true:真实值
    3. y_pred:预测值
    4. return:浮点数结果
代码
  1. 代码

    def linear_model1():
       """
    线性回归:正规方程
    :return:None
    """
    # 1.获取数据
    data = load_boston()
    # 2.数据集划分
    x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)
    # 3.特征工程-标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)
    # 4.机器学习-线性回归(正规方程)
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)
    # 5.模型评估
    # 5.1 获取系数等值
    y_predict = estimator.predict(x_test)
    print("预测值为:\n", y_predict)
    print("模型中的系数为:\n", estimator.coef_)
    print("模型中的偏置为:\n", estimator.intercept_)
    # 5.2 评价
    # 均方误差
    error = mean_squared_error(y_test, y_predict)
    print("误差为:\n", error)
    def linear_model2():
    """
    线性回归:梯度下降法
    :return:None
    """
    # 1.获取数据
    data = load_boston()
    # 2.数据集划分
    x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)
    # 3.特征工程-标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)
    # 4.机器学习-线性回归(特征方程)
    estimator = SGDRegressor(max_iter=1000)
    estimator.fit(x_train, y_train)
    # 5.模型评估
    # 5.1 获取系数等值
    y_predict = estimator.predict(x_test)
    print("预测值为:\n", y_predict)
    print("模型中的系数为:\n", estimator.coef_)
    print("模型中的偏置为:\n", estimator.intercept_)
    # 5.2 评价
    # 均方误差
    error = mean_squared_error(y_test, y_predict)
    print("误差为:\n", error)
  2. 我们也可以尝试去修改学习率,此时我们可以通过调参数,找到学习率效果更好的值

    estimator = SGDRegressor(max_iter=1000,learning_rate="constant",eta0=0.1)
    

欠拟合与过拟合

欠拟合与过拟合定义
  1. 过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
  2. 欠拟合:一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
原因以及解决办法
  1. 欠拟合原因以及解决办法
    1. 原因:学习到数据的特征过少
    2. 解决办法
      1. 添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项
      2. 添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强
  2. 过拟合原因以及解决办法
    1. 原因:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
    2. 解决办法
      1. 重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据
      2. 增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小
      3. 正则化
      4. 减少特征维度,防止维灾难
正则化
  1. 什么是正则化
    1. 在解决回归过拟合中,我们选择正则化。但是对于其他机器学习算法如分类算法来说也会出现这样的问题,除了一些算法本身作用之外(决策树、神经网络),我们更多的也是去自己做特征选择,包括之前说的删除、合并一些特征
    2. 在学习的时候,数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多,所以算法在学习的时候尽量减少这个特征的影响(甚至删除某个特征的影响),这就是正则化
    3. 调整时候,算法并不知道某个特征影响,而是去调整参数得出优化的结果
  2. 正则化类别
    1. L2正则化
      1. 作用:可以使得其中一些W的都很小,都接近于0,削弱某个特征的影响
      2. 优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
      3. Ridge回归
    2. L1正则化
      1. 作用:可以使得其中一些W的值直接为0,删除这个特征的影响
      2. LASSO回归
维灾难
  1. 什么是维灾难
    1. 随着维度的增加,分类器性能逐步上升,到达某点之后,其性能便逐渐下降
  2. 维数灾难与过拟合
    1. 过多的特征导致的过拟合现象:训练集上表现良好,但是对新数据缺乏泛化能力
    2. 高维空间训练形成的线性分类器,相当于在低维空间的一个复杂的非线性分类器,这种分类器过多的强调了训练集的准确率甚至于对一些错误/异常的数据也进行了学习,而正确的数据却无法覆盖整个特征空间。为此,这样得到的分类器在对新数据进行预测时将会出现错误。这种现象称之为过拟合,同时也是维灾难的直接体现
    3. 简单的线性分类器在训练数据上的表现不如非线性分类器,但由于线性分类器的学习过程中对噪声没有对非线性分类器敏感,因此对新数据具备更优的泛化能力。换句话说,通过使用更少的特征,避免了维数灾难的发生(也即避免了高维情况下的过拟合)
    4. 训练集的维度越多,过度拟合的风险就越大
    5. 所需的训练实例数量随着使用的维度数量呈指数增长

正则化线性模型

Ridge Regression(岭回归)
  1. (岭回归,又名 Tikhonov regularization)

  2. 岭回归是线性回归的正则化版本,即在原来的线性回归的 cost function 中添加正则项(regularization term)

    \[\alpha\sum^n_{i=1}\theta_i^2\]

    以达到在拟合数据的同时,使模型权重尽可能小的目的,岭回归代价函数

  3. 公式即:

    \[J(\theta)=MSE(\theta)+\alpha\sum^n_{i=1}\theta_i^2\\J(\theta)=\frac{1}{m}\sum^m_{i=1}(\theta^T\cdot x^{(i)}-y^{(i)})^2+\alpha\sum^n_{i=1}\theta_i^2\]

  4. α=0:岭回归退化为线性回归

Lasso Regression(Lasso 回归)
  1. Lasso 回归是线性回归的另一种正则化版本,正则项为权值向量的ℓ1范数

  2. 公式即:

    \[J(\theta)=MSE(\theta)+\alpha\sum^n_{i=1}|\theta_i|\]

  3. Lasso Regression 的代价函数在 θi=0处是不可导的.

  4. 解决方法

    1. 在θi=0处用一个次梯度向量(subgradient vector)代替梯度
  5. Lasso Regression 有一个很重要的性质是

    1. 倾向于完全消除不重要的权重
  6. 当α 取值相对较大时,高阶多项式退化为二次甚至是线性:高阶多项式特征的权重被置为0。也就是说,Lasso Regression 能够自动进行特征选择,并输出一个稀疏模型(只有少数特征的权重是非零的

Elastic Net (弹性网络)
  1. 弹性网络在岭回归和Lasso回归中进行了折中,通过 混合比(mix ratio) r 进行控制

    1. r=0:弹性网络变为岭回归
    2. r=1:弹性网络便为Lasso回归
  2. 弹性网络的代价函数

    \[J(\theta)=MSE(\theta)+r\alpha\sum^n_{i=1}|\theta_i|+\frac{1-r}{2}\alpha\sum^n_{i=1}(\theta_i)^2\]

  3. 一般来说,我们应避免使用朴素线性回归,而应对模型进行一定的正则化处理,那如何选择正则化方法呢

    1. 常用:岭回归

    2. 假设只有少部分特征是有用的

      1. 弹性网络
      2. Lasso
      3. 一般来说,弹性网络的使用更为广泛。因为在特征维度高于训练样本数,或者特征是强相关的情况下,Lasso回归的表现不太稳定
    3. api

      from sklearn.linear_model import Ridge, ElasticNet, Lasso
      
Early Stopping
  1. Early Stopping 也是正则化迭代学习的方法之一
  2. 方法
    1. 在验证错误率达到最小值的时候停止训练

线性回归的改进-岭回归

API
  1. sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)

    1. 具有l2正则化的线性回归
    2. alpha:正则化力度,也叫 λ
      1. λ取值:0~1 1~10
    3. solver:会根据数据自动选择优化方法
      1. sag:如果数据集、特征都比较大,选择该随机梯度下降优化
    4. normalize:数据是否进行标准化
      1. normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据
    5. Ridge.coef_:回归权重
    6. Ridge.intercept_:回归偏置
  2. Ridge方法相当于SGDRegressor(penalty='l2', loss="squared_loss"),只不过SGDRegressor实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现了SAG)

    1. sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)

      1. 具有l2正则化的线性回归,可以进行交叉验证
      2. coef_:回归系数
      class _BaseRidgeCV(LinearModel):
        def __init__(self, alphas=(0.1, 1.0, 10.0),
      fit_intercept=True, normalize=False,scoring=None,
      cv=None, gcv_mode=None,
      store_cv_values=False):
观察正则化程度的变化,对结果的影响
  1. 正则化力度越大,权重系数会越小
  2. 正则化力度越小,权重系数会越大
波士顿房价预测
  1. 代码

    def linear_model3():
       """
    线性回归:岭回归
    :return:
    """
    # 1.获取数据
    data = load_boston()
    # 2.数据集划分
    x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)
    # 3.特征工程-标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)
    # 4.机器学习-线性回归(岭回归)
    estimator = Ridge(alpha=1)
    # estimator = RidgeCV(alphas=(0.1, 1, 10))
    estimator.fit(x_train, y_train)
    # 5.模型评估
    # 5.1 获取系数等值
    y_predict = estimator.predict(x_test)
    print("预测值为:\n", y_predict)
    print("模型中的系数为:\n", estimator.coef_)
    print("模型中的偏置为:\n", estimator.intercept_)
    # 5.2 评价
    # 均方误差
    error = mean_squared_error(y_test, y_predict)
    print("误差为:\n", error)

模型的保存和加载

sklearn模型的保存和加载API
  1. from sklearn.externals import joblib
    1. 保存:joblib.dump(estimator, 'test.pkl')
    2. 加载:estimator = joblib.load('test.pkl')
线性回归的模型保存加载案例
  1. 代码

    def load_dump_demo():
       """
    线性回归:岭回归
    :return:
    """
    # 1.获取数据
    data = load_boston()
    # 2.数据集划分
    x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)
    # 3.特征工程-标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)
    # 4.机器学习-线性回归(岭回归)
    # # 4.1 模型训练
    # estimator = Ridge(alpha=1)
    # estimator.fit(x_train, y_train)
    #
    # # 4.2 模型保存
    # joblib.dump(estimator, "./data/test.pkl")
    # 4.3 模型加载
    estimator = joblib.load("./data/test.pkl")
    # 5.模型评估
    # 5.1 获取系数等值
    y_predict = estimator.predict(x_test)
    print("预测值为:\n", y_predict)
    print("模型中的系数为:\n", estimator.coef_)
    print("模型中的偏置为:\n", estimator.intercept_)
    # 5.2 评价
    # 均方误差
    error = mean_squared_error(y_test, y_predict)
    print("误差为:\n", error)
posted on 2021-04-12 22:33  Darren_la  阅读(176)  评论(0)    收藏  举报