Verticaでは、機械学習の回帰アルゴリズムとしてランダムフォレストを利用できます。
目次
ランダムフォレスト回帰とは
ランダムフォレスト回帰は、機械学習における教師あり学習のアルゴリズムであり、回帰を行う際に利用できます。例えば、商品の需要予測や応募人数の予測など数値を予測したい際に利用します。
以降では、サンプルデータを例にVerticaでランダムフォレスト回帰を利用する手順をご紹介します。
Verticaでランダムフォレスト回帰を利用する手順
サンプルスキーマ、データのダウンロード
以下URLよりサンプルファイルをダウンロードします。https://github.com/vertica/Machine-Learning-Examples
画面右上にある「Clone or Download」をクリックします。

展開される画面の右下にある「Download ZIP」をクリックしてファイルを保存します。

サンプルスキーマの作成、データのロード
ダウンロードしたファイルをVerticaサーバ上の任意のディレクトリに転送します。転送後、以下コマンドでファイルを解凍します。
| 1 2 | $ cd  $ unzip Machine-Learning-Examples-master.zip | 
解凍後に以下コマンドでサンプルスキーマとテーブルの作成、データロードを実行します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | $ cd Machine-Learning-Examples-master/data $ /opt/vertica/bin/vsql -d <データベース名> -w <パスワード> -f load_ml_data.sql DROP TABLE DROP TABLE DROP TABLE CREATE TABLE ~途中、省略~ COMMIT CREATE TABLE CREATE TABLE | 
ランダムフォレスト回帰モデルの作成

