用多元线性回归预测网页访问量(R语言)

前言

该问题来源于《机器学习:实用案例解析》中的第5章。在书中,已经对该问题给出了一种解决方案,但是我觉得写的还是太简略了一些,没有把考虑问题的整个思路给写出来,所以,在这里给出我的一些想法。

问题简述

我们的任务就是根据给定的数据集(TOP1000的互联网站数据)建立一个回归模型,然后根据任意给定的一组网站数据,预测出该网站的网页访问量。

解决方案

这里我们针对的是多元线性回归这个方法,并不是针对预测网页访问量这件事(只是拿这个数据集来练习一下~),看看多元线性回归能拟合到怎样的程度,所以如果结果不尽如人意也就不要纠结了~
好了,首先拿到数据集之后自然要看一下数据集是长什么样的。

topSites <- read.csv('top_1000_sites.tsv', sep='\t', stringsAsFactors = FALSE)
head(topSites)

得到

数据集概览

同样由于对“法”不对“事”,我们这里只考虑UniqueVisitors(用户数),HasAdvertising(网页是否有广告)和InEnglish(是否是英文网站)三者对PageViews(网页访问量)的影响。
先来看一下UniqueVisitors和PageViews大概是个什么关系

plot(topSites$PageViews, topSites$UniqueVisitors)

得到

用户数和访问量的关系图

图1:用户数和访问量的关系图

可以看出这并没有很好的线性关系,当然我们也可以强行来做一下线性拟合看下效果~

lm.sol <- lm(PageViews~UniqueVisitors, data = topSites)
lines(topSites$PageViews, fitted(lm.sol))

有拟合线的用户数和访问量的关系

图2:有拟合线的用户数和访问量的关系

再来看下具体的结果

summary(lm.sol)

线性拟合结果1

在这里我们主要看三个指标(详细的可参见参考文献[2]中第6章),一个是Coefficients后面的 * 的个数,越多说明显著性越高,当然也就越好;再看Residual standard error(残差的标准差),越小越好,这里大的有些吓人,这主要也和数据本身的数量级有些关系,但这里我们显然是不满意的;最后看Mutiple R-squared(相关系数的平方),取值为0~1之间,越靠近1越好,这里的0.3421只能说是有点线性相关,相关性不强。
好了,接下来我们来改进模型。
首先,通过观察数据不难发现,UniqueVisitors(x)和PageViews(y)有点幂函数的意思,说的更具体些,有点介于 y=ax y=ax2 之间的意思~
我们来试下看~
假设UniqueVisitors(x)和PageViews(y)有如下关系:
y=axb

对两边分别取对数有
lny=lna+blnx

这样一来 lny lnx就成了一个线性的关系了,然后就可以名称言顺地放进去线性拟合了,其中 lna为常数项, b为斜率。

plot(log(topSites$UniqueVisitors), log(topSites$PageViews))
lm.solLog <- lm(log(PageViews)~log(UniqueVisitors), data = topSites)
abline(lm.solLog)

取对数后线性拟合

图3:取对数后的线性拟合图

再来用数据说话看下~

summary(lm.solLog)

线性拟合结果2

再来看下这三个值,显著性依旧比较理想,残差的标准差1.084也可以接受(主要是因为取对数之后数据的值的数量级都变小了),相关系数的平方0.4616也挺不错了,所以我们认为这个结果就线性回归而言已经比较理想了。
注意到这里估计出来的截距为-2.83441,斜率为1.33628,也就是说估计出来的方程为
lny=2.83441+1.33628lnx

y=e2.83441x1.33628

看来我们的猜测还是比较准确的~
当然也可以猜测UniqueVisitors和PageViews是指数或者其他的关系,我都试了一下,不太理想,所以我们还是用幂函数的关系~
接下来就是另外两个变量HasAdvertising,InEnglish与PageViews的关系了。但遗憾的是这两个变量的值是YES和NO,这怎么线性拟合?。。。
这里涉及到一个虚拟变量(离散变量)的问题(详情可参见参考文献[1]第5章),我们来增加两列数据isEnglishYes和hasAdYes。

