@tekenuko さんの下記記事が大変勉強になりました。
ところで最近は glmnet を便利に使うための補助ツールがいくつか登場していますので、簡単に紹介したいと思います。
glmnetUtils
glmnetUtils は glmnet を便利にしてくれるパッケージです。
glmnet では、データを目的変数と説明変数に分ける必要がありました。
library(MASS)
# 目的変数、説明変数
y <- as.matrix(Boston[, 14])
X <- as.matrix(Boston[, -14])
# モデリング
library(glmnet)
Lasso <- glmnet(x = X, y = y, alpha = 1)
R に使い慣れていると、これは不便です。他のモデルでやるように y ~ x
のように指定したくなります。
glmnetUtils はモデルの指定にフォーミュラを使えるように拡張してくれます。
library(glmnetUtils)
Lasso2 <- glmnet(medv ~ ., data = Boston)
Cross-Validation を使った場合も同様に書けます。
fit.Lasso.cv2 <- cv.glmnet(medv ~ ., data = Boston,
nfolds = 10,
alpha = 1,
standardize = TRUE)
ggfortify
ggfortify は様々なモデルに対するプロットを ggplot2 バージョンにしてくれるパッケージです。
上記記事では解パスのプロットを自作していますが、ggfortify を使えばほとんど同じものが1行で描けます。
library(ggfortify)
autoplot(Lasso2, xvar = "lambda")
Cross-Validation 版についても同様です。
autoplot(fit.Lasso.cv2)
ただし、現在 CRAN にある ggfortify にはバグがあり、xvar
引数が効かないようです。
したがって、xvar
を使いたい場合には github 版をインストールする必要があります。
library(githubinstall)
githubinstall("ggfortify")
Suggestion:
- sinhrks/ggfortify Define fortify and autoplot functions to allow ggplot2 to handle some popular R packages.
Do you want to install the package (Y/n)?
本当にインストールするか確認されますので Y をタイプしてエンターキーを押してください。
broom
broom パッケージは、モデルの学習結果を tidy 形式にしてくれます。
library(broom)
tidied_cv <- tidy(fit.Lasso.cv2)
head(tidied_cv)
lambda estimate std.error conf.high conf.low nzero
1 6.777654 84.00465 7.581133 91.58578 76.42351 0
2 6.175546 77.22933 7.550938 84.78027 69.67839 1
3 5.626927 70.74545 7.112371 77.85782 63.63308 2
4 5.127046 64.64968 6.747361 71.39704 57.90232 2
5 4.671574 59.19335 6.302313 65.49567 52.89104 2
6 4.256564 54.54324 5.841787 60.38503 48.70145 2
glance_cv <- glance(fit.Lasso.cv2)
glance_cv
lambda.min lambda.1se
1 0.03073584 0.5009175
tidy 化すると何が嬉しいかというと、tidyverse ツール群によって扱いやすくなります。
例えば ggplot2 パッケージでカスタマイズした可視化を行うことができます。
library(ggplot2)
ggplot(tidied_cv, aes(lambda, estimate)) + geom_line(color = "red") +
geom_ribbon(aes(ymin = conf.low, ymax = conf.high), alpha = .2) +
scale_x_log10() +
geom_vline(xintercept = glance_cv$lambda.min) +
geom_vline(xintercept = glance_cv$lambda.1se, lty = 2)
まとめ
glmnet の便利な補助ツールとして下記3つを紹介しました。
- glmnetUtils
- ggfortify
- broom
おまけ
今年もアドベントカレンダーの時期が来ました。
R関連のアドベントカレンダーがいくつか作られています。
簡単な記事でいいので参加してみると楽しいと思います。
- R Advent Calendar 2017
- RStudio Advent Calendar 2017
- Stan Advent Calendar 2017
- tidyポエム Advent Calendar 2017
Enjoy!