机器学习算法梳理(一):线性回归

机器学习算法梳理(一):线性回归

一、基本概念

  1. 监督学习与无监督学习

    监督学习(supervised learning):从有标记的训练数据中推导出预测函数。有标记的训练数据是指每个训练实例都包括输入和期望的输出。即给定数据,预测标签。分类和回归是监督学习的两大重要问题。

    非监督学习(unsupervised learning):从无标记的训练数据中推断结论。最典型的无监督学习就是聚类分析,它可以在探索性数据分析阶段用于发现隐藏的模式或者对数据进行分组。即给定数据,寻找隐藏的结构。

  2. 泛化能力
    监督学习的目的是找到一个输入输出映射(模型),使得这个模型不仅对训练数据有很好的拟合能力,对于未知数据,它也有很好的预测能力。这种对未知数据的预测能力就是泛化能力(generalization ability)。在实际情况中,我们通常通过测试误差来评价学习方法的泛化能力。

  3. 过拟合和欠拟合
    在模型的拟合中,会发生过拟合(overfitting)和欠拟合(underfitting)的情况。
    如果一味追求提高对训练数据的预测能力,所选模型的复杂度则往往会比真模型要高,产生
    过拟合
    的现象,以致于对训练数据预测得很好,但对未知数据预测很差。

    过拟合的解决方法:
    1、增大训练数据量
    2、增加正则化项,正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大
    3、dropout方法,在神经网络中较常用

    欠拟合则是模型没有很好地捕捉到数据特征,不能较好的拟合数据。

    欠拟合的解读办法
    1、添加其他特征项
    2、添加多项式特征
    3、减少正则化参数

    模型的Error = Bias(偏差) + Variance(方差 ),Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。

  4. 交叉验证
    在进行模型选择时,一般随机将原始数据(dataset)进行分组,一般分为三部分,训练集(training set),验证集(validation set)和测试集(test set),训练集用来训练模型,验证集用于魔心的选择,而测试集用于最终对学习方法的评估。
    但是,如果样本数据不充足,则可以采用交叉验证方法,基本想法是重复使用数据;把给定的数据进行切分,再组合为训练集和测试集,在此基础上反复训练,测试以及模型选择。

    1) 简单交叉验证(Hold-Out Method)
    将原始数据分为两组,一组是训练集,一组是验证集,利用训练集来训练分类器,然后利用验证集验证模型。进行多次划分,用均值来表示效能。
    优点:简单,只需要将原始数据随机的分成两组就行了。
    缺点:
    (1)没有达到交叉的效果。
    (2)随机分组,验证集分类的准确率与原始数据分组的关系很大。
    (3)有些数据可能从未做过训练或测试数据;而有些数据不止一次选为训练或测试数据。

    2) K折交叉验证(K-fold Cross Validation)
    将原始数据均分成K组,每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终验证集的分类准确率的平均数作为此K-CV分类器下的性能指标。K的取值一般是大于等于2,只有在原始数据集合数据量小的时候才会取2
    优点:有效的避免过拟合和欠拟合

    3)留一交叉验证(Leave-one-out Cross Validation)
    K折交叉验证的特殊情况是K=N,N为给定数据集的容量,这时称为留一交叉验证,往往在数据缺乏的情况下使用。
    优点:
    (1)每轮中几乎所有的样本都可以用于训练模型,因此能够使训练的模型最接近样本真实分布,评估的结果很可靠。
    (2)实验的过程中没有随机因素。
    缺点: 如果样本量很大,那么需要建立的模型的数量也很大,计算成本高。

二、线性回归原理

在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合(自变量都是一次方)。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。简而言之,线性回归的目标是用预测结果尽可能地拟合目标label。

定义线性回归函数(linear regression)为:

h ( x ) = i = 0 n θ i x i = θ T x h(x)=\sum_{i=0}^n \theta_ix_i=\theta^\mathrm{T}x

h ( x ) h(x) 来预测 y y ,此时 x x 为输入数据的特征矩阵, y y 为对应数据的label

三、线性回归的损失函数

线性回归模型使用的是一种称为平方损失(又称为 L2 损失)的损失函数

线性回归优化的目标——图中线段距离(平方)的平均值,也就是最小化到分割面的距离和。

在这里插入图片描述

损失函数一般定义为
J ( θ ) = 1 2 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) 2 J(\theta)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2

四、优化方法

定义了损失函数以后,求解损失函数最小值的过程,我们叫优化。常用的算法如下:

梯度下降法 Gradient Descent
梯度下降算法是一种求局部最优解的方法,梯度下降法基于的思想为:要找到某函数的极小值,则沿着该函数的梯度方向寻找。若函数为凸函数且约束为凸集,则找到的极小值点则为最小值点。

