とある技術者の徒然草

生産技術者の適当な日記(統計言語Rに関するメモがメイン)

【R言語】glmnetでlasso回帰 plotmoパッケージでsoluthion pathにラベルを付け

soluthion pathにラベルを付けるには?

glmnetのplotではsoluthion pathにラベルが付かない。
変数が多いと似たような色になるので、 ラムダを変化したとき偏回帰係数の変化がわからない。 plotmoパッケージでラベルを付けることができた。

・ コード

#American Community SurveyのデータセットをDL
acs <- read.table("http://jaredlander.com/data/acs_ny.csv",sep=",",header=TRUE)
#ロジスティック回帰のため二値のIncome変数を作成します
acs$Income <- with(acs,FamilyIncome >= 15000)

library(glmnet)
library(glmnetUtils)
library(ggfortify)

acs_lasso <- glmnet(Income~NumBedrooms +NumChildren + NumPeople + NumRooms + NumUnits + NumVehicles + NumWorkers + OwnRent +YearBuilt +
                      ElectricBill+FoodStamp+HeatingFuel+Insurance+Language, data = acs)

autoplot(acs_lasso,xvar ="lambda")


#係数パスにラベルをつける

#1 plotmoパッケージを使う
install.packages("plotmo")
library(plotmo) # for plot_glmnet
#ラベルを10個表示
plot_glmnet(acs_lasso)
#x軸の向きを変更、ラベルの表示数を5個に変更
plot_glmnet(acs_lasso, xvar = "lambda", label = 5)
#gridを表示
plot_glmnet(acs_lasso, xvar = "lambda", label = 5,grid.col="lightgray")

#2 ラベルを上書きする関数を作成する

lbs_fun <- function(fit, ...) {
  L <- length(fit$lambda)
  x <- log(fit$lambda[L])
  y <- fit$beta[, L]
  labs <- names(y)
  text(x, y, labels=labs, ...)
}

plot(acs_lasso, xvar="lambda")
lbs_fun(acs_lasso)

#ハイパーパラメータのラムダを変化させる

acsCV4 <- cv.glmnet(Income~NumBedrooms +NumChildren + NumPeople + NumRooms + NumUnits + NumVehicles + NumWorkers + OwnRent +YearBuilt +
                      ElectricBill+FoodStamp+HeatingFuel+Insurance+Language,data=acs,family="binomial",nfolds  = 5,parallel = TRUE,alpha = 1)

autoplot(acsCV4)

acsCV4$lambda.1se
acsCV4$lambda.min

#library(glmnetUtils)の場合 newdata = でデータを入れる
lasso_pred2 <- predict(acsCV4,s=acsCV4$lambda.min,newdata=acs,type="class")

#混合行列を確認
table(acs$Income,lasso_pred2)

・ まとめ plotmoパッケージを使うと、ラベルが重なって表記されることも防げることが分かった。
ラベル数を変更したり、グリッドを表示したりできる。色々調べてみよう。

・ 参考URL

stackoverflow.com