topSites[topSites$InEnglish == "Yes", "isEnglishYes"] <- 1
topSites[is.na(topSites$isEnglishYes), "isEnglishYes"] <- 0topSites[topSites$HasAdvertising == "Yes", "hasAdYes"] <- 1
topSites[is.na(topSites$hasAdYes), "hasAdYes"] <- 0

这里把 InEnglish == “Yes” 和 HasAdvertising == “Yes” 的行置为1,InEnglish == “No” 和 HasAdvertising == “No” 的行置为0。这样做之后就可以对最终拟合结果的截距和斜率产生影响。
不用搞个 isEnglishNo 这样的列出来,因为 isEnglishNo 这个列是由 isEnglishYes 这列决定的,两个都放进去就会有一个多重共线性的问题。
比如下面这样就是对截距产生影响:

lny=a+blnx+cIsEnglish+dHasAdvertising

也就是说是不是英语网站和有没有广告投入这几种情况下的截距是不同的,但是斜率是一样的。
又比如下面这样是对斜率产生影响:
lny=a+blnx+cisEnglishlnx+dHasAdvertisinglnx

也就是说是不是英语网站和有没有广告投入这几种情况下的斜率是不同的,但截距是一样的。
这就是虚拟变量的处理方法,我们下面来综合考虑一下上面两种情况:
lny=a+blnx+cIsEnglish+dHasAdvertising+eisEnglishlnx+fHasAdvertisinglnx

lm.solMul2 <- lm(log(PageViews)~log(UniqueVisitors)+hasAdYes+isEnglishYes+hasAdYes*log(UniqueVisitors)+isEnglishYes*log(UniqueVisitors), data = topSites)
summary(lm.solMul2)

可以得到

线性拟合结果3

我的天!竟然只有一个参数估计的显著性是三颗 * 的,其它的连 . 都没有!也就是说没有通过参数检验,这个模型肯定用不了了,后面的看都不用看了。
没关系,这其实也是在意料之中的事,也是多元回归中经常碰到的问题。接下来,我们就用逐步回归来解决这个问题。
逐步回归分为:

  • 向前引入法(forward):逐渐增加变量,直到AIC值最优。
  • 向后剔除法(backward):逐渐删减变量,直到AIC值最优。
  • 逐步筛选法(both):综合了以上两种,直到AIC值最优。

什么是AIC值?
AIC又叫最小信息准则,是个日本人创立的,公式如下,总之,值越小越好,这里就不展开讲了,可以看下wiki里的介绍(点我)

AIC=nln(RSSp/n)+2p

其中, n为变量总个数,RSS为残差平方和,p为选出的变量个数。
令人可喜的是,R语言中封装好了逐步回归的函数,我们直接调用即可!

s1 = step(lm.solMul2, direction = "both")

得到

逐步回归过程

我们来看下究竟发生了什么。刚开始的AIC值为151.74,如果剔除 isEnglishYeslog(UniqueVisitors)的话就变成了149.78,如果剔除 hasAdYeslog(UniqueVisitors)的话就变成了150.24,什么都不干还是151.74,于是自动剔除了 isEnglishYeslog(UniqueVisitors)。接着剔除 hasAdYeslog(UniqueVisitors)的话可以变成更小 148.28,其它方法只会使得AIC变大,故又剔除了 hasAdYeslog(UniqueVisitors)。最后,发现不管增加还是剔除变量都不能使得AIC减小了,于是逐步回归停止,我们得到了一个模型
lny=a+blnx+cIsEnglish+dHasAdvertising

看下这个模型的效果怎么样~

summary(s1)

得到
线性拟合结果4
怎么样~是不是挺不错的!每个参数的估计值显著性都很高,残差的标准差也挺小的,就是相关系数的平方值稍微低了那么一些,但还是可以令人接受的。好了,就要它了~
我们拿这个模型来看看预测的效果怎么样

predictData <- data.frame(UniqueVisitors = 280000000, hasAdYes = 1, isEnglishYes = 0)
lm.pred <- predict(s1, predictData, interval = "prediction", level = 0.95)
lm.pred

得到

预测结果

也就是说我们认为结果是23.52291,并且结果落在(21.38347, 25.66234)这个区间的可能性为95%。
这里用的这组数据的真是值是
预测样本

