线性回归笔记总结
1. 机器学习眼中的线性回归
左图是原始建模数据,目的是用来寻找玩偶数量和成本的某种关系。右图将数据可视化得到散点图。
第一步 进行场景确定
第二步 定义损失函数
建模的目的:模型预测值与真实值之间的差距越小越好。下面有两种定义损失函数的方法。带“帽子”的变量代表预测值。不带的表示观测值。
由于以上两点原因,所以采用右边的函数作为损失函数。
实际上使用左面的函数定义损失函数也能得到一个线性模型,只是并不是我们常说的线性回归模型而已。
所以:损失函数是机器学习模型的核心。(即使相同的模型形式,不同的损失函数对应着不同模型的效果)。
如果把模型看成是人工智能,那么损失函数就是它的三观。
题外话:
由于模型的损失函数是由人定义的,那么从伦理的角度来讲,不能再将“技术无罪”作为作恶的借口和理由,特别是在模型日益成为我们生活主宰的今天。
第三步 特征提取
原始数据比较干净,所以并不需要进行数据清洗。在本题中玩偶个数可以作为特征直接使用。
第四步 确定模型形式和参数估计
第五步 评估模型效果
对于回归问题,常用的模型评估指标有两个:
- 均方差(MSE):预测值与真实值的平均差距。L指的是上面定义的损失函数。
- 决定系数(R2):数据变化被模型解释的比例。
第一个公式为成本变化幅度。即真实值与真实值平均值之间的差值的平方和。
第二个公式是未被模型所解释的变化幅度。即真实值与预测值之间的差值的平方和。从建模的角度来讲,我们希望该公式得到的值越小越好。
所以,决定系数的公式如下:结果越接近于1,模型的预测效果越好。
2. 统计眼中的线性回归
2.1 模型的假设
在机器学习的角度,我们并不太关心 x 和 y 的数学关系是怎么样的。整个的建模过程是机械化的。我们只是关心能用什么样的公式能让从 x 出发的预测值与真实值 y 之间的关系最小的可以了。
站在统计学的角度出发,我们试图弄清楚变量 y 与 x 之间的数学关系。
比如 04/01 和 04/02 两天的玩偶个数都是10,但前者成本为7.7,后者成本为9.87.这说明变量 y 似乎带有某种随机性。并且在散点图中,我们同样得到 x 与 y 似乎存在某种线性关系。
在上面公式的基础上,进一步假设。其中假设的 第二点 和 第三点 可能与现实情况冲突。
根据这三个假设我们可以进一步来分析为什么会存在 x 相同而 y 不同的情况。
首先假设模型的 a, b, σ(假设1:随机扰动项服从的正态分布的方差)是已知的。这时候我们可以看到 y 是由 ax + b + 随机值 构成,那么就说明 y 本身就是一个随机值。而且也可以很清楚的证明 yi 是服从 期望为 10a+b 方差为 σ2 的正态分布。所以,有 相同的玩偶个数,不同的成本 这种情况出现正是因为 成本分别是同一正态分布的两次独立观测值。
所以,在统计学的眼里,我们得到的变量值其实是一个随机变量的观测值,它并不是一个确定的值。因此,统计学希望通过这样一个随机变量的观测值去挖掘真实的值是多少。
2.2 参数估计公式(最大似然估计法 Maximum Likelihood Estimation, MLE)
根据上面的模型假设,可以得到:
由于 y 是随机变量,就可以定义参数的似然函数(Likelihood function):
这里的似然函数 L 其实就是 y 的联合条件概率。并且 yi 是相互独立的,那么就可以将似然函数 L 改写成每一点概率的乘积的形式。这一点可以极大地方便后面的数学处理。
既然 y 是随机变量,那么模型参数估计的原则就是 y出现的概率达到最大。
这就是所谓的 最大似然估计法(Maximum Likelihood Estimation, MLE)。
2.3 最大似然估计法与机器学习模型参数估计公式的关系
在机器学习中,首先定义了损失函数,也就是模型真实值与预测值之间的差距。
在机器学习中,参数估计的原则就是使 损失函数达到最小值。
而在统计学中,我们从 y 是随机变量这一点出发,参数估计的原则就是使 y出现的概率达到最大。
将统计学中的最大似然估计法翻译成公式:
由于 L 这里是乘积的形式:
那么为了数学上好处理,引入自然对数函数,也就是以 e为底(2.71828...)的对数函数。对于它有以下性质:
同时,我们也注意到自然对数函数本身是一个增函数,也就是说 L 达到最大值的时候 ln(L) 也达到最大值,因此可以把寻找参数 a, b 的公式改写为:
从之前已经证明 yi 服从正态分布,因此将 lnL 展开,得到如下的式子:
我们可以注意到 前面(一个红线)是一个固定的值,后面(两个红线)才是变量。如果我们想要 lnL 达到最大值,那么我们就要后面的变量达到最小值。所以最终的参数估计公式也就变成了:
这就与前面机器学习里面的 线性回归模型(最小二乘法OLS)的参数估计公式相同。
在之前机器学习的讨论中,我们知道 只要定义一种不同的损失函数,就有一种新的线性回归模型。那么为什么我们通常使用的就是 最小二乘法(OLS)线性回归模型呢?
就是因为它使用的损失函数背后有极为强大的数学基础。
由于 最大似然估计法 与 OLS线性回归模型 的参数估计公式是相同的,所以它们得到的结果是一样的。
2.4 置信区间
根据 2.3 的讨论,我们有了模型参数估计值的公式:
根据模型参数估计公式,可以得到参数 a, b 的估计值。但是,使用不同数据训练模型的时候,会得到不同的参数估计值。(这里的不同的数据,指的是符合同一规律的数据)。
例如:我们采用 04/01,04/02,04/03 和 04/04,04/05,04/06 日期的数据分别训练模型可得到两个估计值,而且这两个值是不相同的:
这是因为 模型参数的估计值只是一个随机变量,具体数值依赖于使用的数据。而且数学上可以证明,参数估计值本身是随机变量,并且服从正态分布。
数学上的证明较为繁琐,所以这里就采用一个实证的例子:
既然得到的估计值只是随机变量的一次观测值,那么我们更关心这个估计值离真实值有多远?
在统计学里,解决方案就是 定义参数真实值的置信区间。
在上面的证明,我们可以得知估计值服从以真实值为期望的正态分布。参数的真实值就是 a 。我们假设这个正态分布的方差为σ2,那么大部分估计值就会落在以 真实值a 为中心,2倍 σ 为半径的区间里面。
将其翻译为数学公式,即为:
因此,可以定义参数 a 的 95% 的置信区间:
所以,95%的置信区间表示:
重复100次的模型训练,并按公式得到置信区间,那么有95次,参数 a 的真实值将落在这个区间里。
也可以 “通俗地” 理解为参数 a 的大概取值范围。
后面一句话其实不太严谨,因为一开始 假设 参数 a 的真实值是一个确定的值,但是现在又说大概的范围,这又将参数 a 作为一个随机值进行处理,这前后是矛盾的。不过,依然可以这样通俗的进行理解。
置信区间就是控制模型结果随机性的一个工具。也就是说我们得到的参数的估计值其实是一个随机变量。它并不等于真实值,但是我们可以用置信区间去控制这个真实值大概所在的区间范围是多少。
2.5 假设检验
除了置信区间外,还可以使用假设检验来得到更有把握的结果。
具体来说,我们刚刚得到了 a 的估计值,但是我们不知道 a 的真实值是多少。那么我们可以做一个假设,比如我们假设 a = 0 。那么根据这个假设,以及 a 的估计值服从正态分布,那么我们可以得到在 a = 0 的情况下,也就是在这个假设成立的条件下,估计值大致分布的区间也就是 0-2σ 到 0+2σ。
这时,我们得到模型估计值是 0.98 。它没有落在大致分布的区间内,这是概率很小的事情。那么在这个情况下,我们就可以拒绝之前的假设 a = 0。 因为在这个假设成立的条件下,几乎不可能的事情发生了。
换个角度来看,使用刚刚定义的置信区间,我们得到 0 并没有在置信区间内,根据这个我们也可以拒绝 a = 0 这样的一个假设。
总结一下:
1. 对于单个参数的假设检验与置信区间比较类似,二者相通。
2. 也可以对多个参数做组合的假设检验。
3. 模型陷阱(过拟合与模型幻觉)
3.1 模型陷阱概述
在现实生活中,搭建模型主要有两种用途。
1. 正向运用:对未知情况做预测。(也就是知道 x1, x2, x3.....对 y 值进行预测)
要求准确度很高,得到的 y 越接近真实值越好。
易受到过度拟合干扰。
2. 反向运用:解释数据之间的联动效应。(也就是目标值 y 与什么变量有关)
数据驱动的本质。不是特别关心模型的准确性,而是关心模型的可靠性。
易受到模型幻觉干扰。(也就是误以为某个 x 与最终值 y 是有关系的)
过度拟合 和 模型幻觉 统称为 模型陷阱。
3.2 过度拟合
同样以 y=x 为真实的模型结果为例。随着模型更加复杂,均方差和决定系数确实是向更好的方向进行发展。但是实际上我们知道模型就是最简单的 y=x 线性模型。这里就是一个悖论,我们使用评估模型的指标并没有挑选出更真实的模型,这就是所谓的过度拟合。
对于过度拟合来说
1. 对于已知数据,模型越复杂 “效果越好”。
这里有一个既当运动员又当裁判员的问题。历史数据我们用来搭建模型,但也使用它来对模型的效果进行评估,这是导致这个问题的原因。
2. 模型的扩展性非常差。
如果我们使用后面三幅图的模型进行预测,那么结果是非常不准确的。
解决方法分为两类:
1. 数据层面
在现实生活中,模型的使用周期如下图
由于我们的目的是为了预测未知数据,所以我们可以把历史数据集分为两份。一份是训练集,一份是测试集。首先使用训练集估计模型的参数,然后采用测试集评估模型效果。
通过这种办法,就可以把部分历史数据当成了未知数据。
2. 模型层面
模型层面的解决方法:奥卡姆剃刀原则。
对于训练集来说,通常模型越复杂,结果的误差也就越小(如下图 蓝线)。但对于测试集来说,当模型太复杂通常会遇到 过度拟合 的现象,当模型太简单会遇到 欠拟合 的现象,这两种现象误差都会很大。
我们的目的是选择 刚刚好的模型复杂程度使得在测试集上的误差达到最小。
但在现实中,最佳选择是非常难实现的。这时候有一个很好的解决办法,就是奥卡姆剃刀原则。
Occam's Razor: 如无必要,切勿假定繁多。
这句话的意思是,如果两个模型对于未知数据的预测结果差不多的时候,应该选择更加简单的那个模型。
3.3 机器学习对于模型幻觉的解决方法(惩罚项 L1,L2范数及网格搜寻)
在现实中,控制模型复杂程度的方法主要有两种:
1. 模型本身的复杂度。(比如 线性回归 比 神经网络 更简单)。
2. 模型使用的特征,包括个数以及特征的复杂度。( x 的个数)
第二种方法实现起来更加容易,但是会引起 模型幻觉。
模型幻觉 指 不相关的特征 被加入到模型里,且被认为与预测结果有相关性。
3.3.1 惩罚项
回顾一下使用的数据,x 指的是玩偶个数,y 指的是生产成本。他们之间的关系是 y = x + 一个随机变量
这时我们引入一个不相关的变量 z,但是这里假设我们不知道它是无关的。这时的方程就变成了
y = ax + bz + c
但是其实在这个模型里参数 b 和 c的真实值都为 0 。
根据之前的讨论,可以定义 y = ax + bz + c 的损失函数。在 损失函数L 中我们希望 让真实值等于 0 的 b,c 尽可能的靠近 0 。
解决方案就是 加入惩罚项 。加入惩罚项后,a, b, c 的值越远离 0 ,损失函数 L 的值也就越大。这就使得模型的参数尽可能的靠近 0 。从另外一个角度来说,如果 b 的估计值为 0 ,这相当于在模型里没有使用变量 z 通过这种方式,自动地限制了模型的复杂程度。在理想情况下,无论参数 b 的值是多少,都不会影响原损失函数的取值,因此这样的一个公式会使 不相关的 b 和 c 靠近 0 , 而不是让 a 靠近 0 。
其中 α 被称为惩罚力度。
上面的惩罚项被称为 L1惩罚项(L1 范数),如果加入了 L1惩罚项,整个模型就被称为 Lasso回归。
下面的惩罚项被称为 L2惩罚项(L2 范数),如果加入了 L2惩罚项,整个模型就被称为 Ridge回归。
3.3.2 网格搜寻
首先,看看增加惩罚项后,模型的结果有什么变化。我们可以看出惩罚力度 α 越大,b 和 c 的估计值越靠近于 0 ,a 的值就越靠近于 1 。三者越来越靠近它的真实值。但是这不意味着 惩罚力度 α 总是越大越好。那该如何选择 惩罚力度 α 呢?
这里需要注意的是,对于 a, b, c 是有数学公式来求最优值的。但是 惩罚力度 α 是没有的。能想到的办法就只有 网格搜寻,也就是一种遍历的办法。给定一些 α 的备选值分别去训练模型。最后选择技术指标最好的 α 作为最终的 α 。
总结一下,机器学习对于模型幻觉的解决办法。这里还有一个问题,如果模型有超参数,那么测试集也出现了既当裁判员又当运动员的问题。即超参数选择和测试指标都用了测试集。这时候就将数据分成三个集合 训练集,验证集,测试集。这样就解决了这个问题。
a,b,c 是模型的参数,惩罚力度 α 是模型的超参数。
3.4 统计分析的解决方法(假设检验)
模型的式子是 y = ax + bz + c,在图片中我们可以得到 b,c的估计值都不等于0,但是根据后面的结果,我们可以得到 b,c都不显著。换句话说,并不能拒绝 b,c 的真实值等于0的假设。换个角度看,在 b,c 的95%置信区间内都包含了0,所以依然并不能拒绝 b,c 的真实值等于0的假设。所以才实际操作中,如果模型的参数不显著,就可以将其排除。因此 将变量 z 排除出模型,重新建模。参数 c 被称为截距项,是一个特殊的参数,这里并不排除。
3.5 机器学习和统计解决模型幻觉的方法比较
机器学习虽然使无关变量前面的系数尽可能接近于 0 ,但是仍未能完全排除。而统计分析可以将无关的变量完全排除出模型。但这就说明统计分析需要更多的人为干预,是否排除无关变量是一个人为的选择,随意性较大。(具体是多少的显著度是没办法量化的,比如 显著度5%还是1% 就认为不显著)。
目的在于预测,可以采用机器学习方法。目的在于分析 y 和 x 之间的关系,尽可能使用统计方法。
4. 模型的生命周期
模型的一生分为两个阶段。一是模型的训练(下图虚线以下部分),二是模型的使用(下图虚线以上部分)。
连接这两个阶段的IT工具就是模型的保存和读取。
如果训练模型和使用模型都是 Python 程序,则可以使用 pickle 来实现模型的持久化(保存和读取)。
pickle 是 Python 的一个标准模块,它可以将 Python 对象保存为文件,也可以从保存文件里还原相应的 Python 对象。
如果训练模型和使用模型分别使用两种不同的语言,则可以使用 PMML 来实现模型在不同编程语言之间的保存和读取。
PMML 是一种描述预测模型的标准,它与使用的编程语言无关。
PMML 主要记录三类信息:模型类别、模型变量、模型参数。