LoginSignup
0

More than 5 years have passed since last update.

posted at

updated at

H2Oで任意のモデルを別名で保存するためのTIP

この文章はDATUM STUDIO Advent Calendar 2017の19日目です。

修正中

趣旨

最近は様々なDeepLearningパッケージが乱立してきておりますが、
今年一年はH2Oというパッケージにかかりっぱなしの一年でしたので、
年の暮れではありますが、便利なTIPを数点ほどあげたいと思います。

TIPS
1. GridSearchの利用方法
2. GridSearchの結果の取り出し方
3. GridSearchから取り出したモデルを既定のモデル名に書き換えて、保存する方法

GridSearchの利用方法

#とりあえず利用しそうなライブラリは先に読み込んでおきます
library(tidyverse)
library(h2o)

# h2oを起動します
localH2O = h2o.init(nthreads=-1)

iris

iris.hex = as.h2o(iris, destination_frame = "iris.hex")

個々からはモデルの話しになります。
H2Oでは、モデルのハイパーパラメーターを
グリッドサーチ形式で模索することができます。
この際に、seed値を入れてあげることで、
乱数によってどの程度結果がブレるのかを調べることが出来るのて、
二度美味しいです。

また、全部の組み合わせを試すには時間が足りない場合には、
組み合わせをランダムに選んでテストする方法もあります。


#ハイパーパラメーターを事前に入れておけます。
hyper_params <- list(

  # 隠れ層: 層の数と、各層におけるニューロン数をコントロールします
  hidden=list(
    c(200, 200),
    c(200, 200, 200)
    ),

  # 学習数  あとでここが関係する
  epochs = 100
)

# パラメーターのサーチ方法
search_criteria  <- list(
  strategy = "Cartesian", #ここを修正することで、すべての組み合わせの中からランダムにモデルを試すことも出来ます。
  seeds=c(1, 2, 3)
)

x_variables <-  c("Sepal.Length", "Sepal.Width",  "Petal.Length", "Petal.Width" )
y_variable <-  "Species"


# ディープラーニングモデルを学習させます。
grid_data = h2o.grid(
  algorithm = "deeplearning",
  x = x_variables,
  y = y_variable,
  training_frame = iris.hex,
  validation_frame = iris.hex,
  # id info
  model_id = "iris_model",
  grid_id = "grid_data",

  # hyper parameter
  hyper_params = hyper_params,

  # grid search criteria
  search_criteria = search_criteria,

  # クロスバリデーションを行う場合は下のオプションをつけます。
  #nfolds = 10,
  #fold_assignment = "AUTO",


  #変数の重要度を見るときには下のオプションを TRUEにしてください。
  variable_importances = TRUE
)

GridSearchの結果の取り出し方

下記のコードのような方法で結果をデータフレームで取り出せます。

grid_result <- h2o.getGrid(grid_id = "grid_data", sort_by = "r2") %>% .@summary_table

GridSearchから取り出したモデルを既定のモデル名に書き換えて、保存する方法

問題は、モデルの名称は、グリッドサーチに利用した時点で、
model番号がくっついているため、
これをそのまま保存してしまうと、あとで利用しづらくなってしまいます。

モデルの名称を変えたいのですが通常の方法では書き換えができません。
そこで、checkpointの機能を利用します。


parameters <- as.list(grid_result[1,])

renamed_model <-  h2o.deeplearning(
  x = x_variables,
  y = y_variable,
  training_frame = iris.hex,
  validation_frame = iris.hex,

  # ここは0ではなく、前回のモデルのepochsを入れてください。
  # ここでは前回の学習が微妙に多い可能性を考慮して、0.1だけ学習させる形にしています。
  # これの値が、前のモデルと一致している時、学習せずにモデルを返します。
  epochs = as.numeric(parameters$epochs)+0.1,

  # ここに書き換えたいモデル名を入れてください
  model_id = "model_name",
  checkpoint = grid_result$model_ids[1], # ここで前に作成したモデル名を指定します。

  hidden = c(lapply(strsplit(gsub("¥¥]|¥¥[","",parameters$hidden) ,","),as.numeric)[[1]]),

)


# モデルを保存しましょう
h2o.saveModel(renamed_model, path = "test", force = T)


以上になります。

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
What you can do with signing up
0