线性回归的延伸:多项式回归

线性回归模型尽管是最简单的模型,但它却有不少假设前提,其中最重要的一条就是响应变量和解释变量之间的确存在着线性关系,否则建立线性模型就是白搭。然而现实中的数据往往线性关系比较弱,甚至本来就不存在着线性关系,机器学习中有不少非线性模型,这里主要讲由线性模型扩展至非线性模型的多项式回归。

多项式回归

多项式回归就是把一次特征转换成高次特征的线性组合多项式,举例来说,对于一元线性回归模型:

一元线性回归模型

扩展成一元多项式回归模型就是:

一元多项式回归模型

这个最高次d应取合适的值,如果太大,模型会很复杂,容易过拟合。

这里以Wage数据集为例,只研究wage与单变量age的关系。

> library(ISLR)
> attach(Wage)
> plot(age,wage) # 首先散点图可视化,描述两个变量的关系
age vs wage

可见这两条变量之间根本不存在线性关系,最好是拟合一条曲线使散点均匀地分布在曲线两侧。于是尝试构建多项式回归模型。

> fit = lm(wage~poly(age,4),data = Wage) # 构建age的4次多项式模型
> 
> # 构造一组age值用来预测
> agelims = range(age)
> age.grid = seq(from=agelims[1],to=agelims[2])
> preds = predict(fit,newdata = list(age=age.grid),se=T)
> se.bands = cbind(preds$fit+2*preds$se.fit,preds$fit-2*preds$se.fit) # 构建预测值的置信区间
> 
> plot(age,wage,xlim=agelims,cex=0.5,col="darkgrey")
> title("Degree-4 Polynomial",outer = T)
> lines(age.grid,preds$fit,lwd=2,col="blue") # 多项式回归预测曲线
> matlines(age.grid,se.bands,lwd=2,col = "red",lty=3) # 置信区间曲线
4次多项式回归模型

从图中可见,采用4次多项式回归效果还不错。那么多项式回归的次数具体该如何确定?

在足以解释自变量和因变量关系的前提下,次数应该是越低越好。方差分析(ANOVA)也可用于模型间的检验,比较模型M1是否比一个更复杂的模型M2更好地解释了数据,但前提是M1和M2必须要有包含关系,即:M1的预测变量必须是M2的预测变量的子集。

> fit.1 = lm(wage~age,data = Wage)
> fit.2 = lm(wage~poly(age,2),data = Wage)
> fit.3 = lm(wage~poly(age,3),data = Wage)
> fit.4 = lm(wage~poly(age,4),data = Wage)
> fit.5 = lm(wage~poly(age,5),data = Wage)
> anova(fit.1,fit.2,fit.3,fit.4,fit.5)
Analysis of Variance Table

Model 1: wage ~ age
Model 2: wage ~ poly(age, 2)
Model 3: wage ~ poly(age, 3)
Model 4: wage ~ poly(age, 4)
Model 5: wage ~ poly(age, 5)
  Res.Df     RSS Df Sum of Sq        F    Pr(>F)    
1   2998 5022216                                    
2   2997 4793430  1    228786 143.5931 < 2.2e-16 ***
3   2996 4777674  1     15756   9.8888  0.001679 ** 
4   2995 4771604  1      6070   3.8098  0.051046 .  
5   2994 4770322  1      1283   0.8050  0.369682    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

可见1-3次模型p值过小,与其他模型有显著差异,说明拟合得不够。4-5次较为合适,也不必更大了。

如果这个方法不好理解,我们依然可以用万能的交叉验证法来选择最合适的次数。

> nrow(Wage)
[1] 3000
> train = sample(1:3000,2000)
> cv.err = vector("numeric",5)
> for(i in 1:5){
+   fit = lm(wage~poly(age,i),data = Wage,subset = train)
+   pred = predict(fit,newdata=Wage[-train,])
+   cv.err[i] = mean((pred-wage[-train])^2)
+ }
> cv.err
[1] 1901.318 1788.861 1782.721 1778.744 1777.856
> plot(1:5,cv.err,type="l")
不同次数的测试均方差

可见4是最合适的次数。

既然线性模型可扩展至非线性模型,那么由线性回归模型延伸的逻辑回归模型一样可以扩展至非线性模型。
由上面的散点图可以看出,250是wage的一个分界线,因此可以以wage是否大于250作为二分类问题。

fit = glm(I(wage>250)~poly(age,4),data = Wage,family = binomial) # 以250为界构建二分类逻辑回归模型
agelims = range(age)
age.grid = seq(from=agelims[1],to=agelims[2])
preds = predict(fit,newdata = list(age=age.grid),se=T)

# 将线性项映射到逻辑回归指数项
pfit = exp(preds$fit)/(1+exp(preds$fit))
se.bands.logit = cbind(preds$fit+2*preds$se.fit,preds$fit-2*preds$se.fit)
se.bands = exp(se.bands.logit)/(1+exp(se.bands.logit))

plot(age,I(wage>250),xlim=agelims,type="n")
points(jitter(age),I((wage/250)),cex=.5,pch="|",col="darkgrey")
lines(age.grid,pfit,lwd=2,col="blue")
matlines(age.grid,se.bands,lwd=2,col = "red",lty=3)
多项式逻辑回归概率曲线

因为样本本身极不均衡,所以置信区间曲线跨度也较大。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容