78-預(yù)測(cè)分析-R語(yǔ)言實(shí)現(xiàn)-嶺回歸與LASSO回歸

> library(pacman)
> p_load(dplyr, readr, caret)

以上一節(jié)中未去除離群值的MSE為3619.029悔常,修正R2為0.8603和去除離群值后的MSE為2690.545,修正R2為0.8706為基準(zhǔn),以及兩個(gè)模型在測(cè)試集上的MSE分別為2914.014和1672.859,對(duì)模型進(jìn)行改進(jìn)零截。

> results <- tribble(~ model, ~ mse, ~ r_square, ~ test_mse,
+                   "original", 3619.029, 0.8603, 2914.014,
+                   "remove_out", 2690.545, 0.8706, 1672.859)
> results
## # A tibble: 2 x 4
##   model        mse r_square test_mse
##   <chr>      <dbl>    <dbl>    <dbl>
## 1 original   3619.    0.860    2914.
## 2 remove_out 2691.    0.871    1673.

1锭汛、數(shù)據(jù)預(yù)處理

> machine <- read_csv("data_set/machine.data", col_names = F)
> names(machine) <- c("vendor", "model", "myct", "mmin", "mmax", 
+                     "cach", "chmin", "chmax", "prp", "erp")
> machine <- machine[, 3:9]
> 
> set.seed(123)
> ind <- createDataPartition(machine$prp, p = 0.85, list = F)
> 
> dtrain <- machine[ind, ]
> dtest <- machine[-ind, ]

2、縮減特征集

> ct <- trainControl(preProcOptions = list(cutoff = 0.75))
> set.seed(123)
> fit.step <- train(prp ~ ., data = dtrain, method = "lmStepAIC", 
+                   trControl = ct, preProcess = c("corr"), trace = F)
> 
> summary(fit.step$finalModel)
## 
## Call:
## lm(formula = .outcome ~ myct + mmin + mmax + cach + chmax, data = dat)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -163.94  -29.68    3.25   28.52  355.05 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6.024e+01  8.909e+00  -6.762 2.01e-10 ***
## myct         5.550e-02  1.998e-02   2.777 0.006084 ** 
## mmin         1.476e-02  2.006e-03   7.358 7.20e-12 ***
## mmax         5.725e-03  6.919e-04   8.275 3.33e-14 ***
## cach         5.693e-01  1.443e-01   3.944 0.000116 ***
## chmax        1.683e+00  2.301e-01   7.313 9.33e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 61.33 on 173 degrees of freedom
## Multiple R-squared:  0.8644, Adjusted R-squared:  0.8605 
## F-statistic: 220.6 on 5 and 173 DF,  p-value: < 2.2e-16
> compute_mse <- function(prediction, actual) {
+   mean((prediction - actual) ^ 2)
+ }
> 
> compute_mse(fit.step$finalModel$fitted.values, dtrain$prp)
## [1] 3634.847
> compute_mse(predict(fit.step, newdata = dtest), dtest$prp)
## [1] 2785.94

使用逐步回歸模型的結(jié)果為:

> results <- bind_rows(results, 
+                      tibble(model = "step",
+                             mse = 3634.847,
+                             r_square = 0.8605,
+                             test_mse = 2785.94))
> results
## # A tibble: 3 x 4
##   model        mse r_square test_mse
##   <chr>      <dbl>    <dbl>    <dbl>
## 1 original   3619.    0.860    2914.
## 2 remove_out 2691.    0.871    1673.
## 3 step       3635.    0.860    2786.

去掉離群值后管呵,再次逐步回歸:

> dtrain.new <- dtrain[!(rownames(dtrain)) %in% c(173), ]
> set.seed(123)
> fit.step.out <- train(prp ~ ., data = dtrain.new, method = "lmStepAIC", 
+                       trControl = ct, preProcess = c("corr"), trace = F)
> 
> summary(fit.step.out$finalModel)
## 
## Call:
## lm(formula = .outcome ~ myct + mmin + mmax + cach + chmax, data = dat)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -168.560  -23.668    2.268   21.691  271.120 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -4.474e+01  7.930e+00  -5.643 6.78e-08 ***
## myct         4.193e-02  1.731e-02   2.422   0.0165 *  
## mmin         1.697e-02  1.752e-03   9.690  < 2e-16 ***
## mmax         4.629e-03  6.125e-04   7.557 2.35e-12 ***
## cach         5.968e-01  1.244e-01   4.797 3.48e-06 ***
## chmax        1.168e+00  2.090e-01   5.588 8.84e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 52.85 on 172 degrees of freedom
## Multiple R-squared:  0.8702, Adjusted R-squared:  0.8664 
## F-statistic: 230.6 on 5 and 172 DF,  p-value: < 2.2e-16
> compute_mse(fit.step.out$finalModel$fitted.values, dtrain.new$prp)
## [1] 2698.78
> compute_mse(predict(fit.step.out, newdata = dtest), dtest$prp)
## [1] 1812.763
> results <- bind_rows(results, 
+                      tibble(model = "step_out",
+                             mse = 2698.78,
+                             r_square = 0.8664,
+                             test_mse = 1812.763))
> results
## # A tibble: 4 x 4
##   model        mse r_square test_mse
##   <chr>      <dbl>    <dbl>    <dbl>
## 1 original   3619.    0.860    2914.
## 2 remove_out 2691.    0.871    1673.
## 3 step       3635.    0.860    2786.
## 4 step_out   2699.    0.866    1813.

