【R】機械学習とDeepLearningの比較
2020年9月21日
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++で書かれているからかもしれません。