本記事では機械学習のサンプルデータとしてよく用いられるmtcarsデータを使用します。
本データは、1974年のMotor Trend US誌から抽出されたもので、燃料消費量と32の自動車(1973-74モデル)の自動車設計と性能の10の側面から構成されています。
| 1 2 3 4 5 6 7 8 9 | dbadmin=> SELECT * FROM mtcars LIMIT 5;      car_model      | mpg  | cyl | disp | hp  | drat |  wt   | qsec  | vs | am | gear | carb |  tf --------------------+------+-----+------+-----+------+-------+-------+----+----+------+------+-------  AMC Javelin        | 15.2 |   8 |  304 | 150 | 3.15 | 3.435 |  17.3 |  0 |  0 |    3 |    2 | test  Cadillac Fleetwood | 10.4 |   8 |  472 | 205 | 2.93 |  5.25 | 17.98 |  0 |  0 |    3 |    4 | train  Camaro Z28         | 13.3 |   8 |  350 | 245 | 3.73 |  3.84 | 15.41 |  0 |  0 |    3 |    4 | test  Chrysler Imperial  | 14.7 |   8 |  440 | 230 | 3.23 | 5.345 | 17.42 |  0 |  0 |    3 |    4 | train  Datsun 710         | 22.8 |   4 |  108 |  93 | 3.85 |  2.32 | 18.61 |  1 |  1 |    4 |    1 | test (5 rows) | 
ランダムフォレスト回帰による機械学習を行うには、RF_REGRESSOR関数を利用します。
| 1 2 3 4 5 6 7 8 9 10 | RF_REGRESSOR ( 'model‑name', input‑relation, 'response‑column', 'predictor‑columns'                                                                        [ USING PARAMETERS [exclude_columns='excluded‑columns']                                  [, ntree=num‑trees]                                 [, mtry=num‑features]                                 [, sampling_size=sampling‑size]                                 [, max_depth=depth]                                 [, max_breadth=breadth]                                 [, min_leaf_size=leaf_size]                                 [, min_info_gain=threshold]                                 [, nbins=num‑bins] ] ) | 
| パラメータ名 | 内容 | 
|---|---|
| model‑name | 任意のモデル名 | 
| input‑relation | 学習データのテーブル名 | 
| response‑column | 予測したい列(目的変数) | 
| predictor‑columns | 予測に使用する説明変数 | 
| exclude_columns | (オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列 | 
| ntree | (オプション) フォレスト内のツリーの数を0〜1000の間で指定。デフォルトは20。 | 
| mtry | (オプション) ツリーノードの分割で考慮するフィーチャの数を特徴量の数以下の整数で指定。デフォルトは特徴量数の1/3。 | 
| sampling_size | (オプション) 各ツリーを訓練するためにランダムに選択された入力データセットの割合を0.0〜1.0指定。 デフォルトは0.632。 | 
| max_depth | (オプション) 各ツリーの深さをを1〜100の間で指定。 デフォルトは5。 | 
| max_breadth | (オプション) フォレスト内のツリーに含めることができるリーフノードの最大数を1〜1e9の整数で指定。 デフォルトは32。 | 
| min_leaf_size | (オプション) ノードを分割した後に各ブランチが最低限持つ必要があるサンプル数を1から1e6までの整数で指定。サンプル数を満たさないブランチは破棄される。 デフォルトは5 | 
| min_info_gain | (オプション) 分割を含めるための最小しきい値を0.0〜1.0で指定。 情報利得がこのしきい値未満の分割は破棄される。デフォルトは0.0。 | 
| nbins | (オプション) 連続値(数値)の特徴量に使用するbinの数を2~1000の間で指定。デフォルトは32。 | 
本例ではcyl(シリンダー数), hp(馬力), drat(リアアクセル比), wt(重量)を説明変数として機械学習を行い、carb(キャブレター数)の値を予測します。
サンプルデータセットでは、すでにmtcarsデータを分割した訓練データ(mtcars_train)とテストデータ(mtcars_test)が用意されています。そのため、mtcars_trainテーブルを用いてランダムフォレスト回帰による機械学習を行います。
| 1 2 3 4 5 6 7 | dbadmin=> SELECT RF_REGRESSOR('rf_reg_mtcars', 'mtcars_train', 'carb', 'cyl, hp, drat, wt' dbadmin(>        USING PARAMETERS mtry=4,sampling_size=1,min_leaf_size=2);  RF_REGRESSOR --------------  Finished (1 row) | 
サマリを出力
作成したrf_reg_mtcarsモデルのサマリ情報を確認します。| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | dbadmin=> SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='rf_reg_mtcars');                                                                                                                                                                                                                                                                                                                                                                                                            GET_MODEL_SUMMARY                                                                                                                                                                                                   ----------------------------------------------------- =========== call_string =========== SELECT rf_regressor('public.rf_reg_mtcars', 'mtcars_train', '"carb"', 'cyl, hp, drat, wt' USING PARAMETERS exclude_columns='', ntree=20, mtry=4, sampling_size=1, max_depth=5, max_breadth=32, min_leaf_size=2, min_info_gain=0, nbins=32); ======= details ======= predictor|type ---------+-----    cyl   | int    hp    | int   drat   |float    wt    |float =============== Additional Info ===============        Name       |Value ------------------+-----     tree_count    | 20 rejected_row_count|  0 accepted_row_count| 20 (1 row) | 
RF_PREDICTOR_IMPORTANCE関数を使用すると変数の重要度も確認できます。
| 1 2 3 4 5 6 7 8 | dbadmin=> SELECT RF_PREDICTOR_IMPORTANCE ( USING PARAMETERS model_name = 'rf_reg_mtcars');  predictor_index | predictor_name |  importance_value -----------------+----------------+--------------------                0 | cyl            |  0.901071428571429                1 | hp             |  0.242857142857143                2 | drat           |  0.432142857142857                3 | wt             | 0.0714285714285729 (4 rows) | 
作成したモデルの評価
学習時に利用していないテストデータ(mtcars_test)を利用して、作成したモデルの精度を評価します。作成したモデルによる評価(予測)を行うにはPREDICT_RF_REGRESSOR関数を使用します。
| 1 2 3 | PREDICT_RF_REGRESSOR ( input‑columns                        USING PARAMETERS model_name='model‑name'                                         [, match_by_pos=match‑by‑position] )  | 
| パラメータ名 | 内容 | 
|---|---|
| input‑columns | 予測に使用する説明変数列をカンマ区切りで指定 | 
| model‑name | 予測に使用するモデル名 | 
| match_by_pos | (オプション) 入力列と特徴量の紐付けのルール。以下のいずれかを指定。 false:入力した列名と特徴量の名前で紐付(デフォルト) true:列名は無視し、入力した列の順番通りに紐づけ | 
本例ではrf_reg_mtcarsモデルを用いて、mtcars_testのcarb列を予測します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | dbadmin=> SELECT car_model, dbadmin->        carb, dbadmin->        PREDICT_RF_REGRESSOR(cyl, hp, drat, wt USING PARAMETERS model_name='rf_reg_mtcars') AS pred dbadmin-> FROM mtcars_test;    car_model    | carb | pred ----------------+------+------  AMC Javelin    |    2 |    2  Camaro Z28     |    4 |    4  Datsun 710     |    1 |    2  Honda Civic    |    2 |    1  Hornet 4 Drive |    1 |    2  Maserati Bora  |    8 |    4  Merc 280       |    4 |    4  Merc 450SL     |    3 |    3  Porsche 914-2  |    2 |    1  Toyota Corona  |    1 |    2  Valiant        |    1 |    2  Volvo 142E     |    2 |    1 (12 rows) | 
MSEによる評価も確認します。
| 1 2 3 4 5 6 7 8 9 | dbadmin=> SELECT MSE (carb::float, pred::float) OVER() FROM dbadmin->            (SELECT carb, dbadmin(>                    PREDICT_RF_REGRESSOR(cyl, hp, drat, wt USING PARAMETERS model_name='rf_reg_mtcars') AS pred dbadmin(>             FROM mtcars_test) AS prediction_output;        mse        |                  Comments ------------------+---------------------------------------------  1.91666666666667 | Of 12 rows, 12 were used and 0 were ignored (1 row) | 
実装
作成したランダムフォレスト回帰のモデルを実装する場合も、評価時に利用したPREDICT_RF_REGRESSOR関数を利用できます。| 1 2 3 4 | SELECT car_model,        carb,         PREDICT_RF_REGRESSOR(cyl, hp, drat, wt USING PARAMETERS model_name='rf_reg_mtcars') AS pred  FROM <予測したいデータがあるテーブル>; | 
参考情報
Building a Random Forest for Regression Modelhttps://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/RandomForest/BuildingaRandomForestforRegressionModel.htm
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。- 投稿タグ
- 機械学習, randam forest, Machine


