MADlib——基于SQL的数据挖掘解决方案(11)——回归之线性回归

2019-05-25 19:35:39 浏览数 (1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1433064

一、回归方法简介

代码语言:txt复制
    事物之间的关系可以抽象为变量之间的关系。变量之间的关系可以分为两类:一类叫确定关系,也叫函数关系,其特征是:一个变量随着其它变量的确定而确定。另一类关系叫相关关系,变量之间的关系很难用一种精确的方法表示出来。例如,通常人的年龄越大血压越高,但人的年龄和血压之间没有确定的数量关系,人的年龄与血压之间的关系就是相关关系。回归方法就是处理变量之间相关关系的一种数学方法。其解决问题的大致步骤如下;
  1. 收集一组包含因变量和自变量的数据;
  2. 选定因变量和自变量之间的模型,即一个数学式子,利用数据按照一定规则(如最小二乘)计算模型中的系数;
  3. 利用统计分析方法对不同的模型进行比较,找出效果最好的模型;
  4. 判断得到的模型是否适合于这组数据;
  5. 利用模型对因变量做出预测或解释。
代码语言:txt复制
    回归在数据挖掘中是最为基础的方法,也是应用领域和应用场景最多的方法,只要是量化型问题,我们一般都会先尝试用回归方法俩研究会分析。下面给出回归的数学定义。
代码语言:txt复制
    令_D_指包含_N_个观测的数据集

。每个

对应于第i个观测的属性集,又称解释变量(explanatoryvariable)或自变量,而

对应于目标变量(targetvariable),或称因变量。回归任务的解释变量可以是离散的或连续的。

代码语言:txt复制
    回归(regression)是一个任务,它学习一个把每个属性集x映射到一个输出y的目标函数(target function)_f_。回归的目标是找到一个可以以最小误差拟合输入数据的目标函数。回归任务的误差函数(error function)可以用绝对误差和或平方误差和表示:

二、一元线性回归

1. 最小二乘法

代码语言:txt复制
    设_Y_是一个可观测的随机变量,它受到一个非随机变量因素_x_和随机误差_ε_影响。若_Y_与_x_有如下线性关系:
代码语言:txt复制
    且_ε_的均值_E_(x)=0,方差

,其中

是固定的未知参数,称为回归系数(regression coefficient),Y称为因变量,x称为自变量,则称此Yx之间的函数关系表达式为一元线性回归模型。利用最小二乘法可以得到回归模型参数

的最小二乘估计

,估计公式为:

代码语言:txt复制
    其中,

代码语言:txt复制
    于是就可以建立经验模型:

2. 分析回归误差

代码语言:txt复制
    某些数据可能包含x和y的测量误差。此外,可能存在一些混杂因素影响因变量y,但未包含在模型中。正因为如此,回归任务中的因变量y可能是非确定的,也就是说,即使提供相同属性集x,它也可能产生不同的值。
代码语言:txt复制
    我们可以使用概率方法对这类情况建模,其中y被看作一个随机变量:

测量误差和模型误差都被一个随机误差ε所吸收。通常假定数据中的随机误差出现是独立的,并且服从某种概率分布。

代码语言:txt复制
    例如,如果随机误差来自一个均值为0、方差为

的正态分布,则

这表明最小化

蕴含地假定随机误差来自一个正态分布。此外,可以证明最能最小化这类误差的常数模型

是均值,即

代码语言:txt复制
    另一种典型的误差概率模型使用拉普拉斯分布:

这表明最小化绝对误差

蕴含地假定随机误差服从拉普拉斯分布。这种情况下的最佳常量模型对应于

,y的中位数。

代码语言:txt复制
    误差平方和的定义公式为:

线性回归的目标就是找出参数(

),它们最小化误差平方和SSE。

代码语言:txt复制
    除_SSE_之外,我们还可以定义另外两种误差:

SST称为总平方和,而SSR称为回归平方和。在使用平均值估计因变量时,SST表示预测误差,而SSR代表回归模型的误差量。SSTSSESSR之间的关系为:SST = SSE SSR

3. 分析拟合的满意度

代码语言:txt复制
    对于得到的回归方程形式,通常需要进行回归效果的评价,当有几种回归结果后,还通常需要加以比较以选出较好的方程,常用的准则有:

(1) 决定系数

,其数学定义为:

称为决定系数。显然

<=1,

大表示观测值与拟合值比较靠近,也就意味着从整体上看,n个点的散布离曲线较近。因此

大的方程为好。

(2) 剩余标准差s,其数学定义为:

代码语言:txt复制
    s称为剩余标准差,可以将s看成是平均残差平方和的算术根,自然其值小的方程为好。其实上面两个准则所选方程总是一致的,因为s小必有残差平方和小,从而

必定大。不过,这两个量从两个角度给出我们定量的概念。

的大小给出了总体上拟合程度的好坏,s给出了观测点与回归曲线偏离的一个量值。所以,通常在实际问题中两者都求出,供使用者从不同角度去认识所拟合的曲线回归。

(3) F检验,其数学表达式为:

如果满足

,则认为变量y与x有显著的线性关系。

三、多元线性回归

代码语言:txt复制
    设Y是一个可观测的随机变量,它受到p(p>0)个非随机变量

和随机误差ε的影响。若Y与

有如下线性关系:

代码语言:txt复制
    其中,

是固定的未知参数,称为回归系数;ε是均值为0、方差为

的随机变量;Y称为被解释变量;

称为解释变量。此模型称为多元线性回归模型。

代码语言:txt复制
    自变量

是非随机的且可精确观测,随机误差ε代表其随机因素对因变量Y产生的影响。对于总体

的n组观测值

,应满足式:

代码语言:txt复制
    其中,

相互独立,且设

,记

代码语言:txt复制
    则模型可用矩阵形式表示为:
代码语言:txt复制
    其中,_Y_称为观测向量;_X_称为设计矩阵;ω称为待估计向量;ε是不可观测的_n_维随机向量,它的分量相互独立,假定

代码语言:txt复制
    建立多元线性回归建模的基本步骤如下:
  1. 对问题进行分析,选择因变量与解释变量,作出因变量与各解释变量的散点图,初步设定线性回归模型的参数个数。
  2. 输入因变量与自变量的观测数据(y,X),计算参数的估计。
  3. 分析数据的异常点情况。
  4. 作显著性检验,若通过,则对模型作预测。
  5. 对模型进一步研究,如残差的正态性检验、残差的异方差检验、残差的自相关检验等。

四、MADlib的线性回归相关函数

1. 训练函数

(1) 语法

代码语言:javascript复制
linregr_train( source_table,  
               out_table,  
               dependent_varname,  
               independent_varname,  
               grouping_cols,  
               heteroskedasticity_option  
             )

(2) 参数

参数名称

数据类型

描述

source_table

VARCHAR

包含训练数据的源表名。

out_table

VARCHAR

包含模型的输出表名。主输出表列和概要输出表列如表2、3所示。

dependent_varname

VARCHAR

训练数据中因变量列的名称。

independent_varname

VARCHAR

评估使用的自变量的表达式列表,一般显式地由包括一个常数1项的自变量列表提供。

grouping_cols(可选)

VARCHAR

缺省值为NULL。和SQL中的“GROUP BY”类似,是一个将输入数据集分成离散组的表达式,每个组运行一个回归。此值为NULL时,将不使用分组,并产生一个单一的结果模型。

heteroskedasticity_option(可选)

BOOLEAN

缺省值为FALSE。设置成TRUE时会计算并返回模型的异方差。

表1 linregr_train函数参数说明

列名

数据类型

描述

<...>

TEXT

当使用分组选项时,表示分组列。

coef

FLOAT8[]

回归系数向量。

r2

FLOAT8

模型确定的R平方系数。

std_err

FLOAT8[]

系数的标准方差向量。

t_stats

FLOAT8[]

系数的t-统计量向量。

p_values

FLOAT8[]

系数的P值向量。

odds_ratios

FLOAT8[]

比值比exp(ci)。

condition_no

FLOAT8

X*X矩阵的条件数。高条件数说明结果中的一些数值不稳定,产生的模型不可靠。这通常是由于底层设计矩阵中有相当多的共线性造成的,在这种情况下可能更适合使用其它回归技术(如弹性网络回归)。

bp_stats

FLOAT8

当设置了heteroskedacity参数时,表示异方差的Breush-Pagan统计。

bp_p_value

FLOAT8

当设置了heteroskedacity参数时,表示Breush-Pagan计算的P值。

num_rows_processed

INTEGER

每个分组中实际使用的行数。

num_missing_rows_skipped

INTEGER

训练时跳过的行数。如果自变量或因变量包含NULL值,则该行在每组计算时被跳过。

表2 linregr_train函数主输出表列说明

代码语言:txt复制
    训练函数在产生输出表的同时,还会创建一个名为<out_table>_summary的概要表,具有以下列:

列名

数据类型

描述

source_table

TEXT

源数据表名称。

out_table

TEXT

输出表名。

dependent_varname

TEXT

因变量名。

independent_varname

TEXT

自变量名。

num_rows_processed

INTEGER

用于计算的总行数。

num_missing_rows_skipped

INTEGER

由于空值跳过的总行数。

表3 linregr_train函数概要输出表列说明

2. 预测函数

(1) 语法

代码语言:javascript复制
linregr_predict(coef, col_ind)

(2) 参数

coef:FLOAT8[]类型,回归系数向量。

col_ind:FLOAT8[]类型,包含自变量列名索引的数组。

五、线性回归示例

1. 一元线性回归

(1) 问题提出

代码语言:txt复制
    近10年来,某市社会商品零售总额与职工工资总额(单位:亿元)的数据见表4,请建立社会商品零售总额与职工工资总额数据的回归模型。

职工工资总额

23.8

27.6

31.6

32.4

33.7

34.9

43.2

52.8

63.8

73.4

商品零售总额

41.4

51.8

61.7

67.9

68.7

77.5

95.9

137.4

155.0

175.0

表4 商品零售总额与职工工资总额

代码语言:txt复制
    该问题只有两个变量,是典型的一元回归问题,先要确定是否是线性的,当确定是线后就可以利用MADlib的线性回归函数建立它们之间的回归模型。从图1所示的数据散点图上看到,两个变量的数据的确接近一条线上,因此可以判断这些数据近似成线性关系。

图1 职工工资总额和商品零售总额关系趋势图

(2) 调用训练函数建立模型

代码语言:javascript复制
-- 建立表并添加数据  
drop table if exists t1;  
create table t1 (a float, b float);  
insert into t1 values  
(23.8,41.4),(27.6,51.8),(31.6,61.7),(32.4,67.9),(33.7,68.7),  
(34.9,77.5),(43.2,95.9),(52.8,137.4),(63.8,155.0),(73.4,175.0);  
  
-- 训练线性模型  
drop table if exists t1_linregr, t1_linregr_summary;  
select madlib.linregr_train( 't1',  
                             't1_linregr',  
                             'b',  
                             'array[1, a]'  
                           );  
  
-- 查看结果模型  
x on  
select * from t1_linregr; 
代码语言:txt复制
    结果:
代码语言:javascript复制
-[ RECORD 1 ]------------ -----------------------------------------------------------------------------
coef                     | {-23.5493464974992,2.79912144049615}
r2                       | 0.986778045431921
std_err                  | {5.10282699272296,0.114555208049907}
t_stats                  | {-4.61496079155387,24.4346938750851}
p_values                 | {0.0017214811063928,8.40137971469318e-09}
condition_no             | 127.169076670091
num_rows_processed       | 10
num_missing_rows_skipped | 0
variance_covariance      | {{26.038843317662,-0.54748720824343},{-0.54748720824343,0.0131228956913574}}
代码语言:txt复制
    从结果看,r2的值接近于1,而p_values的值足够小,说明模型较好。

(3) 利用预测函数估计残差

代码语言:txt复制
    残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。“残差”蕴含了有关模型基本假设的重要信息。如果回归模型正确的话,我们可以将残差看作误差的观测值。它应符合模型的假设条件,且具有误差的一些性质。利用残差所提供的信息,来考察模型假设的合理性及数据的可靠性称为残差分析。
代码语言:javascript复制
x off  
select a, b, predict, b - predict residual  
  from (select t1.*,  
               madlib.linregr_predict(m.coef,array[1, a]) as predict  
          from t1, t1_linregr m) t;  
代码语言:txt复制
    结果:
代码语言:javascript复制
  a   |   b   |     predict      |      residual       
------ ------- ------------------ ---------------------
 23.8 |  41.4 | 43.0697437863091 |   -1.66974378630913
 27.6 |  51.8 | 53.7064052601945 |    -1.9064052601945
 31.6 |  61.7 | 64.9028910221791 |   -3.20289102217909
 32.4 |  67.9 |  67.142188174576 |      0.757811825424
 33.7 |  68.7 |  70.781046047221 |   -2.08104604722101
 34.9 |  77.5 | 74.1399917758164 |    3.36000822418363
 43.2 |  95.9 | 97.3726997319344 |   -1.47269973193441
 52.8 | 137.4 | 124.244265560697 |    13.1557344393026
 63.8 |   155 | 155.034601406155 | -0.0346014061550477
 73.4 |   175 | 181.906167234918 |   -6.90616723491809
(10 rows)

2. 多元线性回归

(1) 问题提出

代码语言:txt复制
    某科学基金会希望估计从事某研究的学者的年薪Y与他们的研究成果(论文、著作等)的质量指标X1、从事研究的时间X2、能成功获得资助的指标X3之间的关系,为此按一定的实验设计方法调查了24位研究学者,得到如表5所示的数据(i为学者序号),试建立Y与X1、X2、X3之间关系的数学模型,并得出有关结论和作统计分析。

I

1

2

3

4

5

6

7

8

9

10

11

12

Xi1

3.5

5.3

5.1

5.8

4.2

6.0

6.8

5.5

3.1

7.2

4.5

4.9

Xi2

9

20

18

33

31

13

25

30

5

47

25

11

Xi3

6.1

6.4

7.4

6.7

7.5

5.9

6.0

4.0

5.8

8.3

5.0

6.4

Yi

33.2

40.3

38.7

46.8

41.4

37.5

39.0

40.7

30.1

52.9

38.2

31.8

I

13

14

15

16

17

18

19

20

21

22

23

24

Xi1

8.0

6.5

6.6

3.7

6.2

7.0

4.0

4.5

5.9

5.6

4.8

3.9

Xi2

23

35

39

21

7

40

35

23

33

27

34

15

Xi3

7.6

7.0

5.0

4.4

5.5

7.0

6.0

3.5

4.9

4.3

8.0

5.8

Yi

43.3

44.1

42.5

33.6

34.2

48.0

38.0

35.9

40.4

36.8

45.2

35.1

表5 从事某研究的学者的相关指标数据

代码语言:txt复制
    该问题是典型的多元回归问题,但能否应用多元回归,最好先通过数据可视化判断它们之间的变化趋势,如果近似满足线性关系,则可以利用线性回归方法对该问题进行回归。

(2) 作出因变量Y与各自变量的样本散点图

代码语言:txt复制
    作散点图的目的是观察因变量Y与各自变量间是否有比较好的线性关系,以便选择恰当的数学模型形式。图2分别为年薪Y与成果质量指标X1、研究工作时间X2、获得资助的指标X3之间的散点图。从图中可以看出这些点大致分布在一条直线旁边,因此有比较好的线性关系,可以采用线性回归。

图2 因变量Y与各自变量的样本散点图

(3) 调用训练函数建立模型

代码语言:javascript复制
-- 建立表并添加数据  
drop table if exists t1;  
create table t1 (x1 float, x2 float, x3 float, y float);  
insert into t1 values  
(3.5,9,6.1,33.2), (5.3,20,6.4,40.3), (5.1,18,7.4,38.7),  
(5.8,33,6.7,46.8), (4.2,31,7.5,41.4), (6.0,13,5.9,37.5),  
(6.8,25,6.0,39.0), (5.5,30,4.0,40.7), (3.1,5,5.8,30.1),  
(7.2,47,8.3,52.9), (4.5,25,5.0,38.2), (4.9,11,6.4,31.8),  
(8.0,23,7.6,43.3), (6.5,35,7.0,44.1), (6.6,39,5.0,42.5),  
(3.7,21,4.4,33.6), (6.2,7,5.5,34.2), (7.0,40,7.0,48),  
(4.0,35,6.0,38.0), (4.5,23,3.5,35.9), (5.9,33,4.9,40.4),  
(5.6,27,4.3,36.8), (4.8,34,8.0,45.2), (3.9,15,5.8,35.1);  
  
-- 训练线性模型  
drop table if exists t1_linregr, t1_linregr_summary;  
select madlib.linregr_train( 't1',  
                             't1_linregr',  
                             'y',  
                             'array[1, x1, x2, x3]'  
                           );  
  
-- 查看结果模型  
x on  
select * from t1_linregr;
代码语言:txt复制
    结果:
代码语言:javascript复制
-[ RECORD 1 ]------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
coef                     | {17.4360844805194,1.11937123487486,0.321549680035209,1.33338805066807}
r2                       | 0.913094894036178
std_err                  | {2.01313917062048,0.323340769702551,0.0365410911568227,0.294934722021009}
t_stats                  | {8.66114212816461,3.46189327100506,8.79967373320137,4.52095989760436}
p_values                 | {3.34622308123056e-08,0.00246297144041073,2.59478249724937e-08,0.000208347220434948}
condition_no             | 162.923246160157
num_rows_processed       | 24
num_missing_rows_skipped | 0
variance_covariance      | {{4.05272932028652,-0.308664994654568,0.0010662360168379,-0.382166636046883},{-0.308664994654568,0.104549253351838,-0.00506182989810972,-0.0207961107291977},{0.0010662360168379,-0.00506182989810972,0.00133525134293122,-0.00120729338355019},{-0.382166636046883,-0.0207961107291977,-0.00120729338355019,0.0869864902536095}}
代码语言:txt复制
    从训练结果中看到,回归系数b=(17.4361,1.1194,0.3215,1.3334),相关系数的平方r2=0.9131,t检验对应的概率p值很小。因此我们得到初步的回归方程为:
代码语言:txt复制
    由结果对模型的判断:
  • 对相关系数R的评价:本例R的绝对值为0.9556,表明线性相关性较强。
  • p值检验:p<0.05(预定显著水平),说明因变量y与自变量之间有显著的线性相关关系。
代码语言:txt复制
    两种推断方法推断的结果一致,说明因变量与自变量之间存在较强的线性关系,线性回归模型可用。

(4) 利用预测函数估计残差

代码语言:javascript复制
x off  
select x1, x2, x3, y, predict, y - predict residual   
  from (select t1.*,  
               madlib.linregr_predict(m.coef, array[1, x1, x2, x3]) as predict  
          from t1, t1_linregr m) t;
代码语言:txt复制
    结果:
代码语言:javascript复制
 x1  | x2 | x3  |  y   |     predict      |      residual       
----- ---- ----- ------ ------------------ ---------------------
 3.5 |  9 | 6.1 | 33.2 | 32.3814980319735 |   0.818501968026474
 5.3 | 20 | 6.4 | 40.3 |  38.333429150336 |      1.966570849664
 5.1 | 18 | 7.4 | 38.7 | 38.7998435939587 | -0.0998435939586741
 5.8 | 33 | 6.7 | 46.8 | 43.4732770234316 |    3.32672297656843
 4.2 | 31 | 7.5 | 41.4 | 42.1058941280958 |  -0.705894128095842
   6 | 13 | 5.9 | 37.5 | 36.1994472291679 |     1.3005527708321
 6.8 | 25 |   6 |   39 | 41.0868791825571 |   -2.08687918255711
 5.5 | 30 |   4 | 40.7 | 38.5726688760597 |    2.12733112394031
 3.1 |  5 | 5.8 | 30.1 | 30.2475344026823 |  -0.147534402682325
 7.2 | 47 | 8.3 | 52.9 | 51.6755131538182 |    1.22448684618178
 4.5 | 25 |   5 | 38.2 | 37.1789372916769 |    1.02106270832314
 4.9 | 11 | 6.4 | 31.8 | 34.9917335360692 |   -3.19173353606917
   8 | 23 | 7.6 | 43.3 | 43.9204461854054 |  -0.620446185405434
 6.5 | 35 |   7 | 44.1 | 45.2999526631148 |   -1.19995266311481
 6.6 | 39 |   5 | 42.5 |  44.031312405407 |   -1.53131240540699
 3.7 | 21 | 4.4 | 33.6 | 34.1972087532353 |  -0.597208753235293
 6.2 |  7 | 5.5 | 34.2 | 33.9606681756644 |   0.239331824335615
   7 | 40 |   7 |   48 | 47.4673866807283 |   0.532613319271704
   4 | 35 |   6 |   38 | 41.1681365252596 |    -3.1681365252596
 4.5 | 23 | 3.5 | 35.9 | 34.5357558556043 |    1.36424414439566
 5.9 | 33 | 4.9 | 40.4 | 41.1851156557165 |  -0.785115655716531
 5.6 | 27 | 4.3 | 36.8 |  38.119973374642 |   -1.31997337464198
 4.8 | 34 |   8 | 45.2 | 44.4088599344604 |   0.791140065539594
 3.9 | 15 | 5.8 | 35.1 | 34.3585281909343 |   0.741471809065693
(24 rows)

0 人点赞