【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++で書かれているからかもしれません。