我们把PageViews的4.4e+10取个对数值得到
取对数后的预测样本

可见和我们的预测结果是差不多的~
当然,如果是在没取对数的情况下,这两者之间还是差的很远很远的~
所以,用多元线性回归预测网页访问量是不太准确的,可能考虑了其它的因素,寻找一下其它的特征之后再来算可能会好一点(可以试一下),换成其它的方法也可能会好些。
这里主要讲的的多元线性回归的解题思路,也就不管结果能不能用于实际情况了~

结束语

以上给出了解决多元线性回归问题的一般思路,该方法当然也适用于其他的案例。
如有不足,还请指正!

参考文献

[1] Drew Conway. 机器学习:实用案例解析[M]. 机械工业出版社, 2013.
[2] 薛毅. 统计建模与R软件[M]. 清华大学出版社, 2007.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六、jQuery 中的 AJAX 跨域问题

第 2 章&#xff1a;jQuery 中的 AJAX 官方中文文档&#xff1a;https://jquery.cuishifeng.cn/jQuery.Ajax.html 2.1 get 请求 $.get(url, [data], [callback], [type]) url:请求的 URL 地址。data:请求携带的参数。callback:载入成功时回调函数。type:设置返回内容格式&a…

常用的几种编程语言的介绍

编程语言&#xff08;programming language&#xff09;&#xff0c;来自百度百科的解释为&#xff1a;编程语言是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧&#xff0c;用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据&a…

三门问题(Monty Hall problem)背后的贝叶斯理论

文章目录1 前言2 问题简介3 直观的解释4 贝叶斯理论的解释1 前言 三门问题可以说有着各种版本的解释&#xff0c;但我看了几个版本&#xff0c;觉得没有把其中的条件说清楚&#xff0c;所以还是决定按照自己的理解记录一下这个特别有意思的问题。 2 问题简介 三门问题&#…

一、在vue项目中使用mock.js(详解)

步骤1.搭建测试项目 步骤1.1创建项目 命令&#xff1a; vue create mock-demo 步骤1.2安装依赖 命令&#xff1a; #使用axios发送ajax cnpm install axios--save #使用mockjs产生随机数据 cnpm install mockjs--save-dev #使用json5解决ison文件&#xff0c;无法添加注释…

二、在jQuery中使用mockjs

在jQuery项目中使用mock.js 步骤1.搭建项目 步骤1.1创建项目 新建文件夹jquery-mock-demo 步骤1.2新建index.html&#xff0c;引入jquery.js文件和mock.js <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title&g…

Android 中如何计算 App 的启动时间?

&#xff08;转载&#xff09; 已知的两种方法貌似可以获取&#xff0c;但是感觉结果不准确&#xff1a;一种是&#xff0c;adb shell am start -w packagename/activity,这个可以得到两个值&#xff0c;ThisTime和TotalTime&#xff0c;不知道两个有什么区别&#xff0c;而且与…

项目实战:Express实现学生管理系统(CRUD)

一、起步 初始化 npm init -y 生成package.json文件 模板处理 cnpm install express --save cnpm install bootstrap --savenpm install --save art-template npm install --save express-art-template//两个一起安装 npm i --save art-template express-art-template文件目录…

2016年度 JavaScript 展望(下)

【编者按】本文作者为资深 Web 开发者 TJ VanToll, TJ 专注于移动端 Web 应用及其性能&#xff0c;是《jQuery UI 实践》 一书的作者。 本文系 OneAPM 工程师编译呈现&#xff0c;以下为正文的第二部分。点此阅读第一部分。 本地移动 apps 在2015年&#xff0c;出现了一种新的基…

Python模块之MyQR——制作个性化动态二维码(超详细)

一、首先安装MyQR 第一种方式&#xff1a;cmd 命令行输入 pip install MyQR 第二种方式&#xff1a;pyCharm中手动选择进行安装 二、 myqr.run() 函数里面的参数 三、编写代码 # encodingutf-8 from MyQR import myqrmyqr.run(words"https://blog.csdn.net/weixin_448…

地址选择控件开发-

