線性回歸模型盡管是最簡(jiǎn)單的模型疼邀,但它卻有不少假設(shè)前提匆赃,其中最重要的一條就是響應(yīng)變量和解釋變量之間的確存在著線性關(guān)系菩帝,否則建立線性模型就是白搭笛园。然而現(xiàn)實(shí)中的數(shù)據(jù)往往線性關(guān)系比較弱尝哆,甚至本來就不存在著線性關(guān)系绊含,機(jī)器學(xué)習(xí)中有不少非線性模型市殷,這里主要講由線性模型擴(kuò)展至非線性模型的多項(xiàng)式回歸纫事。
多項(xiàng)式回歸
多項(xiàng)式回歸
就是把一次特征轉(zhuǎn)換成高次特征的線性組合多項(xiàng)式渗鬼,舉例來說览露,對(duì)于一元線性回歸模型:
擴(kuò)展成一元多項(xiàng)式回歸模型就是:
這個(gè)最高次d應(yīng)取合適的值,如果太大乍钻,模型會(huì)很復(fù)雜肛循,容易過擬合铭腕。
這里以Wage
數(shù)據(jù)集為例,只研究wage
與單變量age
的關(guān)系多糠。
> library(ISLR)
> attach(Wage)
> plot(age,wage) # 首先散點(diǎn)圖可視化累舷,描述兩個(gè)變量的關(guān)系
可見這兩條變量之間根本不存在線性關(guān)系,最好是擬合一條曲線使散點(diǎn)均勻地分布在曲線兩側(cè)夹孔。于是嘗試構(gòu)建多項(xiàng)式回歸模型被盈。
> fit = lm(wage~poly(age,4),data = Wage) # 構(gòu)建age的4次多項(xiàng)式模型
>
> # 構(gòu)造一組age值用來預(yù)測(cè)
> 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) # 構(gòu)建預(yù)測(cè)值的置信區(qū)間
>
> 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") # 多項(xiàng)式回歸預(yù)測(cè)曲線
> matlines(age.grid,se.bands,lwd=2,col = "red",lty=3) # 置信區(qū)間曲線
從圖中可見,采用4次多項(xiàng)式回歸效果還不錯(cuò)搭伤。那么多項(xiàng)式回歸的次數(shù)具體該如何確定只怎?
在足以解釋自變量和因變量關(guān)系的前提下,次數(shù)應(yīng)該是越低越好怜俐。方差分析
(ANOVA)也可用于模型間的檢驗(yàn)身堡,比較模型M1是否比一個(gè)更復(fù)雜的模型M2更好地解釋了數(shù)據(jù),但前提是M1和M2必須要有包含關(guān)系拍鲤,即:M1的預(yù)測(cè)變量必須是M2的預(yù)測(cè)變量的子集贴谎。
> 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次較為合適,也不必更大了景鼠。
如果這個(gè)方法不好理解仲翎,我們依然可以用萬能的交叉驗(yàn)證法來選擇最合適的次數(shù)铛漓。
> 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是最合適的次數(shù)溯香。
既然線性模型可擴(kuò)展至非線性模型,那么由線性回歸模型延伸的邏輯回歸模型一樣可以擴(kuò)展至非線性模型票渠。
由上面的散點(diǎn)圖可以看出逐哈,250是wage的一個(gè)分界線,因此可以以wage是否大于250作為二分類問題问顷。
fit = glm(I(wage>250)~poly(age,4),data = Wage,family = binomial) # 以250為界構(gòu)建二分類邏輯回歸模型
agelims = range(age)
age.grid = seq(from=agelims[1],to=agelims[2])
preds = predict(fit,newdata = list(age=age.grid),se=T)
# 將線性項(xiàng)映射到邏輯回歸指數(shù)項(xiàng)
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)
因?yàn)闃颖颈旧順O不均衡昂秃,所以置信區(qū)間曲線跨度也較大。