我们将探究的第一组机器学习技术通常被称为回归(regression),我们可以将回归理解为一个变量(例如销售额)的变化是如何影响到其他变量(如用户数)的。对于机器学习技术来说,这是一个很好的开端,它们是构成其他更加复杂技术的基础。
机器学习中的回归技术通常会注重评估连续值(如股票价格、温度或疾病进展等)。下一章讨论的归类(Classification)则会注重离散值,或离散的类集合(如欺诈/非欺诈、坐下/起立/跑动,或热狗/非热狗等)。正如上面提到的,回归技术会贯彻到机器学习中,并作为归类算法的一部分,但本章中,我们将会注重其基本的应用--预测连续值。
正如前面提到的,回归本身是一个分析一个变量和另一个变量之间关系的过程,但在机器学习中还用到了一些术语来描述这些变量以及各种类型的回归和与回归有关的过程:
部分术语会在回归上下文和本书的其他上下文中使用。
线性回归是最简单的机器学习模型之一,但不能出于某些原因而忽略该模型。正如前面提到的,它是其他模型的基础,且有一些非常重要的优势。
正如在本书中讨论的,完整性在机器学习应用中非常重要,模型越简单,解释性越强,则越容易维护其完整性。此外,如果模型简单且具有解释性,那么就可以帮助理解变量之间的推断关系,并简化开发过程中的检查工作。
未来是算法,可解释模型在人类和智能机器之间建立了一种更安全、更高效、最终更具协作性的关系。
在线性回归中,我们会尝试使用如下线性方程,使用一个自变量x,对因变量y进行建模:
`$y = mx + b
$`
这里,m为直线的斜率,b为截距。例如,我们想要通过每天访问网站的users对sales进行建模,为了使用线性回归,我们会希望通过确定m和b来让预测公司的销售额:
`$sales = m * (number~of~users) + b
$`
这样,我们的训练模型就是该参数化函数。通过输入Number of Users 来预测 sales,如下:
线性回归的训练或拟合需要确定m和b的值,这样得出的公式就有预测响应的能力。有多种方式来确定m和b,但最常见的是普通最小二乘法(ordinary least squares (OLS))。
为了使用OLS来确定m和b,首先为m和b选择一个值来创建第一条示例线(example line)。然后测量每个已知点(如训练集)和示例线之间的垂直距离,这些距离称为误差(errors)或残差(residuals)。下图展示了评估和验证:
下面,我们计算这些误差平方和:
`$\frac{error^2_1+error^2_2+...+error^2_N}{N}
$`
通过调整m和b来最小化误差的平方和。换句话说,我们训练的线性回归直线是平方和最小的直线。
有很多种方式可以找出误差平方和最小的直线,如通过OLS可以找出并分析这条直线。但最常用的减少误差平方和的优化技术称为梯度下降法(gradient descent)。相比于分析法,这种方法更容易实现,且便于计算(如内存),也更加灵活。
可以说,线性回归和其他回归的实现都利用梯度下降来拟合或训练线性回归线。实际上,梯度下降法在机器学习中无处不在,由此可以产生更加复杂的模型技术,如深度学习。
梯度下降法
梯度下降法有很多变种,且在机器学习世界中无处不在。最重要的是,它们用于确定线性或逻辑回归等算法的最佳系数,同时也在更复杂的技术中发挥着重要作用(至少部分基于线性/逻辑回归(如神经网络))。
梯度下降法的一般思想是确定某些参数的变化方向和幅度,这些参数将使预测曲线朝着正确的方向移动,以优化某些度量(如误差)。想象站在某个地方,如果要向较低的位置移动,则需要朝向下的方向移动。这基本上就是梯度下降算法在优化参数时所做的事情。
让我们看一下所谓的随机梯度下降(SGD),这是一种增量的梯度下降,从而对这个过程有更多直觉上的了解。我们在第5章"分类"的逻辑回归实现中使用了SGD。在该示例中,我们实现了对逻辑回归参数的训练或拟合,如下所示:
// Iteratively optimize the weights注释下面的循环实现了通过SGD来优化逻辑回归参数。下面选择这部分循环来看下到底发生了什么。
首先,我们使用当前权重和预测值与理想值(即实际观察值)之间的差值来计算模型的输出:
根据SGD,我们将根据如下公式来计算参数(在本例中为权weights)的更新:
`$update=leaning~rate\times~gradient~of~the~parameters
$`
gradient是cost函数的数学梯度。
然后将该更新应用到参数,如下所示:
`$parameter=parameters-update
$`
在我们的逻辑回归模型中,计算结果如下:
机器学习中广泛使用了这种类型的SGD,但在某些场景下,这种梯度下降法可能导致过拟合或陷入局部最小值/最大值(而不是寻找全局最优值)。
为了解决这些问题,可以使用一个梯度下降的变种,称为批量梯度下降(batch gradient descent)。在批量梯度下降中,可以基于所有训练数据集中的梯度来计算每个参数更新,而不针对数据集的特定观测值或行。这种方式有助于防止过度拟合,但它也可能很慢,并且存在内存问题,因为需要计算每个参数相对于整个数据集的梯度。微批量梯度下降(Mini-batch gradient descent)是另一个变种,它在试图保持批量梯度下降的某些好处的同时,更易于计算。在微批量梯度下降法中,梯度是在训练数据集的子集上计算的,而不是在整个训练数据集上计算的。
与所有机器学习模型一样,线性回归并不能适用于所有场景,它的前提是假设你的数据之间的关系是确定的:
从技术上讲,为了使用线性回归,需要满足上述所有假设。但最重要的是我们需要知道数据是如何分布的,以及它们是如何表现的。后续在使用线性回归的示例中会深入讨论这些假设。
作为一个数据科学家或分析师,在使用线性回归时需要注意到线性回归的不足:
该数据集包括一系列表示广告媒体属性(TV,Radio和Newspaper)以及对应的销售额(Sales),本例中我们的目标是对销售额(因变量)和广告支出(因变量)进行模型。
为了构建模型(或流程),并确保能够对模型的结果进行检查,首先需要对数据进行分析(所有机器学习模型的第一个步骤)。我们需要了解变量是如何分布的,以及变量的范围和可变性。
编译并运行后得到如下结果:
上面以表格形式打印出所有的汇总数据,包括平均值、标准偏差、最小值、最大值、25%/75%百分位和中位数(或50%百分位)。
这些值为我们提供了良好的数值参考,后续会在训练线性回归模型时将看到这些数字。但缺乏直观上的理解,为此,我们需要为每列数值创建一个直方图:
本程序会为每个直方图创建一个.png图像:
观察上图以及计算出的汇总信息,下一步考虑是否符合线性回归的假设条件。可以看到并不是所有的变量都是正态分布的(钟形的)。可以看到销售额是钟形的,而其他则不是正态的。
我们可以使用分位图(quantile-quantile (q-q) p)统计工具来确定分布与正态分布的接近程度,甚至通过统计测试来确定变量是否服从正态分布的概率。但大多数情况下,通过图表就可以得出一个大致的结论。
下一步要做出决策,但至少有一部分数据在技术上并不会拟合到我们的线性回归模型中,可以选择如下一种方式进行处理:
可能还有其他解决问题的方式,但我的建议是首先尝试第三种选项。由于可以快速地训练线性回归模型,因此该选项并不会带来多少坏处。如果最后得出满意的模型,那么就可以避免引入更多的复杂性。如果得到的模型不尽如人意,那么此时再诉诸于其他选项。
现在对我们的数据有了一些直觉上的了解,并且已经了解到数据是如何拟合线性回归模型的假设的。那么现在应该选择哪个变量作为我们的自变量来预测因变量?
如此可以创建如下散点图:
通过这些散点图,我们需要推断出哪些属性 (TV, Radio, 和/或 Newspaper)与我们的因变量(Sales)具有线性关系。是否可以在这些散点图上画一条线,以符合销售趋势和各自的属性?这种方法并不总是行得通,且对于一个特定的问题,并不一定可以将其关联到所有的属性。
上述场景中,Radio和TV与Sales呈线性关系,Newspaper可能与Sales有一定的关系,但相关性并不明显。与TV的相关性是最明显的,因此先选择TV作为线性回归模型的自变量,线性回归公式如下:
`$Sales = m~TV+b
$`
这里要注意的另一件事是,变量TV可能不是严格等方差的(在线性回归的假设中讨论过)。这一点需要注意(可能值得在项目中归档的),下面将继续探究是否可以创建具有预测能力的线性回归模型。当模型表现不佳时,需要重新审视这种假设。
为了避免过度拟合并保证模型的推广,我们需要将数据集划分为训练集和测试集即评估和验证(Evaluation and Validation)。这里我们不会聚焦某个测试集,因为只需要进行一次模型训练即可,而不会在训练和测试之间来回迭代。但如果需要多个因变量进行验证和/或需要迭代调整模型参数时,你可能希望创建一个保留集,保存到模型开发过程结束后进行验证。
上述代码会输出如下训练和测试集:
这里使用的数据并没有经过排序。但如果需要按照响应、日期或其他方式处理数据,则最好随机划分训练和测试集。如果不这么做,训练和测试集可能会包含特定范围的响应,这样响应可能会受到时间/日期等人为因素的影响。
编译执行上述代码,训练的线性回归公式会打印到标准输出:
从结果可以看到,引用的包输出的线性回归的截距为7.07,斜率为0.5。这里可以进行一些简单的检查,因为我们在散点图中看到了TV和Sales之间的相关性是上升和向右的(即正相关),这也意味着公式的斜率应该是正数。
下面需要通过评估模型的表现来查看是否可以使用自变量TV来预测Sales。为此,需要加载测试集,使用训练过的模型对每个测试例进行预测,然后计算第3章"评估和验证"中讨论的某个评估指标。
为此,我们使用平均绝对误差(Mean Absolute Error (MAE))作为评估指标,这样就可以直接对比结果和Sales,而不必太担心异常值或极端值。
编译并运行评估程序,得到如下结果:
那么如果MAE = 3.01,我们怎么知道该值是好的还是坏的?这也是为什么拥有一个良好的数据心智模型很重要的原因。我们已经计算了销售额的平均值、范围和标准差。平均销售额为14.02,标准差为5.21。这样我们的MAE小于销售额数值的标准差,约为平均值的20%,说明我们的模型具有一定的预测能力。
恭喜,我们构建了第一个具有预测能力的机器学习模型。
然后创建可视化的回归线:
编译和运行后得到如下图:
可以看到,我们训练的回归线与实际的数据趋势相匹配。
线性回归并不局限于依赖单个自变量的简单线性公式。多元线性回归与前面讨论的类似,但具有多个自变量(_x_1,_x_2等)。这种场景下的直线方程如下:
`$y=m_1x_1+m_1x_2+...+m_Nx_N+b
$`
这里x作为自变量,m作为与自变量相关的斜率,此外还有一个截距b。
多元线性回归相对比较难以可视化和思考,因为它不再是一条可以在二维中可视化的直线。而是一条在二维、三维或多维的线性曲面。但它使用了很多在一元线性回归中用过的技术。
记住以上两点,下面尝试将Sales模型从一元线性回归模型扩展到多元线性回归模型。回顾一下前面章节中的散点图,可以看到Radio似乎也与Sales呈线性关系,因此可以尝试创建一个多元线性回归模型,如下:
`$Sales=m_1TV+m_2Radio+b
$`
编译并运行,得到如下回归公式:
可以看到,回归公式增加了一个额外的自变量项。截距值也发生了变化。
可以用与一元线性回归模型类似的方式,使用Predict()方法来测试该模型:
运行该程序将为我们的新多元回归模型得出如下MAE:
新的多元回归模型提高了MAE值。现在,我们可以根据广告支出来预测Sales了。你还可以尝试将Newspaper添加到模型。
注意,模型复杂性增加的同时,也会牺牲掉简易性,并增加过拟合的风险,因此只考虑当添加的复杂性能够提升模型的表现、并带来更大的价值时。
虽然本章节主要关注线性回归,但不会仅限于使用线性方程来执行回归。你可以使用一个或多个非线性(如幂、指数或其他变换)自变量来为因变量建模。例如,我们可以通过一系列TV项来为Sales建模:
`$Sales=m_1TV+m_2TV^2+m_3TV^3+...+b
$`
注意,增加复杂性的同时也增加了过拟合的风险。
除了OLS外还有其他线性回归技术,可以帮助克服最小二乘线性回归中的一些假设和弱点。包括岭回归和套索回归(lasso regression)。这两种技术使用惩罚回归系数来减轻自变量的多重共线性和非正态性带来的影响。
编译并运行程序,得出如下回归公式:
可以看到TV和Radio的系数与最小二乘回归得到的结果类似,但略微不同。另外可以看到添加了一个Newspaper项。
可以通过创建自己的预测函数来测试岭回归公式:
然后使用该predict函数和测试数据来测试岭回归公式:
编译并运行,等到新的MAE:
注意在模型中添加Newspaper并不会提高MAE,因此在这种场景下并不适合添加Newspaper项,因为此时提高了复杂度,但并没有显著影响到模型。
添加到模型中的任何复杂性或复杂度都应该有其可衡量的理由。使用一个复杂的模型,这看起来很有趣,但同时也会让人头疼。