刪減特征后梳毙,模型在訓(xùn)練集上的mse都增大了,但在測(cè)試集上的mse卻減小了捐下。去除離群值后账锹,mse都有所增大。

3坷襟、正則化

嶺回歸和lasso都值得嘗試奸柬,當(dāng)依賴于輸入特征的某個(gè)子集的模型時(shí)往往用lasso表現(xiàn)更好;但當(dāng)很多不同變量的系數(shù)具有較大分散度的模型則往往在嶺回歸下有更好的表現(xiàn)婴程。

3.1 嶺回歸

但數(shù)據(jù)集維度很高時(shí)廓奕,尤其是和能獲得的觀測(cè)數(shù)據(jù)的數(shù)量相比很大時(shí),線性回歸往往會(huì)表現(xiàn)出非常高的方差档叔。

嶺回歸是一種通過(guò)其約束條件引入偏誤但能有效地減小模型方差的方法桌粉。

> set.seed(123)
> fit.ridge <- train(prp ~ ., data = dtrain, method = "ridge",
+                    trControl = ct, preProcess = c("corr"))
> 
> fit.ridge$bestTune
##   lambda
## 3    0.1
> fit.ridge$results$Rsquared[3]
## [1] 0.8058767
> compute_mse(predict(fit.ridge, newdata = dtrain), dtrain$prp)
## [1] 3730.474
> compute_mse(predict(fit.ridge, newdata = dtest), dtest$prp)
## [1] 2958.191
> results <- bind_rows(results, 
+                      tibble(model = "ridge",
+                             mse = 3730.474,
+                             r_square = 0.8059,
+                             test_mse = 2958.191))
> results
## # A tibble: 5 x 4
##   model        mse r_square test_mse
##   <chr>      <dbl>    <dbl>    <dbl>
## 1 original   3619.    0.860    2914.
## 2 remove_out 2691.    0.871    1673.
## 3 step       3635.    0.860    2786.
## 4 step_out   2699.    0.866    1813.
## 5 ridge      3730.    0.806    2958.

3.2 lasso回歸

lasso是嶺回歸的一種替代正則化方法。它們之間的差別體現(xiàn)在懲罰項(xiàng)里衙四,嶺回歸是將有效的將系數(shù)壓縮到更小的值铃肯,而lasso最小化的是系數(shù)的絕對(duì)值之和,由于lasso會(huì)把某些系數(shù)完全收縮到0传蹈,所以它兼具了選擇和收縮的功能押逼,這個(gè)是嶺回歸是不具備的步藕。

在模型中,當(dāng)alpha參數(shù)取值為0時(shí)是嶺回歸宴胧,alpha取值為1時(shí)是lasso漱抓。

> set.seed(123)
> fit.lasso <- train(prp ~ ., data = dtrain, method = "lasso",
+                    trControl = ct, preProcess = c("corr"))
> 
> fit.lasso$bestTune
##   fraction
## 3      0.9
> fit.lasso$results$Rsquared[3]
## [1] 0.7996164
> compute_mse(predict(fit.lasso, newdata = dtrain), dtrain$prp)
## [1] 3664.031
> compute_mse(predict(fit.lasso, newdata = dtest), dtest$prp)
## [1] 2628.372

最終選擇的是alpha=0,即嶺回歸模型。

> results <- bind_rows(results, 
+                      tibble(model = "lasso",
+                             mse = 3664.031,
+                             r_square = 0.7996,
+                             test_mse = 2628.372))
> results
## # A tibble: 6 x 4
##   model        mse r_square test_mse
##   <chr>      <dbl>    <dbl>    <dbl>
## 1 original   3619.    0.860    2914.
## 2 remove_out 2691.    0.871    1673.
## 3 step       3635.    0.860    2786.
## 4 step_out   2699.    0.866    1813.
## 5 ridge      3730.    0.806    2958.
## 6 lasso      3664.    0.800    2628.

綜合對(duì)比恕齐,數(shù)據(jù)在去除離群值的線性回歸模型上性能最優(yōu)乞娄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市显歧,隨后出現(xiàn)的幾起案子仪或,更是在濱河造成了極大的恐慌,老刑警劉巖士骤,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件范删,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拷肌,警方通過(guò)查閱死者的電腦和手機(jī)到旦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巨缘,“玉大人添忘,你說(shuō)我怎么就攤上這事∪羲” “怎么了搁骑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)又固。 經(jīng)常有香客問(wèn)我仲器,道長(zhǎng),這世上最難降的妖魔是什么仰冠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任乏冀,我火速辦了婚禮,結(jié)果婚禮上洋只,老公的妹妹穿的比我還像新娘辆沦。我一直安慰自己,他們只是感情好木张,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著端三,像睡著了一般舷礼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郊闯,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天妻献,我揣著相機(jī)與錄音蛛株,去河邊找鬼。 笑死育拨,一個(gè)胖子當(dāng)著我的面吹牛谨履,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播熬丧,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼笋粟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了析蝴?” 一聲冷哼從身側(cè)響起害捕,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闷畸,沒(méi)想到半個(gè)月后尝盼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佑菩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盾沫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殿漠。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赴精,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凸舵,到底是詐尸還是另有隱情祖娘,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布啊奄,位于F島的核電站渐苏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏菇夸。R本人自食惡果不足惜琼富,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庄新。 院中可真熱鬧鞠眉,春花似錦、人聲如沸择诈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)羞芍。三九已至哗戈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荷科,已是汗流浹背唯咬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工纱注, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胆胰。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓狞贱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蜀涨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞎嬉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348