简介
回归是常用的一种数据分析的方法,通过规定因变量和自变量来确定变量之间的因果关系,是一种建立回归模型,并根据实测数据来求解模型的各个参数,然后评价回归模型是否能够很好的拟合实测数据。学习回归分析,可以帮助我们对数据做出合理的预测。
big picture
机器学习通常分为监督和非监督学习,本文讨论的回归是监督机器学习的范例之一。
在监督机器学习中,我们要做的是预测数据标签。一般可能会预测交易是否欺诈、愿意购买产品的顾客或某一地区的房价。
在非监督机器学习中,我们要做的是收集同一类尚无标签的数据,本文不具体介绍这类算法。
反应变量和解释变量
在简单线性回归中,我们要对两个定量变量进行比较。
反应变量是你想预测的变量,解释变量则是用于预测反应变量的变量,在线性回归中,通常我们会用散点图来可视化两个变量的关系,你将在接下来的各种概念中进一步了解这一点。
散点图
散点图是比较两个定量变量的常用可视化手段。散点图常用的汇总统计是相关系数,该系数常以 r 来表示。
虽然还有其它几种办法来衡量两个变量之间的相关性,但最常用的办法是用皮尔逊相关系数,该系数能说明 线性关系 的:
- 相关程度
- 相关方向
斯皮尔曼相关性系数则不只衡量线性关系,可能更适用于关联两个变量的场合。斯皮尔曼相关系数被定义成等级变量之间的皮尔逊相关系数【1】。
相关系数
相关系数是线性关系相关程度和相关方向的一种衡量方式。
我们可以根据相关性是正还是负来判断相关方向。
判断相关程度的小窍门:
强: 0.7≤∣r∣≤1.0
中度: 0.3≤∣r∣<0.7
弱: 0.0≤∣r∣<0.3
相关系数的计算
能用 Excel 等电子表格程序来计算相关系数,在电子表格程序里,使用函数 CORREL(col1, col2) 方可计算,其中 col1 和 col2 为你想进行比较的两列。
截距和斜率
回归线通常由截距和斜率决定。
截距的定义为当 x 变量为 0 时,反应变量的预测值。
斜率的定义为x 变量每增加一个单位引起的反应变量的预测变化。
我们将线性回归的回归线记为:
= b0 + b1x1
其中:
为回归线反应变量的预测值。
b0为截距。
b1为斜率。
x1为解释变量。
y为数据集某个数据点的实际反应变量值 (不是回归线的预测值)。
β0:解释变量为 0 时,总体反应变量的实际平均值
β1:解释变量每增加一个单位引起的总体反应变量的实际平均变化
拟合回归曲线
要找出最佳回归线,我们用的主要算法叫做 最小二乘法,使用该算法,我们可找出一条最小化 ∑(yi - i)2 的回归线。
我们还能用其它办法来找出一条 “最佳” 回归线,但一般来说,最小二乘法在很多场合都十分适用。
实例
为了最小化该函数,我们需要列出等式来求截距和斜率。
比如你得到了如图的一系列数值点:
least_square.png
为了得到斜率和截距,我们需要进行如下计算:
least_square_format.png
但在计算机时代,全部都用手工计算实在没有必要,利用好计算机,我们就能集中精力来解释结果并根据结果进行决策,如果你想观察 Excel 是怎么一步步进行这些计算的,那你可以看 这里,在接下来的章节中,我将演示如何在 Python 里做些相关练习。
python演示
- 导入数据和库
import numpy as np
import pandas as pd
import statsmodels.api as sm;
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.read_csv('./house_price_area_only.csv')
df.head()
- scatter图
df.plot(x='area',y='price',kind='scatter');
- 加上一个截距
# 加上一个截距
df['intercept'] = 1
对于绝大多数线性回归来说,截距都是必须的,但是statsmodels库里并没有截距(不知道为什么)。这里 是一个帖子,里面谈到几乎所有回归都需要截距。重申一次,只有极少数情况不需要在线性模型里使用截距。
- 线性回归
lm = sm.OLS(df['price'], df[['intercept','area']])
results = lm.fit()
results.summary()
-
结果
OLS.png
分析结果
得到回归模型的summary之后,可以对模型进行分析。
解释结果
首先看红色框内的部分:
斜率(b1)area
的coef值为:348.4664
截距(b0)intercept
的coef值为:9587.8878
因此我们得到了线性模型:
= 9587.8878 + 348.4664 * x1
可以解释为:
- 如果房子的面积为0,那么房子的价格为9587.8878个单位。
- 房子的面积没增加1个单位,房子的价格增加348.4664个单位。
假设检验
我们可以用 Python (或其它软件) 来对线性模型的系数进行假设检验。这些测试能帮我们判断某个变量与其反应变量是否具有具统计显著性的线性关系。
看黄色框内的部分:
p值用于检验截距或者斜率的参数是否等于0(H0假设)。即:
H0 :β0 = 0
H1 :β0 ≠ 0
H0 :β1 = 0
H1 :β1 ≠ 0
- 如果斜率不等于 0 (即对立假设为真),那我们就能证明与那个系数有关的 x 变量与反应变量间有具统计显著性的线性关系,也就意味着 x 变量能帮我们预测反应变量 (或者,最起码意味着模型里有 x 变量比没有好)。
- 不过对截距进行假设检验通常没什么作用
决定系数
可以看图中蓝色框内部分:
这个提供了很多指标有助于我们理解直线如何较好的拟合数据。其中R平方值是最常见的一种衡量方法。
决定系数 即相关系数r
的平方。
决定系数变量通常定义为模型中能以 x 变量解释的反应变量的变化范围。通常来说,决定系数越接近 1,模型就越拟合数据。
人们通常将R平方值理解为反应变量中的变异值有多少能被解释变量解释。
这里,我们可以说房价的67.8%的可变性是通过房屋面积进行解释的。剩下32.2%的可变性在于房屋的特征,和面积无关。
很多人觉得决定系数不是个很好的衡量标准 (他们可能是对的),不过我想说,我们所使用的任何衡量模型数据拟合度的方法,都可借助交叉验证来判断其准确性。这里 是一位朋友的文章,里面就用交叉验证探讨了他觉得决定系数不好的原因。基于此,应该在进行线性回归之前对数据进行可视化,以直观的观察变量之间的关系。
【1】斯皮尔曼等级相关系数
网友评论