H2Oは、ローカルコンピューティングと、 H2Oを使用して直接作成されたクラスターまたはSparkクラスターで作業するクラスターの使用の両方のために設計された機械学習ライブラリです。 Azure HDInsightで作成されたSparkクラスターへのH2Oの統合が最近追加され、この出版物(前回の記事RおよびSparkを補完するもの)で、このようなクラスターでH2Oを使用した機械学習モデルの構築を検討し、提供されたモデルと(時間、メトリック)を比較しますsparklyr 、 H2Oは Sparkのキラーアプリですか?
HDInsight SparkクラスターのH20機能の概要
以前の投稿で述べたように、当時、 SparkクラスターでRを使用してMOのモデルを構築する方法は3つありました。
1) sparklyrパッケージ。これは、さまざまなデータソースからのさまざまな読み取り方法、便利なdplyrデータ操作、およびかなり多数の異なるモデルのセットを提供します。
2) MicrosoftのソフトウェアであるR Server for Hadoopは 、データ操作用の機能とMOモデルの独自の実装を使用しています。
3)データ操作の実装を提供し、少数のMOモデルを提供するSparkRパッケージ(現在、 Spark 2.2のバージョンでは、モデルのリストが大幅に拡張されています)。
各オプションのその他の機能については、前の投稿の表1をご覧ください。
4番目の方法が登場しました-Spark HDInsightクラスターで H2Oを使用します。 その可能性について簡単に考えてみましょう。
- 読み取り、書き込み、データ操作-これらは直接H2Oにはないため、完成したデータをSparkからH20に転送(変換)する必要があります。
- 機械学習モデルはsparklyrよりわずかに少ないですが、すべての基本的なモデルが利用可能です。それらのリストを以下に示します。
- 一般化線形モデル
- 多層パーセプトロン
- ランダムフォレスト
- 勾配ブースティングマシン
- ナイーブベイズ
- 主成分分析
- 特異値分解
- 一般化された低ランクモデル
- K-Meansクラスタリング
- ディープラーニングオートエンコーダーによる異常検出。
- さらに、 h2oEnsembleパッケージを使用して、アンサンブルと複数のモデルのスタックを使用できます。
- H2Oモデルの利便性は、トレーニングと検証サンプルの両方で、品質指標をすぐに評価できることです。
- 固定グリッドまたはランダム選択でのアルゴリズムのハイパーパラメーターの調整。
- 結果のモデルは、バイナリ形式または純粋なJava 「 Plain Old Java Object 」コードで保存できます。 ( POJO )
一般に、 H2Oを使用するためのアルゴリズムは次のとおりです。
- sparklyrパッケージ機能を使用したデータの読み取り。
- sparklyrとreplyrを使用した操作、変換、データ準備。
- rsparklingパッケージを使用してデータをH2O形式に変換します。
- h2oを使用してMOモデルを構築し、データを予測します。
- rsparklingおよび/またはsparklyrを使用して、結果をSparkおよび/またはローカルにRに返す 。
使用したリソース
- HDInsight 2.0.2のH2Oクラスター人工知能。
このクラスターは、 PythonおよびScala用のAPIを備えた完全なソリューションです。 R (これまでのところ)は統合されていませんが、追加することは難しくありません。これには以下が必要です。 - Rおよびsparklyr 、 h2o 、 rsparklingパッケージをすべてのノードにインストールします :headおよびwork
- ヘッドノードにRStudioをインストールする
- ローカルでputtyクライアントを使用してクラスターのヘッドノードとのsshセッションを確立し、 RStudioポートをローカルホストポートにトンネリングして、Webブラウザーを介してRStudioにアクセスします。
重要:ソースからh2oパッケージをインストールし、 Sparkバージョンとrsparklingパッケージの両方に対応するバージョンを選択し、必要に応じて、 rsparklingをダウンロードする前に使用するsparklingwaterバージョンを指定する必要があります(この場合はoptions(rsparkling.sparklingwater.version = '2.0.8') 。バージョン依存関係の表を以下に示します 。ヘッドノードへのソフトウェアとパッケージのインストールは、ノードコンソールから直接許可されますが、作業ノードへの直接アクセスはないため、追加のソフトウェアの展開はAction Scriptを介して行う必要があります。
まず、 HDInsightクラスター用のH2O人工知能を展開します 。構成は同じで、2つのD12v2ヘッドノードと4つのD12v2作業ノードと1つのスパークリングウォーター (サービス)ノードがあります。 クラスターを正常にデプロイした後、ヘッドノードへのssh接続を使用して、 R 、 RStudio ( RStudioの現在のバージョンにはSparkフレームとクラスターステータスを表示する機能が既に統合されています)、および必要なパッケージをインストールします。 作業ノードにパッケージをインストールするには、インストールスクリプト(Rおよびパッケージ)を作成し、 アクションスクリプトを使用して開始します。 ここにある既製のスクリプトを使用することができます: ヘッドノードと作業ノード 。 インストールがすべて成功したら 、 localhost:8787へのトンネリングを使用してssh接続をリセットします。 したがって、 localhost:8787のブラウザーで、 RStudioに接続し、作業を続行します。
Rを使用する利点は、同じヘッドノードにShinyサーバーをインストールし、 flexdashboardに単純なWebインターフェイスを作成することにより、クラスターですべての計算を開始し、ハイパーパラメーターを選択し、結果を視覚化し、作成したWebでレポートなどを作成できることです。ブラウザの直接リンクを介してどこからでも既にアクセスできるサイト(ここでは考慮しません)。
データの準備と操作
前回と同じデータセットを使用します。これはタクシーとその支払いに関する情報です。 これらのファイルをダウンロードしてhdfsに配置した後 、そこからそれらを読み取り、必要な変換を行います(コードは最後の投稿にあります)。
機械学習モデル
多かれ少なかれ比較のために、 sparklyrとh2oの両方で一般モデルを選択します。そのようなモデルの回帰問題には、線形回帰、ランダムフォレスト、勾配ブースティングの3つがありました。 アルゴリズムのパラメーターはデフォルトで使用されていましたが、違いがある場合、それらは一般的なものに縮小され(可能な場合)、 RMSEメトリックに従って30%のホールドアウトサンプルでモデルの精度がチェックされました。 結果を表1と図1に示します。
表1 モデル結果
モデル | Rmse | 時間、秒 |
---|---|---|
lm_mllib | 1,2507 | 10 |
lm_h2o | 1,2507 | 5,6 |
rf_mllib | 1,2669 | 21.9 |
rf_h2o | 1.2531 | 13,4 |
gbm_mllib | 1.2553 | 108.3 |
gbm_h2o | 1,2343 | 24.9 |
図1モデル結果
結果からわかるように、同じh2oモデルの利点は、実行時とメトリックの両方でsparklyrでの実装よりも明確に見えます。 h2o gbmの議論の余地のないリーダーは、優れたランタイムと最小限のRMSEを備えています。 交差検証のハイパーパラメーターを選択することで、画像が異なる可能性がありますが、この場合、箱から出してすぐにh2oを使用する方が高速で優れています。
結論
この記事では、 HDInsightプラットフォームを使用するSparkクラスターでRとH2Oを使用した機械学習の機能を補完し、 sparklyr MOモデルとは対照的なこの方法の利点の例を示しますが、 sparklyrは便利なデータの前処理と変換において大きな利点があります。
### ( ) features<-c("vendor_id", "passenger_count", "trip_time_in_secs", "trip_distance", "fare_amount", "surcharge") rmse <- function(formula, data) { data %>% mutate_(residual = formula) %>% summarize(rmse = sqr(mean(residual ^ 2))) %>% collect %>% .[["rmse"]] } trips_train_tbl <- sdf_register(taxi_filtered$training, "trips_train") trips_test_tbl <- sdf_register(taxi_filtered$test, "trips_test") actual <- trips.test.tbl %>% select(tip_amount) %>% collect() %>% `[[`("tip_amount") tbl_cache(sc, "trips_train") tbl_cache(sc, "trips_test") trips_train_h2o_tbl <- as_h2o_frame(sc, trips_train_tbl) trips_test_h2o_tbl <- as_h2o_frame(sc, trips_test_tbl) trips_train_h2o_tbl$vendor_id <- as.factor(trips_train_h2o_tbl$vendor_id) trips_test_h2o_tbl$vendor_id <- as.factor(trips_test_h2o_tbl$vendor_id) #mllib lm_mllib <- ml_linear_regression(x=trips_train_tbl, response = "tip_amount", features = features) pred_lm_mllib <- sdf_predict(lm_mllib, trips_test_tbl) rf_mllib <- ml_random_forest(x=trips_train_tbl, response = "tip_amount", features = features) pred_rf_mllib <- sdf_predict(rf_mllib, trips_test_tbl) gbm_mllib <-ml_gradient_boosted_trees(x=trips_train_tbl, response = "tip_amount", features = features) pred_gbm_mllib <- sdf_predict(gbm_mllib, trips_test_tbl) #h2o lm_h2o <- h2o.glm(x =features, y = "tip_amount", trips_train_h2o_tbl) pred_lm_h2o <- h2o.predict(lm_h2o, trips_test_h2o_tbl) rf_h2o <- h2o.randomForest(x =features, y = "tip_amount", trips_train_h2o_tbl,ntrees=20,max_depth=5) pred_rf_h2o <- h2o.predict(rf_h2o, trips_test_h2o_tbl) gbm_h2o <- h2o.gbm(x =features, y = "tip_amount", trips_train_h2o_tbl) pred_gbm_h2o <- h2o.predict(gbm_h2o, trips_test_h2o_tbl) #### pred.h2o <- data.frame( tip.amount = actual, as.data.frame(pred_lm_h2o), as.data.frame(pred_rf_h2o), as.data.frame(pred_gbm_h2o), ) colnames(pred.h2o)<-c("tip.amount", "lm", "rf", "gbm") result <- data.frame( RMSE = c( lm.mllib = rmse(~ tip_amount - prediction, pred_lm_mllib), lm.h2o = rmse(~ tip.amount - lm, pred.h2o ), rf.mllib = rmse(~ tip.amount - prediction, pred_rf_mllib), rf.h2o = rmse(~ tip_amount - rf, pred.h2o), gbm.mllib = rmse(~ tip_amount - prediction, pred_gbm_mllib), gbm.h2o = rmse(~ tip.amount - gbm, pred.h2o) ) )