Teraz nadszedł czas na przetestowanie tych metod (regresja grzbietowa i lasso) oraz metod oceny (zestaw walidacyjny, walidacja krzyżowa) na innych zbiorach danych. Możesz pracować z zespołem nad tą częścią laboratorium.

Możesz użyć dowolnego zbioru danych zawartego w ISLR lub wybrać jeden z pakietów danych na Kaggle/Data World itp. (zmienna zależna musi być ciągła).

Pobierz zbiór danych i spróbuj określić optymalny zestaw parametrów, które należy użyć do jego modelowania!

data(Boston)
data <- Boston
x = model.matrix(medv ~ ., data)[, -1]
y = data$medv

Regresja grzbietowa

grid = 10^seq(10, -2, length = 100)
ridge_mod = glmnet(x,y, alpha = 0, lambda = grid)
dim(coef(ridge_mod))
## [1]  14 100
plot(ridge_mod)

ridge_mod$lambda[50]
## [1] 11497.57
coef(ridge_mod)[,50] 
##   (Intercept)          crim            zn         indus          chas 
##  2.255401e+01 -3.305151e-04  1.131176e-04 -5.160096e-04  5.066065e-03 
##           nox            rm           age           dis           rad 
## -2.697423e-02  7.256984e-03 -9.791268e-05  8.654283e-04 -3.203678e-04 
##           tax       ptratio         black         lstat 
## -2.033098e-05 -1.718182e-03  2.672815e-05 -7.566302e-04
sqrt(sum(coef(ridge_mod)[-1,50]^2))
## [1] 0.02847302
predict(ridge_mod, s = 50, type = "coefficients")
## 14 x 1 sparse Matrix of class "dgCMatrix"
##                       s1
## (Intercept) 23.580881779
## crim        -0.036358794
## zn           0.011707752
## indus       -0.052663644
## chas         0.914385347
## nox         -2.584648038
## rm           1.136076181
## age         -0.008821137
## dis          0.021708896
## rad         -0.026332105
## tax         -0.002040002
## ptratio     -0.238276456
## black        0.003150038
## lstat       -0.106839435
set.seed(1)

train = Boston %>%
  sample_frac(0.5)

test = Boston %>%
  setdiff(train)

x_train = model.matrix(medv ~ ., data)[, -1]
x_test = model.matrix(medv ~ ., data)[, -1]

y_train = data$medv
y_test = data$medv
ridge_mod <- glmnet(x_train, y_train, alpha = 0, lambda = grid, thresh = 1e-12)
ridge_pred <- predict(ridge_mod, s = 4, newx = x_test)
mean((ridge_pred - y_test)^2)
## [1] 25.84755
mean((mean(y_train) - y_test)^2)
## [1] 84.41956
ridge_pred = predict(ridge_mod, s = 1e10, newx = x_test)
mean((ridge_pred - y_test)^2)
## [1] 84.41956
ridge_pred = predict(ridge_mod, s = 0, newx = x_test)
mean((ridge_pred - y_test)^2)
## [1] 21.89515
predict(ridge_mod, s = 0, type="coefficients")
## 14 x 1 sparse Matrix of class "dgCMatrix"
##                        s1
## (Intercept)  3.625092e+01
## crim        -1.074746e-01
## zn           4.605961e-02
## indus        1.863996e-02
## chas         2.694201e+00
## nox         -1.763377e+01
## rm           3.816640e+00
## age          5.672411e-04
## dis         -1.468547e+00
## rad          3.015118e-01
## tax         -1.211459e-02
## ptratio     -9.506368e-01
## black        9.309147e-03
## lstat       -5.237534e-01
set.seed(1)
cv.out = cv.glmnet(x_train, y_train, alpha = 0) 
bestlam = cv.out$lambda.min
bestlam
## [1] 0.6777654
plot(cv.out)

