LoginSignup
24
29

More than 5 years have passed since last update.

Rでスパースモデリング:glmnetの便利な補助ツール

Posted at

@tekenuko さんの下記記事が大変勉強になりました。

ところで最近は glmnet を便利に使うための補助ツールがいくつか登場していますので、簡単に紹介したいと思います。

glmnetUtils

glmnetUtilsglmnet を便利にしてくれるパッケージです。

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行で描けます。

ggfortify
library(ggfortify)

autoplot(Lasso2, xvar = "lambda")

glmnet_ggfortify.png

Cross-Validation 版についても同様です。

ggfortify
autoplot(fit.Lasso.cv2)

glmnet_ggfortify2.png

ただし、現在 CRAN にある ggfortify にはバグがあり、xvar 引数が効かないようです。

したがって、xvar を使いたい場合には github 版をインストールする必要があります。

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 形式にしてくれます。

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
glance_cv <- glance(fit.Lasso.cv2)
glance_cv
  lambda.min lambda.1se
1 0.03073584  0.5009175

tidy 化すると何が嬉しいかというと、tidyverse ツール群によって扱いやすくなります。

例えば ggplot2 パッケージでカスタマイズした可視化を行うことができます。

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_tidy.png

まとめ

glmnet の便利な補助ツールとして下記3つを紹介しました。

おまけ

今年もアドベントカレンダーの時期が来ました。
R関連のアドベントカレンダーがいくつか作られています。
簡単な記事でいいので参加してみると楽しいと思います。

Enjoy!

24
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
29