梯度下降基本算法为:

  1. 首先用随机值填充 θ \theta (这被称为随机初始化),或者让 θ \theta 为一个全零向量
  2. 逐渐改进 θ \theta 的值,每次步进一步(步长α),每一步都试图降低代价函数,直到算法收敛到最小。

梯度减少的方向,则是用损失函数 J ( θ ) J(\theta) θ \theta 求偏导:
θ j : = θ j α J ( θ ) θ j \theta_j:=\theta_j-\alpha\frac{\partial{J(\theta)}}{\partial\theta_j}

只有一个训练数据时:
11
因为梯度下降法通常分为三种形式,整体批次梯度下降法,随机梯度下降法和批量梯度下降法.

  • 批量梯度下降法(Batch Gradient Descent)
    批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新。
  • 随机梯度下降法(Stochastic Gradient Descent)
    随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的样本的数据,而是仅仅选取一个样本来求梯度。
    随机梯度下降法,和批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。自然各自的优缺点都非常突出。对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。
  • 小批量梯度下降法(Mini-batch Gradient Descent)
    小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于 m 个样本,我们采用 x 个样子来迭代, 1<x<m 。一般可以取 x=16,32,64… ,当然根据样本的数据,可以调整这个 x 的值。

正规方程 Normal Equations

求解线性回归最常用的两个方法是:梯度下降法和最小二乘法,由于最小二乘法是基于正规方程的,所以也被称为正规方程法。特征方程得到的是解析解,无需迭代,也没有设置学习速率的繁琐,需要特征归一化,但是求解正规方程需要求矩阵的逆,然而不是所有的矩阵都可逆,而且有些可逆矩阵的求逆极其耗费时间,所以特征方程法看似简单,其实使用场景并不多。只有当特征值比较小的时候,可以考虑使用特征方程法。

记住公式: θ = ( X T X ) 1 X T y \theta=(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}y

牛顿法

从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

五、线性回归的评估指标

解释方差(Explained variance score):
E x p l a i n e d _ v a r i a n c e ( y , y ^ ) = 1 V a r { y y ^ } V a r { y } Explained\_variance(y,\hat{y})=1-\frac{Var\{y-\hat{y}\}}{Var\{y\}}
绝对平均误差(Mean absolute error):
M A E ( y , y ^ ) = 1 n i = 0 n y i y ^ MAE(y,\hat{y})=\frac{1}{n}\sum_{i=0}^n|y_i-\hat{y}|
均方误差(Mean squared error):
M S E ( y , y ^ ) = 1 n i = 0 n ( y i y ^ ) 2 MSE(y,\hat{y})=\frac{1}{n}\sum_{i=0}^n(y_i-\hat{y})^2
决定系数( R 2 R^2 score):
R 2 ( y , y ^ ) = 1 i = 0 n ( y i y ^ ) 2 i = 0 n ( y i y ) 2 R^2(y,\hat{y})=1-\frac{\sum_{i=0}^n(y_i-\hat{y})^2}{\sum_{i=0}^n(y_i-\overline{y})^2}

python代码部分如下所示:

// sklearn.metrics
from sklearn.metrics import explained_variance_score
explained_variance_score(y_true,y_pred)

from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_true,y_pred)

from sklearn.metrics import mean_squared_error
mean_squared_error(y_true,y_pred)

from sklearn.metrics import r2_score
r2_score(y_true,y_pred)

六、sklearn参数详解

linearRegression(fit_intercept=True,nomalize=False,copy_X=True,n_jobs=None)
  • fit_intercept: 默认为True,是否计算该模型的截距。如果使用中心化的数据,可以考虑设置为False,不考虑截距。注意这里是考虑,一般还是要考虑截距
  • normalize: 默认为false. 当fit_intercept设置为false的时候,这个参数会被自动忽略。如果为True,回归器会标准化输入参数:减去平均值,并且除以相应的二范数。一般将标准化的工作放在训练模型之前,通过设置sklearn.preprocessing.StandardScaler来实现,而在此处设置为false
  • copy_X: 默认为True, 否则X会被改写
  • n_jobs: 线程数,int 默认为1. 当-1时默认使用全部处理器

Reference

【1】https://blog.csdn.net/Haiyang_Duan/article/details/79206904
【2】https://blog.csdn.net/Dinosoft/article/details/34960693
【3】https://zhuanlan.zhihu.com/p/37524275
【4】https://blog.csdn.net/wsp_1138886114/article/details/80473440

猜你喜欢

转载自blog.csdn.net/weixin_43831209/article/details/85774622