ridge_pred = predict(ridge_mod, s = bestlam, newx = x_test) 
mse_ridge_best <-mean((ridge_pred - y_test)^2)
mse_ridge_best
## [1] 22.41216
out = glmnet(x, y, alpha = 0) 
predict(out, type = "coefficients", s = bestlam)
## 14 x 1 sparse Matrix of class "dgCMatrix"
##                        s1
## (Intercept)  28.001475824
## crim         -0.087572712
## zn            0.032681030
## indus        -0.038003639
## chas          2.899781645
## nox         -11.913360479
## rm            4.011308385
## age          -0.003731470
## dis          -1.118874607
## rad           0.153730052
## tax          -0.005751054
## ptratio      -0.854984614
## black         0.009073740
## lstat        -0.472423800

Regresja LASSO

lasso_mod = glmnet(x_train, y_train,  alpha = 1, lambda = grid) 

plot(lasso_mod)  
## Warning in regularize.values(x, y, ties, missing(ties), na.rm = na.rm):
## collapsing to unique 'x' values

set.seed(1)
cv.out = cv.glmnet(x_train, y_train, alpha = 1) 
plot(cv.out)

bestlam = cv.out$lambda.min
lasso_pred = predict(lasso_mod, s = bestlam, newx = x_test)
mse_lasso_best <-mean((lasso_pred - y_test)^2)
mse_lasso_best
## [1] 21.93022
out = glmnet(x, y, alpha = 1, lambda = grid)
lasso_coef = predict(out, type = "coefficients", s = bestlam)
lasso_coef
## 14 x 1 sparse Matrix of class "dgCMatrix"
##                       s1
## (Intercept)  34.59112629
## crim         -0.09942097
## zn            0.04172386
## indus         .         
## chas          2.68709777
## nox         -16.37549778
## rm            3.86035819
## age           .         
## dis          -1.40244716
## rad           0.25755080
## tax          -0.01002082
## ptratio      -0.93198043
## black         0.00905537
## lstat        -0.52259709
lasso_coef[lasso_coef != 0]
##  [1]  34.59112629  -0.09942097   0.04172386   2.68709777 -16.37549778
##  [6]   3.86035819  -1.40244716   0.25755080  -0.01002082  -0.93198043
## [11]   0.00905537  -0.52259709

OLS

lm_fit <- lm(medv ~ ., data=train)
pred_ols <- predict(lm_fit, newdata=test)
mse_ols <- mean((pred_ols - test$medv)^2)
mse_ols
## [1] 26.86123
mse_mean <- mean((mean(y_train) - y_test)^2)
mse_mean
## [1] 84.41956
cbind(
  MSE_RidgeBest = mse_ridge_best,
  MSE_LassoBest = mse_lasso_best,
  MSE_OLS       = mse_ols,
  MSE_MeanModel = mse_mean
)
##      MSE_RidgeBest MSE_LassoBest  MSE_OLS MSE_MeanModel
## [1,]      22.41216      21.93022 26.86123      84.41956
  • Który zbiór danych wybrałeś?

Wybrałyśmy zbiór danych Boston z pakietu MASS. Zawiera on informacje o różnych cechach (np. zanieczyszczenie powietrza, wiek budynków, przestępczość) i medianę cen nieruchomości w rejonie Bostonu.

  • Jaka była Twoja zmienna zależna (tzn. co próbowałeś modelować)?

Zmienną zależną jest medv – mediana ceny domów (w tysiącach dolarów).

  • Czy oczekiwałeś, że regresja grzbietowa będzie lepsza od lasso, czy odwrotnie? Jak wypada w stosunku do OLS? Pokaż odpowiednie raporty, miary dopasowania i krótko je omów (porównaj).

Wyniki zależą od konkretnego losowania zbioru treningowego i liczby cech. Zazwyczaj obie metody (Ridge i Lasso) wychodzą lepiej niż OLS (niższe MSE), choć różnica między nimi bywa niewielka. Ridge sprawdza się dobrze przy wielu skorelowanych zmiennych, bo rozprasza wpływ. Lasso dodatkowo wykonuje selekcję zmiennych (zeruje część współczynników).

W tym przykładzie (przy losowym podziale) zarówno Ridge, jak i Lasso mają mniejsze MSE niż OLS, więc obie metody radzą sobie lepiej niż zwykła regresja. Różnica między Ridge i Lasso jest niewielka.

  • Które predyktory okazały się ważne w ostatecznym modelu (modelach)?

