3.1 回归分析
3.1.1 回归分析概述
1.回归分析的定义
回归分析方法是在众多的相关变量中,根据实际问题考察其中一个或多个变量(因变量)与其余变量(自变量)的依赖关系。如果只需考察一个变量与其余多个变量之间的相互依赖关系,我们称为多元回归问题。若要同时考察多个因变量与多个自变量之间的相互依赖关系,我们称为多因变量的多元回归问题。本小节重点讨论多元回归。
2.回归分析的数学模型
3.回归分析的基本计算方法
这里概述回归分析的基本计算方法,关于大数据的回归算法在11.2节中讨论。回归分析的主要目的是估算回归系数β的值。最常用的方法采取最小二乘估计法OLS。
4.回归分析的模型检验
回归分析的模型检验用于检验模型的可用性,模型检验的过程可以分为三个步骤,即分析模型拟合优度、分析模型是否能用于预测未知值和分析模型的解释变量成员显著性检验。
5.回归分析的实例
我们用一个例子说明回归分析的使用。
私立医院一年的营业额总和与股东投资额总和的大小有密切关系,研究发现两个变量之间存在线性关系。下面我们模拟了某市内所有私立医院2000—2013年的营业额与股东投资额数据,研究它们的数量规律性,探讨某市内私立医院的股东投资额与一年营业额的数量关系,原始数据见表3-1。
对其进行回归分析,具体输出表3-2所示的数据。
由输出结果,得到以下结论:
回归方程为
3.1.2 回归模型的拓展
上一小节主要讨论了线性回归模型,根据需求的不同,回归有不同的形式和方法。本小节简要介绍多种形式的回归。
1.多项式回归
假设变量y与x的关系为p次多项式,且在xi处对y的随机误差εi(i=1,2,…,n)服从正态分布N(0,σ),则
yi=β0+β1xi+β2xi2+…+βpxip+εi
令xi1=xi,xi2=xi2,…,xip=xip,则上述非线性的多项式模型就转化为多元线性模型,即
yi=β0+β1xi1+β2xi2+…+βpxip+εi
这样我们就可以用前面介绍的多元线性回归分析的方法来解决上述问题了。其系数矩阵、结构矩阵、常数项矩阵分别为
A=X'X=
X=
B=X'Y=
回归方程系数的最小二乘估计为
b=A-1B=(XTX)-1X'Y
需要说明的是,在多项式回归分析中,检验bj是否显著,实质上就是判断x的j次项xj对y是否有显著影响。
对于多元多项式回归问题,也可以化为多元线性回归问题来解决。例如,对于
yi=β0+β1Zi1+β2Zi2+β3Zi22+β4Zi1Zi2+β5Zi22+…+εi
令xi1=Zi1,xi2=Zi2,xi3=Zi12,xi4=Zi1Zi2,xi5=Zi22,则转化为yi=β0+β1xi1+β2xi2+…+βpxip+εi,转化后就可以按照多元线性回归分析的方法解决了。
- GBDT回归
梯度提升决策树(GBDT)又叫多重累计回归树(MART),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它在被提出之初就和SVM一起被认为是泛化能力较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。GBDT主要由三个概念组成,即回归树、梯度提升和收缩。下面依次介绍这三个概念。
(1)回归树
回归树是一类特殊的决策树,和用于分类的决策树不同,回归树用于预测实际数值,其核心在于累加所有树的结果作为最终结果。有关分类的决策树将会在4.3.3节介绍,这里重点介绍回归问题。
用一个例子来说明回归树。以对人的年龄预测为例来说明,每个实例都是一个已知年龄的人,而属性则包括这个人每天看书的时间、上网的时段、网购所花的金额等。回归树为了做预测,将特征空间划分成了若干个区域,在每个区域里进行预测。
作为对比,先简单介绍一下分类树,分类树在每次分支时,是以纯度度量,比如熵值来选择分类属性。满足一定的条件会被标记成叶子节点并给予标号(这在4.3.3节还会有更详细清晰的介绍)。
回归树总体流程也类似,不过在每个节点(不一定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分支时穷举每一个属性的每个阈值寻找最好的分割点,但衡量最好的标准不再是熵之类的纯度度量,而是最小化均方差。这很好理解,被预测出错的人数越多,错得越离谱,均方差就越大,通过最小化均方差能够找到最合适的分支依据。直到每个叶子节点上人的年龄都唯一或者达到预设的终止条件,才停止分支操作。若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄作为该叶子节点的预测年龄。
(2)梯度提升
提升(boosting)是一种机器学习技术,用于回归和分类问题,产生一个预测模型的集合。梯度提升简单来说,就是通过迭代多棵树来共同决策,并可以进行任意可微损失函数的优化。
GBDT是把所有树的结论累加起来做最终结论的,所以每棵树的结论并不是最终结果,而是一个累加量。其核心在于,每一棵树学的是之前所有树的结论和的残差,这个残差就是一个加上预测值后能得真实值的累加量。
例如,A的真实年龄是18岁,但第一棵树的预测年龄是10岁,差了8岁,即残差为8岁。那么在第二棵树中我们把A的年龄设为8岁去学习,如果第二棵树真的能把A分到8岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是6岁,则A仍然存在2岁的残差,第三棵树中A的年龄就变成2岁,继续学。这就是梯度提升在GBDT中的意义。
形式化地来说,回归树也相当于一个映射,即根据输入x来求得输出y,表达式为
其中,Rj表示一个区域,如果x属于Rj,那么它的预测值就是bj。I()为指示函数,当括号内的式子成立时返回1,否则返回0。
第m棵回归树可以表示为如下数学形式
假设共有M棵回归树,那么最终的预测结果为
表达成递归形式则为
3.1.3 回归的阿里云实现
本节将通过一个例子介绍利用阿里云平台建立回归模型的方法。
很多农民因为缺乏资金,在每年耕种前会向相关机构申请贷款来购买种地需要的物资,等丰收之后偿还。农业贷款发放问题是一个典型的数据分析问题。贷款发放人通过往年的数据,包括贷款人的年收入、种植的作物种类、历史借贷信息等特征来构建经验模型,通过这个模型来预测受贷人的还款能力。本例借助真实的农业贷款业务场景,利用回归算法解决贷款发放业务。通过农业贷款的历史发放情况,预测给预测集的用户发放他们需要金额的贷款。
原始数据前10条见表3-4。
在阿里云平台上先进行数据预处理,然后再进行回归训练和预测。具体操作过程为:首先进入阿里云大数据开发平台中的机器学习平台,选择相应的工作组后进入算法平台。在左侧右击“实验”标签,新建一个空白实验,在“新建实验”对话框中输入对应的实验名称(regression),在组件中选择相应的组件,并将其拖动到右侧实验中。设计好流程,运行开始后,阿里云平台开始运行各实验节点。
在本例子中,首先进行数据的预处理,处理流程如图3-1所示。
利用SQL脚本将一些字符串人为对应映射为某些数值。
SQL脚本的设置如图3-2所示。
运用数据视图可以将所选中的数据列的类型转换为double型,数据视图设置如图3-3所示(注意:此后所有阿里云实验的字段选择部分均参考此处)。
在“字段设置”中选择全部的7个字段,在“参数设置”中将“连续特征离散区间数”设为“100”。数据预处理后的内容如图3-4所示。
然后进行回归训练和预测,此处采用阿里云提供的三种算法(线性回归、GBDT回归、XGBOOST回归)分别实现。
下面分别给出三种算法的具体流程。
(1)线性回归
线性回归的流程如图3-5所示。
其中用训练集来预测得到的预测-2是为了和预测-1进行比对,用于调整训练参数,防止过度拟合与过度偏差,以使得到的回归模型尽可能最佳。原理是利用机器学习学习曲线(learning curve)的原理,由于阿里云本身没有提供对的训练过程的可视化的组件,所以只能使用此法来判断训练结果的差错是过度拟合还是过度偏差造成的。
全表统计组件用于审视数据预处理后的整体情况,不是必要组件。
线性回归组件的设置如下:添加6个字段,其中double类型的字段有farmsize、rainfall、landquality和farmincome,bigint类型的字段有region_num和claimtype_num。“选择标签列”设为“claimvalue”,“最大迭代轮数”设为“100”,“最小似然误差”设为“0.000001”,“正则化类型”设为“None”,“正则系数”设为“1”。
预测组件设置如下:选择double类型的字段claimvalue。“输出结果名”设为“prediction_result”,“输出分数列名”设为“prediction_score”,“输出详细列名”设为“prediction_detail”。
回归模型评估的参数设置如下:“原回归值”设为“claimvalue”,“预测回归值”设为“prediction_score”。
训练后的预测结果如图3-6所示。
模型评估残差直方图如图3-7所示。回归评估指标数据结果如图3-8所示。
(2)GBDT回归
GBDT回归的流程如图3-9所示。
和前文中线性回归一样,用训练集来预测得到的预测-2是为了和预测-1进行比对,用于调整训练参数,防止过度拟合与过度偏差,以使得到的回归模型尽可能最佳。
全表统计组件用于审视数据预处理后的整体情况,不是必要组件。
GBDT回归组件参数设置如下:选择6个字段,其中double类型的字段有farmsize、rainfall和landquality,bigint类型的字段有region_num和claimtype_num。“标签列”设为“claimvalue”。“一棵树的最大深度”设为“10”,“叶子节点容纳的最少样本数”设为“20”,“样本采样比例”设为“0.8”,“训练中采集的特征比例”设为“0.8”,“测试样本数比例”设为“0.2”,“随机数产生器种子”设为“0”,“是否使用newton方法来学习”设为“使用”,“损失函数类型”设为“regression loss”,“gbrank与regression loss中的指数底数”设为“1”,“metric类型”设为“NDCG”,“树数量”设为“44”,“学习速率”设为“0.05”,“最大叶子数”设为“32”。
预测组件设置、输出结果的字段设置、模型评估的参数设置都与用线性回归实现的设置相同。训练后的预测结果如图3-10所示。
模型评估结果如图3-11和图3-12所示。
(3)XGBOOST回归
XGBOOST回归的流程如图3-13所示。
XGBOOST组件的字段选择和设置与线性回归实现完全相同,在“参数设置”中的设置如下:“一棵树的最大深度”设为“3”,“更新过程中使用的收缩步长”设为“0.3”,“最小损失衰减”设为“0”,“树的棵树”设为“7”,“子节点中的最小的样本权值和”设为“1”,“每个树所允许的最大delta步进”设为“0”,“训练的子样本占整个样本集合比例”设为“1”,“在建立树时对特征采样的比例”为“1”,“目标函数”设为“reg_linear”,“初始预测值”设为“0.5”,“随机数的种子”设为“0”。
预测组件设置、输出结果的字段设置、模型评估的参数设置都与用线性回归实现的设置相同。训练后的预测结果如图3-14所示。
模型评估结果如图3-15和图3-16所示。
综合上述三种方法的模型评估结果看出:对于该例子中的数据,XGBOOST回归的效果是最好的。