OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

Verticaで始める機械学習~ランダムフォレストを使った回帰~

公開日:
更新日:
基本操作
機械学習
#機械学習

Verticaでは、機械学習の回帰アルゴリズムとしてランダムフォレストを利用できます。

ランダムフォレスト回帰とは

ランダムフォレスト回帰は、機械学習における教師あり学習のアルゴリズムであり、回帰を行う際に利用できます。
例えば、商品の需要予測や応募人数の予測など数値を予測したい際に利用します。

以降では、サンプルデータを例にVerticaでランダムフォレスト回帰を利用する手順をご紹介します。

Verticaでランダムフォレスト回帰を利用する手順

サンプルスキーマ、データのダウンロード

以下URLよりサンプルファイルをダウンロードします。
https://github.com/vertica/Machine-Learning-Examples

画面右上にある「Clone or Download」をクリックします。

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

サンプルスキーマの作成、データのロード

ダウンロードしたファイルをVerticaサーバ上の任意のディレクトリに転送します。
転送後、以下コマンドでファイルを解凍します。

$ cd 
$ unzip Machine-Learning-Examples-master.zip

解凍後に以下コマンドでサンプルスキーマとテーブルの作成、データロードを実行します。

$ 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の側面から構成されています。

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関数を利用します。

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テーブルを用いてランダムフォレスト回帰による機械学習を行います。

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モデルのサマリ情報を確認します。

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関数を使用すると変数の重要度も確認できます。

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関数を使用します。

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列を予測します。

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による評価も確認します。

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関数を利用できます。

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 Model
https://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/RandomForest/BuildingaRandomForestforRegressionModel.htm

検証バージョンについて

この記事の内容はVertica 9.1で確認しています。