【R】機械学習とDeepLearningの比較

1. はじめに

まだまだ勉強中なのですが、一応、機械学習とDeepLearningのさわりを理解したつもりです。一般に、DeepLearningの方が精度が良いという風に言われています。さて、本当にそうか試してみました。

機械学習は、Tidymodelsを使ってRandom forestにて学習します。DeepLearningは、TensorflowのWrapperであるKerasを使います。

2. データ

データは、何度か使用しているUCI Macine Learning RepositoryからWine qualityを使います。次のように、学習用、テスト用データを準備しておきます。

library(tidyverse)
library(tidymodels)
library(keras)

wine_dat <- read.csv("whiteWine.csv")
wine <- drop_na(wine_dat)

ggplot(wine) +
  geom_histogram(aes(x=quality))

wine_split <- initial_split(wine, strata= quality, prep = 0.9)
wine_train <- training(wine_split)
wine_test <- testing(wine_split)

set.seed(123)

データの分布はこんな感じです。正規分布っぽいからよいと思います。

2. 機械学習(Random forest)

機械学習のコードは、以下の通りです。

wine_folds <- 
  vfold_cv(wine_train, v=10, strata=quality)

rf_tuner <- 
  rand_forest(
    mtry = tune(),
    min_n = tune()
  ) %>%
  set_engine(engine = "ranger") %>%
  set_mode("regression")

rf_wf <-
  workflow() %>%
  add_formula(quality ~.) %>%
  add_model(rf_tuner)

rf_results <-
  rf_wf %>%
  tune_grid(resamples = wine_folds,
            metrics = metric_set(rmse))

rf_results %>% collect_metrics()

rf_results %>%
  show_best(metric = "rmse", n=4)

rf_results %>%
  autoplot()

wine_best <-
  rf_results %>%
  select_best(metric = "rmse")

last_rf_workflow <-
  rf_wf %>%
  finalize_workflow(wine_best)

last_rf_fit <-
  last_rf_workflow %>%
  last_fit(split = wine_split)

ret <- last_rf_fit %>%
  collect_predictions()

rmse(round(ret$.pred,0), ret$quality)

精度(rmse)を見てみると。

> rmse(round(ret$.pred,0), ret$quality)
[1] 0.6574112

66%程度でしょうか。学習時間もかなりかかりました。

3. Deep Learning (Keras)

同じデータでDeepLearningにて学習してみます。

wine_train.x <- as.matrix(wine_train[,-12])
wine_train.y <- as.matrix(wine_train[,12])
wine_test.x <- as.matrix(wine_test[,-12])
wine_test.y <- as.matrix(wine_test[,12])

model <- keras_model_sequential()
model %>% layer_dense(units = 200, input_shape=11) %>%
  layer_activation(activation = 'sigmoid') %>%
  layer_dropout(rate = 0.2) %>%
  layer_dense(units = 50) %>%
  layer_activation(activation = 'sigmoid') %>%
  layer_dropout(rate = 0.2) %>%
  layer_dense(units = 44) %>%
  layer_activation(activation = 'sigmoid') %>%
  layer_dropout(rate = 0.2) %>%
  layer_dense(units = 1) %>%
  layer_activation(activation = 'linear') %>%
  compile(
    loss = 'mse',
    optimizer = optimizer_rmsprop(lr = 0.001)
  )

model %>% fit(wine_train.x, wine_train.y, epochs = 8, batch_size = 100)

pred_reg <- model %>% predict(wine_test.x, batch_size=100)

rmse(pred_reg, wine_test.y)

> rmse(pred_reg, wine_test.y)
[1] 0.8396689

学習も数秒で終わり、精度も84%程度と良いです。

4. おわりに

機械学習、DeepLearningとも、もっとチューニングすると結果が異なってくると思います。しかし、少し触っただけでもDeepLearningの方が学習が早く精度も良いのではないかという感触です。詳しく知りませんが、DeepLearningの方が計算が早いのは、本質的な部分はC/C++で書かれているからかもしれません。

Add a Comment

メールアドレスが公開されることはありません。