文章目录
一、概述
1.1 线性回归
回归是一种应用广泛的预测建模技术,这种技术的核心在于预测的结果是连续型变量。
决策树,随机森林,支持向量机的分类器等分类算法的预测标签是分类变量,多以{0,1}来表示,而无监督学习算法比如PCA,KMeans并不求解标签,注意加以区别。
回归算法源于统计学理论,它可能是机器学习算法中产生最早的算法之一,其在现实中的应用非常广泛,包括使用其他经济指标预测股票市场指数,根据喷射流的特征预测区域内的降水量,根据公司的广告花费预测总销售额,或者根据有机物质中残留的碳-14的量来估计化石的年龄等等,只要一切基于特征预测连续型变量的需求,我们都使用回归技术。
既然线性回归是源于统计分析,是结合机器学习与统计学的重要算法。通常来说,我们认为统计学注重先验,而机器学习看重结果,因此机器学习中不会提前为线性回归排除共线性等可能会影响模型的因素,反而会先建立模型以查看效果。模型确立之后,如果效果不好,我们就根据统计学的指导来排除可能影响模型的因素。我们的课程会从机器学习的角度来为大家讲解回归类算法,如果希望理解统计学角度的小伙伴们,各种统计学教材都可以满足你的需求。
回归类算法的数学相对简单。通常,理解线性回归可以有两种角度:矩阵的角度和代数的角度。几乎所有机器学习的教材都是从代数的角度来理解线性回归的。相对的,在我们的课程中一直都缺乏比较系统地使用矩阵来解读算法的角度,因此在本堂课中,我将全程使用矩阵方式(线性代数的方式)为大家展现回归大家族的面貌。
学完这堂课之后,大家需要对线性模型有个相对全面的了解,尤其是需要掌握线性模型究竟存在什么样的优点和问题,并且如何解决这些问题。
1.2 SKlearn中的线性回归
sklearn中的线性模型模块是linear_model,我们曾经在学习逻辑回归的时候提到过这个模块。linear_model包含了多种多样的类和函数,其中逻辑回归相关的类和函数在这里就不给大家列举了。
– | – |
---|---|
普通线性回归 | |
linear_model.LinearRegression | 使用普通最小二乘法的线性回归 |
岭回归 | |
linear_model.Ridge | 岭回归,一种将L2作为正则化工具的线性最小二乘回归 |
linear_model.RidgeCV | 带交叉验证的岭回归 |
linear_model.RidgeClassifier | 岭回归的分类器 |
linear_model.RidgeClassifierCV | 带交叉验证的岭回归的分类器 |
linear_model.ridge_regression | 【函数】用正态方程法求解岭回归 |
LASSO | |
linear_model.Lasso | 使用L1作为正则化工具来训练的线性回归模型 |
linear_model.LassoCV | 带交叉验证和正则化迭代路径的Lasso |
linear_model.LassoLars | 使用最小角度回归求解的Lasso |
linear_model.LassoLarsCV | 带交叉验证的使用最小角度回归求解的Lasso |
linear_model.LassoLarslC | 使用BIC或AIC进行模型选择的,使用最小角度回归求解的Lasso |
linear_model.MultiTaskLasso | 使用L1/L2混合范数作为正则化工具训练的多标签Lasso |
linear_model.MultiTaskLassoCV | 使用L1/L2混合范数作为正则化工具训练的,带交叉验证的多标签Lasso |
二、多元线性回归
2.1 多元线性回归的基本原理
线性回归是机器学习中最简单的回归算法,多元线性回归指的就是一个样本有多个特征的线性回归问题。对于一个有 n n n个特征的样本 i i i而言,它的回归结果可以写作一个大家都很熟悉的方程:
y
^
=
ω
0
+
ω
1
x
i
1
+
ω
2
x
i
2
+
.
.
.
+
ω
n
x
i
n
\hat y= \omega_0 +\omega_1x_{i1}+\omega_2x_{i2}+...+\omega_nx_{in}
y^=ω0+ω1xi1+ω2xi2+...+ωnxin
这里公式
ω
\omega
ω是模型的参数,
ω
0
\omega_0
ω0是截距项,
ω
1
\omega_1
ω1~
ω
n
\omega_n
ωn被称为回归系数。有时候用
β
\beta
β或者
θ
\theta
θ表示。这个公式跟我们的
y
=
a
x
+
b
y= ax+b
y=ax+b同样的性质。
y
y
y是我们的目标变量,也称作,标签。
x
i
1
x_{i1}
xi1~
x
i
n
x_{in}
xin是样本
i
i
i上的特征。考虑我们有
m
m
m个样本,那么我们的回归方程可以写成:
y
^
=
ω
0
+
ω
1
x
1
+
ω
2
x
2
+
.
.
.
+
ω
n
x
n
\hat y= \omega_0 +\omega_1x_{1}+\omega_2x_{2}+...+\omega_nx_{n}
y^=ω0+ω1x1+ω2x2+...+ωnxn
其中
y
^
\hat y
y^是包含了m个全部样本的回归结果的列向量。向量我们用粗体表示。上面的方程可以写成下面的矩阵形式:
简化版本: y ^ = X ω \hat y=X\omega y^=Xω
线性回归的任务,就是构造一个预测函数来映射输入的特征矩阵X和标签值g的线性关系,这个预测函数在不同的教材上写法不同: f ( x ) f(x) f(x)或 h ( x ) h(x) h(x)都有可能。但无论如何,这个预测函数的本质就是我们需要构建的模型,而构造预测函数的核心就是找出模型的参数向量。但我们怎样才能够求解出参数向量呢?
2.2 损失函数
我们学习机器学习时,我们说过我们使用训练集来训练模型,建模是追求模型在测试集上的表现最优,因此模型的评估指标往往是用来衡量模型在测试集上的表现的。在线性回归时,着基于训练数据求解参数的需求,并且希望训练出来的模型能够尽可能地拟合训练数据,即模型在训练集上的预测准确率越靠近100%越好。
因此,我们使用**"损失函数"这个评估指标,来衡量参数为w的模型拟合训练集时产生的信息损失的大小,并以此衡量参数w的优劣**。如果用一组参数建模后,模型在训练集上表现良好,那我们就说模型拟合过程中的损失很小,损失函数的值很小,这一组参数就优秀;相反,如果模型在训练集上表现很糟糕,损失函数就会很大,模型就训练不足,效果差,这一组参数也就比较差。
所以我们希望在求解参数u时,损失函数最小。这样模型在训练数据上的拟合效果就会最优。准确率也会尽可能高。所以我们求解参数的方式,就是最优化损失函数的过程。
注意:有的模型没有求解参数的需求,就没有损失函数,比如KNN,决策树。线性回归的损失函数:
线性回归的损失函数:
∑ i = 1 m ( y i − y ^ i ) 2 = ∑ i = 1 m ( y i − X i ω ) 2 \displaystyle\sum_{i=1}^{m}(y_i-\hat y_i)^2=\displaystyle\sum_{i=1}^{m}(y_i-X_i\omega)^2 i=1∑m(yi−y^i)2=i=1∑m(yi−Xiω)2
y i y_i yi是样本 i i i对应的真实标签, y ^ i \hat y_i y^i是样本 i i i在某组参数 ω \omega ω下的预测标签。
首先,这个损失函数代表了向量 y i − y ^ i y_i-\hat y_i yi−y^i的L2范式的平方结果,L2范式的本质就是欧式距离,即是两个向量上每个点对应相见后的平和和再开平方,这里我们只做了平方和,没有再开方。
所以,我们得到损失函数:L2范式,欧氏距离的平方和。
在这个平方结果下,我们的g和g分别是我们的真实标签和预测值,也就是说,这个损失函数实在计算我们的真实标签和预测值之间的距离。因此,我们认为这个损失函数衡量了我们构造的模型的预测结果和真实标签的差异,因此我们固然希望我们的预测结果和真实值差异越小越好。所以我们的求解目标就可以转化成:
min ω ∣ ∣ y − X ω ∣ ∣ 2 2 \displaystyle \min_{\omega}{||y-X\omega||_2}^2 ωmin∣∣y−Xω∣∣22
2.3 最小二乘法
现在问题转换成了求解让RSS最小化的参数向量 ω \omega ω,通过最小化真实值和预测值之间的RSS来求解参数的方法叫做最小二乘法。求解极值的第一步往往是求解一阶导数并让一阶导数等于0,最小二乘法也不能免俗。因此,我们现在残差平方和RSS上对参数向量 ω \omega ω求导。
推导过程略。
2.4 linear_model.LinearRegression
class sklearn.linear_mode1.LinearRegression(fit_intercept=True, normalize=False, copy_x=True, n_jobs=None)
参数 | 含义 |
---|---|
fit_intercept | 布尔值,可不填,默认为True。是否计算此模型的截距。如果设置为False,则不会计算截距。 |
normalize | 布尔值,可不填,默认为False,当fit_intercept设置为False时,将忽略此参数。如果为True,则特征矩阵X在进入回归之前将会被减去均值(中心化)并除以L2范式(缩放)。如果你希望进行标准化,请在fit数据之前使用preprocessing模块中的标准化专用类StandardScaler。 |
copy_x | 布尔值,可不填,默认为True如果为真,将在X.copy()上进行操作,否则的话原本的特征矩阵X可能被线性回归影响并覆盖整数或者None,可不填,默认为None。用于计算的作业数。只在多标签的回归。 |
n_jobs | 和数据量足够大的时候才生效。除非None在joblib.parallel_backend上下文中,否则None统一表示为1。如果输入-1,则表示使用全部的CPU来进行计算。 |
线性回归的类可能是我们目前为止学到的最简单的类,仅有四个参数就可以完成一个完整的算法。并且看得出,这些参数中并没有一个是必填的,更没有对我们的模型有不可替代作用的参数。这说明,线性回归的性能,往往取决于数据本身,而并非是我们的调参能力,线性回归也因此对数据有看很高的要求。幸运的是,现实中大部分连续型变量之间,都仔任看或多或少的绒性联系。所以线性回归虽然简单,却很强大。
顺便一提,sklearn中的线性回归可以处理多标签问题,只需要在fit的时候输入多维度标签就可以了。