实用案例分析,给你一张散点图新浦京www81707con

(Amelia/编译)在开始玩“猜相关”之前,我从没想过自己会把复活节假期的一小时花在沉迷一个8比特游戏上,更不用说它还是个关于许多科学家的日常工作的游戏了。同样,我也从未想过自己会沦陷于一张张黑点组成的图形中,力图准确地估计出这些黑点背后隐藏的规律,从而获得分数、荣登游戏排行榜。而且我也绝对没有指望过这件事会很好玩。

第5章  回归模型:预测网页访问量

线性回归是用于度量两个变量间关联关系的一种技术手段。例如有一个独立自变量X,一个依赖于X的因变量Y,线性回归可以帮助我们得到一个最佳拟合数据集的线性模型Y=α+βX。举个栗子,特斯拉为因变量Y,标普500ETF作为自变量X,通过线性回归,我们就可以知道特斯拉股价是如何随着标普500ETF价格波动而波动的。
Python的statsmodels是一个内建的线性回归库,首先我们先利用它自定义一个线性回归函数,该函数既包含了线性回归的执行,同时也把结果以图表的形式进行展示。

“猜相关”是奥马尔•瓦基(Omar
Wagih)的智力结晶,他是欧洲生物信息研究所的一位研究生,并且是我的(曾经是闲暇)时间的邪恶吞噬者。这个游戏文字描述起来极端无聊,然而一旦开玩就根本停不下来。不信试试看。

回归模型:用已知数据集预测另外一个数据集,已知数据集称为输入,也叫预测变量或特征,想要预测的数据称为输出。回归模型与分类模型的不同之处在于回归模型的输出是有意义的数值。

新浦京www81707con 1

游戏中,玩家会看到许多散点图——一种用于展示两事物间关系的常见图表,它反应的可能是气温和冰淇淋销量的关系,或者是体重和心脏病患病风险的关系,也可能是你花在这个邪恶游戏上的时间和你朋友数量的关系。你需要做的就是盯着这些散点图看,并估计出一个被称作R值的值,R体现了两事物间的相关性。在这个游戏中,R的取值范围是0(完全没有相关性)到1(完美的正相关)。

基准模型:用均值作为预测

自定义线性回归函数

新浦京www81707con 2先来复习一下不同R(相关系数)对应的散点图。图片来源:Omar Wagih

#machine learing for heckers
#chapter 5

最终它会给出一个最佳匹配的线性模型,但是该模型是否能够反映变量间的真实关系,却还需要进一步的判断,输出的结果中会包含模型的一些统计学指标,如R方(R-squared)与F检验,这些指标可以从一定层面上反映线性模型的好坏。
自定义函数中使用的回归算法为最小二乘法,首先来简单介绍一下其数学原理

通过观察散点图来判断事物之间的相关性是科学家们一直在做的事。在游戏过程中,我发现这件事出乎意料地困难。强相关(比如当R大于0.8时)十分明显,因为点都排成了一条干净的斜线。类似地,弱相关(当R小于0.2时)的图形看起来就像盲人射手练习射击后的靶子。然而,在这两者之间还存在着巨大的中间地带,我的判断力通常在这里戏剧般地下线——这也正是瓦基设计这个游戏的初衷。

library(ggplot2)

ages <- read.csv('ML_for_Hackers/05-Regression/data/longevity.csv')
#密度图
ggplot(ages, aes(x = AgeAtDeath, fill = factor(Smokes))) + geom_density() + facet_grid(Smokes ~ .)

最小二乘法(OLS/Ordinary Least Squares)

线性回归的过程可以看做是为了获得最佳拟合效果,而不断移动回归线的过程。如何定义“最佳”,就需要一个目标函数,在最小二乘法里,目标函数被定义为:

新浦京www81707con 3

最小二乘法目标函数

注:
其中a和b,代表Y=α+βX中α和β的候选值,最小二乘法的目标函数表示将每个真实的数据点与拟合线上的差异取平方,并进行求和,拟合度越高,这个值也就越小

经过迭代优化,最终就会得到一条最优的回归拟合线。

新浦京www81707con 4

回归线

去年十二月,瓦基参加了一场研讨会,会上,一位发言人展示了一张散点图,并断言这其中存在相关性。“它看起来,你知道,并不是怎么相关,”瓦基说。“我就想,我应该把他的话当真么?之后,他给我看了R值,R值显示这其中确实存在相关性,而我低估了散点图中的信息。我意识到会这样做的人可能不只我一个。”

  

示例

接下来我们使用特斯拉(TSLA)和标普500ETF(SPY)2016年的价格数据来示范一次线性回归,我们先利用pct_change()函数将价格数据转化为价格波动率数据,然后对这两组波动率数据进行线性回归。