Ridge: wszystkie są w modelu z pewnymi wagami. Lasso: w ostatecznym modelu (przy bestlam) ulega wyzerowaniu indus oraz age

Zastosowaliśmy regresję grzbietową (Ridge) i Lasso do zbioru Boston, porównaliśmy z OLS, oceniliśmy modele na zbiorze testowym i metodą walidacji krzyżowej (CV). Wyniki pokazują, że regularyzacja pomaga obniżyć błąd predykcji w stosunku do modelu klasycznego (OLS), a Lasso dodatkowo dokonuje selekcji zmiennych.

LS0tCnRpdGxlOiAiTmlla2xhc3ljem5lIG1ldG9keSBzdGF0eXN0eWtpIgphdXRob3I6ICJBbGVrc2FuZHJhIE9jemNob3dza2EgLSBCxJliZW4gaSBLaW5nYSBEZXJld2Vja2EiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY2VydWxlYW4KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUKICAgIGZvbnRzaXplOiAxMHB0CiAgICB0b2M6IHllcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogbm8KICAgIGRmX3ByaW50OiBkZWZhdWx0CiAgICB0b2NfZGVwdGg6IDUKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnNScKc3VidGl0bGU6IFJlZ3VsYXJ5emFjamEKZWRpdG9yX29wdGlvbnM6CiAgbWFya2Rvd246CiAgICB3cmFwOiA3MgotLS0KCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KbGlicmFyeShNQVNTKQpsaWJyYXJ5KGdsbW5ldCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKYGBgCgpUZXJheiBuYWRzemVkxYIgY3phcyBuYSBwcnpldGVzdG93YW5pZSB0eWNoIG1ldG9kIChyZWdyZXNqYSBncnpiaWV0b3dhIGkgbGFzc28pIG9yYXogbWV0b2Qgb2NlbnkgKHplc3RhdyB3YWxpZGFjeWpueSwgd2FsaWRhY2phIGtyennFvG93YSkgbmEgaW5ueWNoIHpiaW9yYWNoIGRhbnljaC4gTW/FvGVzeiBwcmFjb3dhxIcgeiB6ZXNwb8WCZW0gbmFkIHTEhSBjesSZxZtjacSFIGxhYm9yYXRvcml1bS4KCk1vxbxlc3ogdcW8ecSHIGRvd29sbmVnbyB6YmlvcnUgZGFueWNoIHphd2FydGVnbyB3ICoqSVNMUioqIGx1YiB3eWJyYcSHIGplZGVuIHogcGFraWV0w7N3IGRhbnljaCBuYSBLYWdnbGUvRGF0YSBXb3JsZCBpdHAuICh6bWllbm5hIHphbGXFvG5hIG11c2kgYnnEhyBjacSFZ8WCYSkuIAoKUG9iaWVyeiB6YmnDs3IgZGFueWNoIGkgc3Byw7NidWogb2tyZcWbbGnEhyBvcHR5bWFsbnkgemVzdGF3IHBhcmFtZXRyw7N3LCBrdMOzcmUgbmFsZcW8eSB1xbx5xIcgZG8gamVnbyBtb2RlbG93YW5pYSEKCgpgYGB7cn0KZGF0YShCb3N0b24pCmBgYAoKCmBgYHtyfQpkYXRhIDwtIEJvc3Rvbgp4ID0gbW9kZWwubWF0cml4KG1lZHYgfiAuLCBkYXRhKVssIC0xXQp5ID0gZGF0YSRtZWR2CmBgYAoKUmVncmVzamEgZ3J6YmlldG93YQpgYGB7cn0KZ3JpZCA9IDEwXnNlcSgxMCwgLTIsIGxlbmd0aCA9IDEwMCkKcmlkZ2VfbW9kID0gZ2xtbmV0KHgseSwgYWxwaGEgPSAwLCBsYW1iZGEgPSBncmlkKQpgYGAKCmBgYHtyfQpkaW0oY29lZihyaWRnZV9tb2QpKQpwbG90KHJpZGdlX21vZCkKYGBgCgpgYGB7cn0KcmlkZ2VfbW9kJGxhbWJkYVs1MF0KY29lZihyaWRnZV9tb2QpWyw1MF0gCmBgYAoKYGBge3J9CnNxcnQoc3VtKGNvZWYocmlkZ2VfbW9kKVstMSw1MF1eMikpCmBgYAoKYGBge3J9CnByZWRpY3QocmlkZ2VfbW9kLCBzID0gNTAsIHR5cGUgPSAiY29lZmZpY2llbnRzIikKYGBgCgoKYGBge3J9CnNldC5zZWVkKDEpCgp0cmFpbiA9IEJvc3RvbiAlPiUKICBzYW1wbGVfZnJhYygwLjUpCgp0ZXN0ID0gQm9zdG9uICU+JQogIHNldGRpZmYodHJhaW4pCgp4X3RyYWluID0gbW9kZWwubWF0cml4KG1lZHYgfiAuLCBkYXRhKVssIC0xXQp4X3Rlc3QgPSBtb2RlbC5tYXRyaXgobWVkdiB+IC4sIGRhdGEpWywgLTFdCgp5X3RyYWluID0gZGF0YSRtZWR2CnlfdGVzdCA9IGRhdGEkbWVkdgpgYGAKCmBgYHtyfQpyaWRnZV9tb2QgPC0gZ2xtbmV0KHhfdHJhaW4sIHlfdHJhaW4sIGFscGhhID0gMCwgbGFtYmRhID0gZ3JpZCwgdGhyZXNoID0gMWUtMTIpCnJpZGdlX3ByZWQgPC0gcHJlZGljdChyaWRnZV9tb2QsIHMgPSA0LCBuZXd4ID0geF90ZXN0KQptZWFuKChyaWRnZV9wcmVkIC0geV90ZXN0KV4yKQoKYGBgCmBgYHtyfQptZWFuKChtZWFuKHlfdHJhaW4pIC0geV90ZXN0KV4yKQpgYGAKYGBge3J9CnJpZGdlX3ByZWQgPSBwcmVkaWN0KHJpZGdlX21vZCwgcyA9IDFlMTAsIG5ld3ggPSB4X3Rlc3QpCm1lYW4oKHJpZGdlX3ByZWQgLSB5X3Rlc3QpXjIpCmBgYAoKYGBge3J9CnJpZGdlX3ByZWQgPSBwcmVkaWN0KHJpZGdlX21vZCwgcyA9IDAsIG5ld3ggPSB4X3Rlc3QpCm1lYW4oKHJpZGdlX3ByZWQgLSB5X3Rlc3QpXjIpCmBgYAoKYGBge3J9CnByZWRpY3QocmlkZ2VfbW9kLCBzID0gMCwgdHlwZT0iY29lZmZpY2llbnRzIikKYGBgCgpgYGB7cn0Kc2V0LnNlZWQoMSkKY3Yub3V0ID0gY3YuZ2xtbmV0KHhfdHJhaW4sIHlfdHJhaW4sIGFscGhhID0gMCkgCmJlc3RsYW0gPSBjdi5vdXQkbGFtYmRhLm1pbgpiZXN0bGFtCmBgYApgYGB7cn0KcGxvdChjdi5vdXQpCmBgYApgYGB7cn0KcmlkZ2VfcHJlZCA9IHByZWRpY3QocmlkZ2VfbW9kLCBzID0gYmVzdGxhbSwgbmV3eCA9IHhfdGVzdCkgCm1zZV9yaWRnZV9iZXN0IDwtbWVhbigocmlkZ2VfcHJlZCAtIHlfdGVzdCleMikKbXNlX3JpZGdlX2Jlc3QKYGBgCgpgYGB7cn0Kb3V0ID0gZ2xtbmV0KHgsIHksIGFscGhhID0gMCkgCnByZWRpY3Qob3V0LCB0eXBlID0gImNvZWZmaWNpZW50cyIsIHMgPSBiZXN0bGFtKQpgYGAKClJlZ3Jlc2phIExBU1NPCmBgYHtyfQpsYXNzb19tb2QgPSBnbG1uZXQoeF90cmFpbiwgeV90cmFpbiwgIGFscGhhID0gMSwgbGFtYmRhID0gZ3JpZCkgCgpwbG90KGxhc3NvX21vZCkgIApgYGAKCmBgYHtyfQpzZXQuc2VlZCgxKQpjdi5vdXQgPSBjdi5nbG1uZXQoeF90cmFpbiwgeV90cmFpbiwgYWxwaGEgPSAxKSAKcGxvdChjdi5vdXQpCmBgYApgYGB7cn0KYmVzdGxhbSA9IGN2Lm91dCRsYW1iZGEubWluCmxhc3NvX3ByZWQgPSBwcmVkaWN0KGxhc3NvX21vZCwgcyA9IGJlc3RsYW0sIG5ld3ggPSB4X3Rlc3QpCm1zZV9sYXNzb19iZXN0IDwtbWVhbigobGFzc29fcHJlZCAtIHlfdGVzdCleMikKbXNlX2xhc3NvX2Jlc3QKYGBgCgpgYGB7cn0Kb3V0ID0gZ2xtbmV0KHgsIHksIGFscGhhID0gMSwgbGFtYmRhID0gZ3JpZCkKbGFzc29fY29lZiA9IHByZWRpY3Qob3V0LCB0eXBlID0gImNvZWZmaWNpZW50cyIsIHMgPSBiZXN0bGFtKQpsYXNzb19jb2VmCmBgYAoKYGBge3J9Cmxhc3NvX2NvZWZbbGFzc29fY29lZiAhPSAwXQpgYGAKT0xTCmBgYHtyfQpsbV9maXQgPC0gbG0obWVkdiB+IC4sIGRhdGE9dHJhaW4pCnByZWRfb2xzIDwtIHByZWRpY3QobG1fZml0LCBuZXdkYXRhPXRlc3QpCm1zZV9vbHMgPC0gbWVhbigocHJlZF9vbHMgLSB0ZXN0JG1lZHYpXjIpCm1zZV9vbHMKYGBgCmBgYHtyfQptc2VfbWVhbiA8LSBtZWFuKChtZWFuKHlfdHJhaW4pIC0geV90ZXN0KV4yKQptc2VfbWVhbgpgYGAKYGBge3J9CmNiaW5kKAogIE1TRV9SaWRnZUJlc3QgPSBtc2VfcmlkZ2VfYmVzdCwKICBNU0VfTGFzc29CZXN0ID0gbXNlX2xhc3NvX2Jlc3QsCiAgTVNFX09MUyAgICAgICA9IG1zZV9vbHMsCiAgTVNFX01lYW5Nb2RlbCA9IG1zZV9tZWFuCikKYGBgCgoKIC0gS3TDs3J5IHpiacOzciBkYW55Y2ggd3licmHFgmXFmz8KCld5YnJhxYJ5xZtteSB6YmnDs3IgZGFueWNoIEJvc3RvbiB6IHBha2lldHUgTUFTUy4gWmF3aWVyYSBvbiBpbmZvcm1hY2plIG8gcsOzxbxueWNoIGNlY2hhY2ggKG5wLiB6YW5pZWN6eXN6Y3plbmllIHBvd2lldHJ6YSwgd2llayBidWR5bmvDs3csIHByemVzdMSZcGN6b8WbxIcpIGkgbWVkaWFuxJkgY2VuIG5pZXJ1Y2hvbW/Fm2NpIHcgcmVqb25pZSBCb3N0b251LiAKCi0gSmFrYSBiecWCYSBUd29qYSB6bWllbm5hIHphbGXFvG5hICh0em4uIGNvIHByw7Nib3dhxYJlxZsgbW9kZWxvd2HEhyk/CgpabWllbm7EhSB6YWxlxbxuxIUgIGplc3QgbWVkdiDigJMgbWVkaWFuYSBjZW55IGRvbcOzdyAodyB0eXNpxIVjYWNoIGRvbGFyw7N3KS4KCiAtIEN6eSBvY3pla2l3YcWCZcWbLCDFvGUgcmVncmVzamEgZ3J6YmlldG93YSBixJlkemllIGxlcHN6YSBvZCBsYXNzbywgY3p5IG9kd3JvdG5pZT8gSmFrIHd5cGFkYSB3IHN0b3N1bmt1IGRvIE9MUz8gUG9rYcW8IG9kcG93aWVkbmllIHJhcG9ydHksIG1pYXJ5IGRvcGFzb3dhbmlhIGkga3LDs3RrbyBqZSBvbcOzdyAocG9yw7N3bmFqKS4KIApXeW5pa2kgemFsZcW8xIUgb2Qga29ua3JldG5lZ28gbG9zb3dhbmlhIHpiaW9ydSB0cmVuaW5nb3dlZ28gaSBsaWN6YnkgY2VjaC4gWmF6d3ljemFqIG9iaWUgbWV0b2R5IChSaWRnZSBpIExhc3NvKSB3eWNob2R6xIUgbGVwaWVqIG5pxbwgT0xTIChuacW8c3plIE1TRSksIGNob8SHIHLDs8W8bmljYSBtacSZZHp5IG5pbWkgYnl3YSBuaWV3aWVsa2EuClJpZGdlIHNwcmF3ZHphIHNpxJkgZG9icnplIHByenkgd2llbHUgc2tvcmVsb3dhbnljaCB6bWllbm55Y2gsIGJvIHJvenByYXN6YSB3cMWCeXcuCkxhc3NvIGRvZGF0a293byB3eWtvbnVqZSBzZWxla2NqxJkgem1pZW5ueWNoICh6ZXJ1amUgY3rEmcWbxIcgd3Nww7PFgmN6eW5uaWvDs3cpLgogClcgdHltIHByenlrxYJhZHppZSAocHJ6eSBsb3Nvd3ltIHBvZHppYWxlKSB6YXLDs3dubyBSaWRnZSwgamFrIGkgTGFzc28gbWFqxIUgbW5pZWpzemUgTVNFIG5pxbwgT0xTLCB3acSZYyBvYmllIG1ldG9keSByYWR6xIUgc29iaWUgbGVwaWVqIG5pxbwgend5a8WCYSByZWdyZXNqYS4gUsOzxbxuaWNhIG1pxJlkenkgUmlkZ2UgaSBMYXNzbyBqZXN0IG5pZXdpZWxrYS4KIAogLSBLdMOzcmUgcHJlZHlrdG9yeSBva2F6YcWCeSBzacSZIHdhxbxuZSB3IG9zdGF0ZWN6bnltIG1vZGVsdSAobW9kZWxhY2gpPwogClJpZGdlOiB3c3p5c3RraWUgc8SFIHcgbW9kZWx1IHogcGV3bnltaSB3YWdhbWkuCkxhc3NvOiB3IG9zdGF0ZWN6bnltIG1vZGVsdSAocHJ6eSBiZXN0bGFtKSAgdWxlZ2Egd3l6ZXJvd2FuaXUgaW5kdXMgb3JheiBhZ2UKCgpaYXN0b3Nvd2FsacWbbXkgcmVncmVzasSZIGdyemJpZXRvd8SFIChSaWRnZSkgaSBMYXNzbyBkbyB6YmlvcnUgQm9zdG9uLCBwb3LDs3duYWxpxZtteSB6IE9MUywgb2NlbmlsacWbbXkgbW9kZWxlIG5hIHpiaW9yemUgdGVzdG93eW0gaSBtZXRvZMSFIHdhbGlkYWNqaSBrcnp5xbxvd2VqIChDVikuIFd5bmlraSBwb2thenVqxIUsIMW8ZSByZWd1bGFyeXphY2phIHBvbWFnYSBvYm5pxbx5xIcgYsWCxIVkIHByZWR5a2NqaSB3IHN0b3N1bmt1IGRvIG1vZGVsdSBrbGFzeWN6bmVnbyAoT0xTKSwgYSBMYXNzbyBkb2RhdGtvd28gZG9rb251amUgc2VsZWtjamkgem1pZW5ueWNoLg==