glmnet 第48回 勉強会@東京(#TokyoR) @teramonagi 5分でわかるかもしれない
glmnet
第48回 勉強会@東京(#TokyoR)
@teramonagi
5分でわかるかもしれない
誰や?
俺や
• ID: @teramonagi
•職種:データ分析おじさん
•業務:ブカーの育成&会議&翻訳
•言語:/R/F#/Ruby/Python/C++/
•特技:早起き・根回し
3
優秀な新人怖い
glmnetとは
glmnet = glm+愛の鞭
4
※glm:一般化線形モデル(用の関数)
※一般化線形モデルの解説はしない
glmnetとは
• 愛の鞭(正則化)を一般化線形モデル(GLM)に適用できるパッケージ
• 愛の鞭(正則化)の種類
–Lasso (ラッソ, L1正則化)
–Ridge(リッジ , L2正則化)
–Elastic-net(L1+L2正則化)
• カバーされているGLMなモデル
–線形、(多項 or 多クラス)ロジスティック、ポアソン、コックスモデル
5
モデルの目的関数
6
ラッソ リッジ
尤度関数(モデル依存) 愛の鞭(正則化)
Elastic-Net ※パラメーター推計の際には
これが最小化される
パラメータ計算 • パラメーター推定のアルゴリズム
–Coordinate Descent • 詳細
–Friedman, J., Hastie, T. and Tibshirani, R. (2008) Regularization Paths for Generalized Linear Models via Coordinate Descent, Journal of Statistical Software, Vol. 33(1), 1-22 Feb 2010
–http://www.jstatsoft.org/v33/i01/
7
早速、使ってみる
8
#パッケージをインストールして読み込む
install.packages("glmnet") library(glmnet)
データの取得 • irisじゃつまらないので、 UCI machine learning
repositoryからワインデータ取得
9
library(dplyr) #ワインデータの読み込み(ダウンロード)
URL <- "http://archive.ics.uci.edu/ml/machine-learning-
databases/wine-quality/winequality-white.csv"
df <- read.csv(URL, sep = ";", stringsAsFactor=FALSE)
#ワインの質(quality)が5, 6のものだけ残して,0,1化する
wine <- df %>%
filter(quality==5|quality==6) %>%
mutate(quality=quality-5)
glmとの比較(2クラス分類)
10
#statsパッケージのglm(説明変数は適当)
wine_glm <- glm(
quality ~ residual.sugar+sulphates+alcohol,
data=wine, family=binomial) #質(quality)の予測(確率が0.5以上ならクラス1)
quality_glm <- predict(wine_glm, wine, type='response')
table(wine$quality, round(quality_glm))
※glmでの答え(混同行列)
glmとの比較(2クラス分類)
11
#いちいち行列に変換する必要がある
x <- wine %>%
select(residual.sugar, sulphates, alcohol) %>%
as.matrix
y <- wine %>% select(quality) %>% unlist #glmと同じ結果を出させる
#lambda単一の値は非推奨(らしい)が動く…
#lamdbaに複数入れておいて、predictの引数をs=0にするでもOK
wine_glmnet <- glmnet(x, y, family=“binomial”, lambda=0)
quality_glmnet <- predict(wine_glmnet, newx=x, type=“class”)
table(wine$quality, quality_glmnet)
※glmnetでの答え(混同行列)
※愛の鞭なしでglmと一致
glmnetのクロスバリデーション
• クロスバリデーションで愛の鞭の痛さを調整できます
12
#CVで最適な"お仕置き"を決定して計算
wine_cv <-
cv.glmnet(x, y, family="binomial", type.measure="class")
quality_cv <-
predict(wine_cv, newx=x, type="class", s="lambda.min")
table(wine$quality, quality_cv)
※正解率が改善
多クラスロジスティック回帰
• glmnetは多クラスロジステック回帰できる
–分類すべきクラス数が2ではなく複数
–一対他分類器 ではない!!!
• 他にもこれができるパッケージある
–VGAMのvglm関数(2015年更新確認)
–mlogitのmlogit関数(2013年更新停止)
– nnetのmultinom関数(2015年更新確認)
• でも、愛の鞭(正則化)があるし、あと開発者らが「統計的学習の基礎」の著者らなんで、glmnetでいきたい…(ちなみにnnetはRのコアメンバーBrian Ripley氏が開発されています)
13
多クラスロジスティック回帰
• family=“multinomial”とするだけ
•ワインデータはワイン全種類のものを使用(複数クラスなんで)
14
x <- df %>%
select(residual.sugar, sulphates, alcohol) %>%
as.matrix
y <- df %>% select(quality) %>% unlist
wine_cv <-
cv.glmnet(x, y, family="multinomial", type.measure="class")
quality_cv <-
predict(wine_cv, newx=x, type="class", s="lambda.min")
多クラスロジスティック回帰
15
table(df$quality, quality_cv)
•結果を表示
みんな大好きirisで
16
x <- as.matrix(iris[,-5])
y <- iris[,5]
iris_cv <-
cv.glmnet(x, y, family="multinomial", type.measure="class")
species_cv <-
predict(iris_cv, newx=x, type="class", s="lambda.min")
table(y, species_cv)
みんな大好きirisで
正解 予測値
17
ここがイケてないよglmnet
•引数(x, y)が行列限定
•引数(x)が”数値”限定で、因子不可
•ガンガン使うようだったら、使いやすいように修正したパッケージ作っちゃった方が楽かも?
18
参考 • glmnetパッケージのvignette
– http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html
• Friedman, J., Hastie, T. and Tibshirani, R. (2008) Regularization Paths for Generalized Linear Models via Coordinate Descent, Journal of Statistical Software, Vol. 33(1), 1-22 Feb 2010
– http://www.jstatsoft.org/v33/i01/
• LASSO and Ridge regression
– http://d.hatena.ne.jp/isseing333/20110309/1299675311 • リッジ/Ridge回帰、Lasso回帰、Elastic Net (R - glmnet)
– http://highschoolstudent.hatenablog.com/entry/2015/02/08/142354
• RでL1 / L2正則化を実践する
– http://tjo.hatenablog.com/entry/2015/03/03/190000
19
Enjoy!! 20