5分でわかるかもしれないglmnet

7,716 views

Published on

Published in: Technology

5分でわかるかもしれないglmnet

  1. 1. glmnet 第48回 勉強会@東京(#TokyoR) @teramonagi 5分でわかるかもしれない
  2. 2. 誰や?
  3. 3. 俺や • ID: @teramonagi • 職種:データ分析おじさん • 業務:ブカーの育成&会議&翻訳 • 言語:/R/F#/Ruby/Python/C++/ • 特技:早起き・根回し 3 優秀な新人怖い
  4. 4. glmnetとは glmnet = glm+愛の鞭 4 ※glm:一般化線形モデル(用の関数) ※一般化線形モデルの解説はしない
  5. 5. glmnetとは • 愛の鞭(正則化)を一般化線形モデル (GLM)に適用できるパッケージ • 愛の鞭(正則化)の種類 –Lasso (ラッソ, L1正則化) –Ridge(リッジ , L2正則化) –Elastic-net(L1+L2正則化) • カバーされているGLMなモデル –線形、(多項 or 多クラス)ロジス ティック、ポアソン、コックスモデル 5
  6. 6. モデルの目的関数 6 ラッソリッジ 尤度関数(モデル依存) 愛の鞭(正則化) Elastic-Net ※パラメーター推計の際には これが最小化される
  7. 7. パラメータ計算 • パラメーター推定のアルゴリズム –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. 8. 早速、使ってみる 8 #パッケージをインストールして読み込む install.packages("glmnet") library(glmnet)
  9. 9. データの取得 • 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)
  10. 10. 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での答え(混同行列)
  11. 11. 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と一致
  12. 12. 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) ※正解率が改善
  13. 13. 多クラスロジスティック回帰 • glmnetは多クラスロジステック回帰できる – 分類すべきクラス数が2ではなく複数 – 一対他分類器 ではない!!! • 他にもこれができるパッケージある – VGAMのvglm関数(2015年更新確認) – mlogitのmlogit関数(2013年更新停止) – nnetのmultinom関数(2015年更新確認) • でも、愛の鞭(正則化)があるし、あと開発者ら が「統計的学習の基礎」の著者らなんで、 glmnetでいきたい…(ちなみにnnetはRのコア メンバーBrian Ripley氏が開発されています) 13
  14. 14. 多クラスロジスティック回帰 • 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. 15. 多クラスロジスティック回帰 15 table(df$quality, quality_cv) • 結果を表示
  16. 16. みんな大好き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)
  17. 17. みんな大好きirisで 正解 予測値 17
  18. 18. ここがイケてないよglmnet • 引数(x, y)が行列限定 • 引数(x)が”数値”限定で、因子不可 • ガンガン使うようだったら、使い やすいように修正したパッケージ 作っちゃった方が楽かも? 18
  19. 19. 参考 • 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
  20. 20. Enjoy!!20

×