LoginSignup
2
3

More than 5 years have passed since last update.

Elastic Netをglm関数のようにformulaで入力し、なおかつパラメータを自動でチューニングする関数を作ってみた

Posted at

初投稿です。プログラムと統計を趣味で始めた初心者です。

Rでは、lm関数やglm関数で簡単に重回帰分析ができますが、未知データの予測性能を上げるにはテクニックが必要らしいです。

未知データの予測性能を上げるため、正則化回帰を行うElastic Netがあります。
glmnetパッケージはElastic Netが計算できますが、formulaで入力できず、説明変数をmatrixで入力する必要があります。

また、Elastic Netはチューニングパラメータとして、αとλがあります。
λはcv.glmnet関数でクロスバリデーションできますが、αのチューニングは自動化されてません。

そこで、Elastic Netをglm関数のようにformulaで入力し、なおかつパラメータを自動でチューニングする関数を作りました。

まず、glmnetをインストールします。

install.packages("glmnet")
library(glmnet)

インストールできたら、以下をRのコンソールにコピー&ペーストします。

elasticnet <- function(
  formula,  family="gaussian",
  data=NULL,  offset=NULL,  by=0.05,  nfolds=10,  seed=0
){
x <- model.matrix(formula,data=data)
y <- model.frame(formula,data=data)[,1]
df <- data.frame()
for(a in seq(0,1,by=by)){
  set.seed(seed)
  df <- rbind(df,
              data.frame(alpha=a,
                         cvm=min(
                           cv.glmnet(x=x,y=y,offset=offset,
                               family=family,nfolds=nfolds,alpha=a)$cvm
               )))
}

result <- cv.glmnet(x=x,y=y,offset=offset,family=family,nfolds=nfolds,
                    alpha=df[which.min(df[,2]),1])
result$formula <- formula
result$alpha_cvm <- df
return(result)
}


predict.en <- function(result,data){
  x <- model.matrix(result$formula,data=data)
  predict(result,x)
}

irisの場合、以下でモデル作成できます。

result <- elasticnet(Sepal.Length~Sepal.Width+Petal.Length,data=iris)

glm関数のように、familyやoffsetが使用できます。
byでαを探すステップ、nfoldsでクロスバリデーションの分割数、seedで乱数種を設定できます。

予測は、predict関数のように以下で行えます。

result <- predict.en(result,data=iris)

係数はcoef関数で計算できます。

coef(result)

なお、上記関数は大規模な計算には不向きです。

2
3
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
2
3