先睹为快 闲话少说&#xff0c;我们先来看看今天我们研究的控件的最终效果图(参照天猫的送货地址设置的效果)&#xff1a; “地址选择Web控件”的基本组成&#xff1a; 使用控件举例&#xff1a; <!--需要加载和引用的文件--> <link rel"stylesheet" href&q…

逻辑回归(logistic regression)的本质——极大似然估计

文章目录1 前言2 什么是逻辑回归3 逻辑回归的代价函数4 利用梯度下降法求参数5 结束语6 参考文献1 前言 逻辑回归是分类当中极为常用的手段&#xff0c;因此&#xff0c;掌握其内在原理是非常必要的。我会争取在本文中尽可能简明地展现逻辑回归(logistic regression)的整个推导…

使用mongoose 在 Node中操作MongoDB数据库

MongoDB 关系型和非关系型数据库 关系型数据库&#xff08;表就是关系&#xff0c;或者说表与表之间存在关系&#xff09;。 所有的关系型数据库都需要通过sql语言来操作所有的关系型数据库在操作之前都需要设计表结构而且数据表还支持约束 唯一的主键默认值非空 非关系型…

pip install时发生raise ReadTimeoutError(self._pool, None, 'Read timed out.')的解决方案

问题描述 在windows下&#xff0c;python在安装一些包的时候&#xff0c;常常会碰到time out的情况&#xff0c;如下图所示。不管再重试几次都是如此&#xff0c;这时候该怎么办呢&#xff1f; 解决方案 方案一&#xff1a;更换安装源&#xff08;推荐使用豆瓣源&#xff09…

使用Node 操作MySQL数据库

1. 安装 官方文档&#xff1a;https://www.npmjs.com/package/mysql npm install --save mysql2.代码演示 var mysql require(mysql);// 1.创建连接 var connection mysql.createConnection({host : localhost,user : root,password : root,database : my_db …

利用随机森林对特征重要性进行评估

文章目录1 前言2 随机森林&#xff08;RF&#xff09;简介3 特征重要性评估4 举个例子5 参考文献1 前言 随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单&#xff0c;易于实现&#xff0c;计算开销也很小&#xff0c;更令人惊奇的是它在分类和回归上表现出了十…

Promise学习——解决回调地狱问题

Promise promise 容器概念&#xff1a; callback hell&#xff08;回调地狱&#xff09;: 文件的读取无法判断执行顺序&#xff08;文件的执行顺序是依据文件的大小来决定的&#xff09;(异步api无法保证文件的执行顺序) var fs require(fs);fs.readFile(./data/a.text,ut…

基于哈希表的索引堆变形(Hackerrank: QHEAP1)

问题来源 此题来自于Hackerrank中的QHEAP1问题&#xff0c;考查了对堆结构的充分理解。成功完成此题&#xff0c;对最大堆或者最小堆的基本操作实现就没什么太大问题了。 问题简述 实现一个最小堆&#xff0c;对3种类型的输入能给出正确的操作&#xff1a; “1 v” - 表示往…

Node 中的path模块

参考文档&#xff1a;https://nodejs.org/docs/latest-v13.x/api/path.html path模块中的常用API&#xff1a; path.basename&#xff1a;获取路径的文件名&#xff0c;默认包含扩展名path.dirname&#xff1a;获取路径中的目录部分path.extname&#xff1a;获取一个路径中的扩…

Node中的fs模块

1.fs.stat检测是文件还是目录 2.fs.mkdir创建目录 3.fs.writeFile创建写入文件 4.fs.appendFile追加文件 5.fs.readFile 读取文件 6.fs.readdir读取目录 7.fs.rename重命名 8.fs.rmdir删除目录 9.fs.unlink 删除文件 fs.stat 检测是文件还是目录 const fs require(fs)fs.stat…

主成分分析(PCA)和基于核函数的主成分分析(KPCA)入门

文章目录1 前言2 PCA的原理2.1 什么是投影2.2 投影后的方差2.3 转化为求特征值的问题2.4 符号的表示3 KPCA的原理4 PCA和KPCA在Python中的使用4.1 PCA的使用4.2 KPCA的使用5 参考文献1 前言 主成分分析是在做特征筛选时的重要手段&#xff0c;这个方法在大部分的书中都只是介绍…