新浦京www81707con 5

示例代码

简单的几行代码就完成了一次线性回归,但是面对打印的结果,可能会有点懵,结果中涉及一些统计学概念,这里不做过于深入的讲解,目前只需要明白,线性回归算法一定会得到一个结果,但能否很好的反映真实关联,还需要对结果的各项指标进行分析才能确定。

新浦京www81707con 6

指标一

注:其中OLS表示使用的为最小二乘法进行回归
R-squared/Adj. R-squared 指标表示回归线对数据的拟合程度
F-statistic/Prob (F-statistic) 表示模型是否能显著预测因变量的变化
实用案例分析,给你一张散点图新浦京www81707con。

新浦京www81707con 7

指标二

注:const代表常量(α),x1标识自变量前系数(β)
得到的回归线为Y=1.138X+0.0005

新浦京www81707con 8

指标三

注:Dubin-Watson 用于检测数据是否是自相关的
最终绘制的图形如下,包含了散点图与最终的回归线。

新浦京www81707con 9

绘制图形

他找到了几个可以随机生成散点图猜R值的网站,但“这些网站都很无聊,”他说,“完全没有动力驱使你继续下去。就这样,我产生了做个游戏的想法。”

新浦京www81707con 10

已知参数 vs 估计值

心中请牢记一点,所有通过线性回归得到参数都支持对于真实α与β的一个估计,除非你知道数据的真实处理过程,否则你将永远无法知道背后真正的α与β。根据明天的数据产生的回归结果就可能与今天的结果不尽相同,真实的参数也可能会发生变化,所以在显示的分析过程中,对于参数估计的标准误差(standard
error)要极其的小心,标准误差会在之后的文章中详细介绍。
我们通过两组数据来说明下,线性回归虽然都会得到一个线性模型,但是却不一定是有效的。
第一组数据,X与Y为两组随机数,

新浦京www81707con 11

示例代码

不出所料,我们得到了一条回归线(*Y=0.0972X+0.4187\),但是可以看到R方值非常小,由此可以判定这个线性关系是无效的。

新浦京www81707con 12

回归结果

新浦京www81707con 13

绘图结果

第二组数据,我们在X上增加一些人为噪声数据来构建出Y

新浦京www81707con 14

示例代码

再来对比看看回归结果,回归线为*Y=1.0405X+0.0081\,这次R方非常接近于1,由此可以推断Y与X之间确实存在线性关系的可能性较大。

新浦京www81707con 15

回归结果

游戏机制非常简单,由极简主义的设计和怀旧音乐实现。猜一连串散点图的R值,差太多会丢一条命,猜很准可以奖励一条命。比较好的估计可以为你赢得金币,这会计入你的最终得分。你甚至可以和朋友比赛。这就是这个游戏的全部。

#采用均值作为估计时的均方误差与采用其他结果作为估计时的均方误差比较

如何评估回归结果

一个有效的回归模型依赖于以下几条假设

  • 自变量不是随机的
  • 误差项的方差在观测集内为常量(这条对于评估拟合的好坏程度至关重要)
  • 误差项不是自相关的,杜宾-沃森统计用于检测自相关性,如果结果接近于2,那么则不存在自相关。
  • 误差项服从正态分布。如果这个条件不满足,则有些统计则无法使用,如F检验。
    如果以上条件均满足,那么我们就可以放心的使用结果中的统计资料来分析拟合程度,例如R方体现了模型可解释的因变量的总变分(total
    variation),即模型对于数据的拟合程度。
    在作一个预测时,孤零零的预测值往往是不够的,还需要补充置信区间,上例的线性回归结果中包含了95%的置信区间,我们通过seaborn库可以将此部分信息也绘制到图表当中。
![](https://upload-images.jianshu.io/upload_images/81125-60d8864383154544.png)

示例代码



![](https://upload-images.jianshu.io/upload_images/81125-90f9e2e76b50cf60.png)

95%置信区间

新浦京www81707con 16为了展示游戏界面开了游戏,一上手就丢命_(:з」∠)_图片来源:guessthecorrelation.com

guess <- 73
with(ages, mean((AgeAtDeath - guess) ^ 2))
guess.accuracy <- data.frame()
for(guess in seq(63, 83, by = 1)){
  prediction.error <- with(ages, mean((AgeAtDeath - guess) ^ 2))
  guess.accuracy <- rbind(guess.accuracy, data.frame(Guess = guess, Error = prediction.error))
}
ggplot(guess.accuracy, aes(x = Guess, y = Error)) + geom_point() + geom_line()

回归标准误差(standard error)

标准误差用于衡量误差项(ϵ)的标准差(standard
deviation)的一个指标,通过线性回归的尺度参数(scale
parameter)开方得到。(注:scale parameter,location parameter)
估计的标准误差公式为:

新浦京www81707con 17

估计的标准误差

**注:最标准的关系式为:Y=α+βX+ϵ 其中ϵ表示误差项 **
如之前得到的回归线,得到的回归参数均为估计值,

新浦京www81707con 4

回归线

考虑到回归参数本身的标准误差,标准误差公式调整如下:

新浦京www81707con 19

调整后的回归标准误差

其中Sf为尺度参数(scale
parameter),由此我们可以得到Y值得95%的置信区间为

新浦京www81707con 20

Y值95%置信区间

其中tc为 t检验95%置信度下的关键值(critical value)

最后,比较下线性回归与相关性分析的一些异同

瓦基于去年12月上线了这个游戏,并将每个玩家的估计数据收集成了一个数据库。他打算分析这些数据,来看看蒙蔽人们的散点图中是否存在着某些视觉因素,让人们高估或者低估相关性。“这种事以前就有人做过,但现在的重点在于我有庞大的数据,”他说。其他的研究一般仅涉及几十个志愿者和几千个估计值。但到今年三月中旬,瓦基已拥有17万名注册玩家和一个有着超过400万估计值的数据库。

新浦京www81707con ,  

线性回归 vs 相关性分析

  • 线性回归会给出一个特定的线性模型,但是它的使用仅限于变量间是线性相关的情况。
  • 相关性是线性相关与非线性相关的统称,但它不会产生一个实际模型。
  • 两者都通过协方差进行度量
  • 将X多维化,线性回归可以得到Y与多自变量间关系的模型

本篇完,感谢阅读,欢迎订阅:)

“我想设计一个更复杂的游戏,更让人上瘾的,”瓦基说(上帝啊饶了我吧)。他打算增加难度等级,改变散点的数量或大小(求放过!)。“我想做出一个你无聊时会在手机上玩的主流游戏,这样你就不会意识到自己是在猜相关性,并且在给这个研究课题做出贡献。”(快住手!!)

新浦京www81707con 21

 “我自己玩这个游戏的时间已经比我应该投入得多了,”他补充道。“我会坐在朋友身边,看他们输入答案,然后说‘不对,不对,是0.72’。他们不相信我,但我的答案往往更加接近。”

新浦京www81707con 22

除了看别人猜相关之外,他的经历证明这个游戏作为训练工具,有着提高研究者判断相关性能力的潜力。“这是首要的目的,”瓦基说。“我几乎每天都会接触到这样的散点图,可能是我自己的,也可能是我读到的论文里的。如果它能训练你下意识辨认出散点图中对相关性有贡献的结构或特征,这会非常有用。”

#对是否吸烟分组后,分别估计年龄均值,计算均方根误差

可视化能帮助我们理解大量数据,但它们仍然有着自身的缺陷,可能会让人们误入歧途。信息是美丽的,但美丽本身也有欺骗性。“作为一个研究者,你要阅读大量文献,在很多情况下,你只会看图,而不会看文字。”他说。“你看见了一张图——甚至可能是你自己的图——然后据此做出了某种判断。与一般人所想的相反,人们并不怎么擅长这件事。而我已经有了数据来证明这一点。”(编辑:Stellasun)

constant.guess <- with(ages, mean(AgeAtDeath))
with(ages, sqrt(mean((AgeAtDeath - constant.guess) ^ 2)))
smokers.guess <- with(subset(ages, Smokes == 1), mean(AgeAtDeath))
non.smokers.guess <- with(subset(ages, Smokes == 0), mean(AgeAtDeath))
ages <- transform(ages, NewPrediction = ifelse(Smokes == 0, non.smokers.guess, smokers.guess))
with(ages, sqrt(mean((AgeAtDeath - NewPrediction) ^ 2)))

编者注:想提高一下游戏表现吗?试试@Lyroat
的攻略《一个神烦的游戏……》吧!(回复有福利)

  

新浦京www81707con 23

新浦京www81707con 24

 

线性回归简介:

用到的假设:可加性;线性

一般性系统问题:回归擅长内推插值(interpolation),不擅长外推归纳(extrapolation).
也就是说,输入数据偏离观测数据太远,会造成预测不准确

模型如何才算有效?一个模型应该把真实世界的信号(预测值给出的)和噪声(残差给出的)区分开来,如果残差中除了真正的噪声外还存在信号,就说明模型没有强大到足以提取所有信号。

评价方法:

均方误差(MSE):可以评价预测的平均偏离,但是MSE是平均偏离值的平方

均方根误差(RMSE):MSE的开方值,但是不能让人直观清楚地看出模型不合理,即只能比较两个模型哪个更好,而不能单独评价一个模型的表现

R2:评价单独一个模型的好坏,以均值预测作为评估标准,值为0~1.
计算方式,分别计算以模型预测的RMSE1和均值预测的RMSE2,则R2 =
1-(RMSE1/RMSE2)

 

###################################
#预测网页流量
###################################

新浦京www81707con 25

观察访问量和访问用户之间的关系,先绘制散点图和密度图

top.1000.sites <- read.csv('ML_for_Hackers/05-Regression/data/top_1000_sites.tsv', sep = '\t', 
                           stringsAsFactors = FALSE)
ggplot(top.1000.sites, aes(x = PageViews, y = UniqueVisitors)) + geom_point()
ggplot(top.1000.sites, aes(x = PageViews)) + geom_density()

  

新浦京www81707con 26

新浦京www81707con 27

首先绘制的散点图都挤在了一起,所以考虑先看密度分布,但是密度分布也毫无意义,效果并不直观。这时要考虑先将数据对数变换,再绘制密度图和散点图。

ggplot(top.1000.sites, aes(x = log(PageViews))) + geom_density()
ggplot(top.1000.sites, aes(x = log(PageViews), y = log(UniqueVisitors))) + geom_point()
#也可以用ggplot2内置的scale_x_log10()和scale_y_log10()直接转换刻度,效果相同

  

新浦京www81707con 28

新浦京www81707con 29

进行线性回归并解释结果:

lm.fit <- lm(log(PageViews) ~ log(UniqueVisitors), data = top.1000.sites)
summary(lm.fit)

  

新浦京www81707con 30

Call:调用函数

Risiduals:残差的分位数

Coefficients:回归模型的系数信息

Signif.codes:t-value有多大或者p-value有多小,t-value的意义就是系数估计值距离0的标准差个数,一般3个以上表示显著

Residual standard
error:即RMSE。自由度:样本中独立或能自由变化的自变量的个数。由于已经确定了两个系数,而确定这两个系数至少需要2个自变量的值,因此该统计量的自由度是1000-2=998。自由度越大,RMSE越小,证明这个模型效果越好,越具有普遍性

Multiple R-squared:标准的R2

Adjusted
R-squared:根据使用的系数个数调整后的R2值,系数使用的越多,R2值得到的惩罚越大

F-statistic:表征了模型相对于仅使用均值预测所获得效果的提升度量,是R2的替代方案,可以用来计算p-value

(注:书中提到,p-value和F-statistic在模型预测问题上具有一定欺骗性,这两个指标更为合理的用法是用于拟合问题)

 

#########################################

#引入更多信息并进行回归

lm.fit <- lm(log(PageViews) ~ HasAdvertising + log(UniqueVisitors) + InEnglish, data = top.1000.sites)
summary(lm.fit)

  

新浦京www81707con 31

分析:

对于因子HasAdvertising:两种因子:’YES’和’NO’。
 ‘YES’从截距里分出来,’NO’包含在了截距(Intersept)中

对于因子InEnglish:三种因子:’NA’、’YES’和’NO’.
 ‘NA’被包含在了截距里,’YES’和’NO’分别拟合系数

想要比较单独使用一个输入时,哪个输入具有更强的预测能力,可以提取每个summary函数的R2

新浦京www81707con 32

InEnglish应该解释了30%,应该是书上有误。这也解释了书上为什么提到1%的HasAdvertising可以舍去而不提3%的InEnglish

分析:因为HasAdvertising只解释了结果的1%,因此实践中,如果输入容易获得,值得将所有输入都包含进一个预测模型中,如果难以获得,可以从模型里去掉

#################################

相关性简述:

相关性可以衡量线性回归模型对两个变量之间关系建模的好坏:值为0时表明不存在直线能将两个变量联系起来;值为1时表明有一条完美正向直线可以将两个变量联系起来;值为-1时表明有一条完美的负向直线。

在R语言中,可以用函数cor()来计算相关性;

另一种计算方式是:用lm()函数对刻度变换后的两个变量进行拟合,得到的系数即是相关性。刻度变换方式是:先减去两个变量的均值,再除以标准差,在R语言中可以用scale()函数直接得到结果。

新浦京www81707con 33

 

需要注意的是,相关性只能度量两个变量之间线性关系有多强,但是并不能说明两个变量之间是否有因果关系。而即使没有逻辑上的因果关系,对于预测问题来说,知道两个变量之间是否有相关性仍然十分重要。

 

相关文章