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 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42  | 
						$ 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 以下のようなテーブルが作成されます。 dbadmin=> \d                      List of tables  Schema |       Name        | Kind  |  Owner  | Comment --------+-------------------+-------+---------+---------  public | agar_dish         | table | dbadmin |  public | agar_dish_1       | table | dbadmin |  public | agar_dish_2       | table | dbadmin |  public | baseball          | table | dbadmin |  public | dem_votes         | table | dbadmin |  public | faithful          | table | dbadmin |  public | faithful_testing  | table | dbadmin |  public | faithful_training | table | dbadmin |  public | house84           | table | dbadmin |  public | house84_clean     | table | dbadmin |  public | house84_test      | table | dbadmin |  public | house84_train     | table | dbadmin |  public | iris              | table | dbadmin |  public | iris1             | table | dbadmin |  public | iris2             | table | dbadmin |  public | mtcars            | table | dbadmin |  public | mtcars_test       | table | dbadmin |  public | mtcars_train      | table | dbadmin |  public | rep_votes         | table | dbadmin |  public | salary_data       | table | dbadmin |  public | transaction_data  | table | dbadmin | (21 rows)  | 
					
ランダムフォレストモデルの作成
本記事では機械学習のサンプルデータとしてよく用いられるirisデータを使用します。irisデータには「あやめ」の3品種「setosa」、「versicolor」、「virginica」のSepal(がく片)の長さと幅、及びPetal(花びら)の長さと幅の情報が含まれています。
| 
					 1 2 3 4 5 6 7  | 
						dbadmin=> SELECT * FROM iris WHERE id=1 OR id=51 OR id=101;  id  | Sepal_Length | Sepal_Width | Petal_Length | Petal_Width |  Species -----+--------------+-------------+--------------+-------------+------------    1 |          5.1 |         3.5 |          1.4 |         0.2 | setosa   51 |            7 |         3.2 |          4.7 |         1.4 | versicolor  101 |          6.3 |         3.3 |            6 |         2.5 | virginica (3 rows)  | 
					
アヤメのイメージ写真
Sepal(がく片)の長さと幅、及びPetal(花びら)の長さと幅の情報を用いて機械学習を行い、学習データから花の品種を予測する分類を行います。
サンプルデータセットでは、すでにirisデータを分割した学習データ(iris1)とテストデータ(iris2)が用意されています。そのため、iris1テーブルを用いてランダムフォレストによる機械学習を行います。
ランダムフォレストによる機械学習を行うには、RF_CLASSIFIER関数を利用します。
| 
					 1 2 3 4 5 6  | 
						dbadmin=> SELECT RF_CLASSIFIER ('myRFModel', 'iris1', 'Species', 'Sepal_Length, Sepal_Width, Petal_Length, Petal_Width'                  USING PARAMETERS ntree=100, sampling_size=0.5);    RF_CLASSIFIER -------------------  Finished training (1 row)  | 
					
【参考】パラメータの意味
| パラメータ名 | 意味 | 
|---|---|
| myRFModel | 任意のモデル名 | 
| iris1 | 学習データのテーブル名 | 
| Species | 予測したい列(目的変数) | 
| Sepal_Length, Sepal_Width, Petal_Length, Petal_Width | 予測に使用する説明変数 | 
| ntree | (オプション)フォレスト内のツリーの数 | 
| sampling_size | (オプション)各ツリーをトレーニングするために入力データセットのどの程度ランダムに選択するかを指定する数値 | 
サマリを出力
作成したmyRFModelモデルのサマリ情報を確認します。| 
					 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=> dbadmin=>  SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='myRFModel');                                                                                                                                                                                                                                                                                                               GET_MODEL_SUMMARY                                                                                                                                                          ------------------------------------------------------ =========== call_string =========== SELECT rf_classifier('public.myRFModel', 'iris1', '"species"', 'Sepal_Length, Sepal_Width, Petal_Length, Petal_Width' USING PARAMETERS exclude_columns='', ntree=100, mtry=2, sampling_size=0.5, max_depth=5, max_breadth=32, min_leaf_size=1, min_info_gain=0, nbins=32); ======= details =======  predictor  |type ------------+----- sepal_length|float sepal_width |float petal_length|float petal_width |float =============== Additional Info ===============        Name       |Value ------------------+-----     tree_count    | 100 rejected_row_count|  0 accepted_row_count| 90 (1 row)  | 
					
作成したモデルの評価
学習時に利用していないテストデータ(iris2)を利用して、作成したモデルの精度を評価します。ランダムフォレストによる予測を行う場合はPREDICT_RF_CLASSIFIER関数を使用します。
| 
					 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65  | 
						dbadmin=> SELECT id, species ,PREDICT_RF_CLASSIFIER (Sepal_Length, Sepal_Width, Petal_Length, Petal_Width                                       USING PARAMETERS model_name='myRFModel') FROM iris2;  id  |  species   | PREDICT_RF_CLASSIFIER -----+------------+-----------------------    5 | setosa     | setosa   10 | setosa     | setosa   14 | setosa     | setosa   15 | setosa     | setosa   21 | setosa     | setosa   22 | setosa     | setosa   24 | setosa     | setosa   25 | setosa     | versicolor ★   32 | setosa     | setosa   33 | setosa     | setosa   34 | setosa     | setosa   35 | setosa     | setosa   38 | setosa     | setosa   39 | setosa     | setosa   42 | setosa     | setosa   43 | setosa     | setosa   45 | setosa     | versicolor ★   46 | setosa     | setosa   47 | setosa     | setosa   48 | setosa     | setosa   51 | versicolor | versicolor   54 | versicolor | versicolor   57 | versicolor | versicolor   59 | versicolor | versicolor   62 | versicolor | versicolor   63 | versicolor | versicolor   64 | versicolor | versicolor   65 | versicolor | versicolor   66 | versicolor | versicolor   71 | versicolor | virginica  ★   73 | versicolor | versicolor   75 | versicolor | versicolor   82 | versicolor | versicolor   87 | versicolor | versicolor   89 | versicolor | versicolor   90 | versicolor | versicolor   91 | versicolor | versicolor   96 | versicolor | versicolor   97 | versicolor | versicolor  101 | virginica  | virginica  102 | virginica  | virginica  104 | virginica  | virginica  107 | virginica  | virginica  110 | virginica  | virginica  113 | virginica  | virginica  115 | virginica  | virginica  118 | virginica  | virginica  119 | virginica  | virginica  120 | virginica  | versicolor ★  127 | virginica  | virginica  129 | virginica  | virginica  133 | virginica  | virginica  134 | virginica  | versicolor ★  136 | virginica  | virginica  141 | virginica  | virginica  142 | virginica  | virginica  143 | virginica  | virginica  145 | virginica  | virginica  146 | virginica  | virginica  148 | virginica  | virginica (60 rows)  | 
					
★のデータについては、間違った分類を行っていますが、それ以外は期待した分類が行われていることが確認できます。
また、PREDICT_RF_CLASSIFIER_CLASSES関数を利用することで、分類される条件に合致する確率も併せて求めることができます。
| 
					 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65  | 
						dbadmin=> SELECT id, species, PREDICT_RF_CLASSIFIER_CLASSES(Sepal_Length, Sepal_Width, Petal_Length, Petal_Width                               USING PARAMETERS model_name='myRFModel') OVER (partition by id,species) FROM iris2 ORDER BY 4;  id  |  species   | predicted  |    probability -----+------------+------------+-------------------  107 | virginica  | virginica  | 0.536992818870368  134 | virginica  | versicolor |  0.56202162322828   45 | setosa     | versicolor | 0.577060814173363   25 | setosa     | versicolor | 0.577060814173363  120 | virginica  | versicolor | 0.637935043141699  127 | virginica  | virginica  | 0.672532824186689   71 | versicolor | virginica  | 0.675916450364433   73 | versicolor | versicolor | 0.824883846576117   51 | versicolor | versicolor | 0.833527853168653  104 | virginica  | virginica  | 0.844583524605197   66 | versicolor | versicolor |  0.88494397517301   87 | versicolor | versicolor |  0.88494397517301   57 | versicolor | versicolor | 0.905777308506343  115 | virginica  | virginica  | 0.917643097643098  143 | virginica  | virginica  | 0.917643097643098  102 | virginica  | virginica  | 0.917643097643098   62 | versicolor | versicolor | 0.917696797514068   75 | versicolor | versicolor | 0.918307070411105   59 | versicolor | versicolor | 0.918307070411105   63 | versicolor | versicolor | 0.923321797514068   89 | versicolor | versicolor | 0.923373489243391  142 | virginica  | virginica  | 0.925976430976431  148 | virginica  | virginica  | 0.925976430976431  146 | virginica  | virginica  | 0.925976430976431   96 | versicolor | versicolor | 0.926230632100534   64 | versicolor | versicolor | 0.936741710933981   65 | versicolor | versicolor | 0.949236584481486   97 | versicolor | versicolor | 0.952093727338629   91 | versicolor | versicolor | 0.952569917814819   90 | versicolor | versicolor | 0.962569917814819   82 | versicolor | versicolor | 0.962569917814819   54 | versicolor | versicolor | 0.962569917814819   15 | setosa     | setosa     | 0.964624060150376   42 | setosa     | setosa     | 0.971111111111111  133 | virginica  | virginica  | 0.988703703703704  129 | virginica  | virginica  | 0.988703703703704   14 | setosa     | setosa     | 0.991111111111111   35 | setosa     | setosa     | 0.991111111111111   39 | setosa     | setosa     | 0.991111111111111   10 | setosa     | setosa     | 0.991111111111111   46 | setosa     | setosa     | 0.991111111111111  145 | virginica  | virginica  | 0.992037037037037  141 | virginica  | virginica  | 0.992037037037037  101 | virginica  | virginica  | 0.992037037037037  113 | virginica  | virginica  | 0.992037037037037  119 | virginica  | virginica  | 0.996666666666667   38 | setosa     | setosa     |                 1   34 | setosa     | setosa     |                 1   22 | setosa     | setosa     |                 1  110 | virginica  | virginica  |                 1  136 | virginica  | virginica  |                 1    5 | setosa     | setosa     |                 1   47 | setosa     | setosa     |                 1   24 | setosa     | setosa     |                 1   21 | setosa     | setosa     |                 1   32 | setosa     | setosa     |                 1   48 | setosa     | setosa     |                 1   33 | setosa     | setosa     |                 1   43 | setosa     | setosa     |                 1  118 | virginica  | virginica  |                 1 (60 rows)  | 
					
【参考】PREDICT_RF_CLASSIFIER、PREDICT_RF_CLASSIFIER_CLASSES関数のパラメータの意味
| パラメータ名 | 意味 | 
|---|---|
| sepal_length,sepal_width,petal_length,petal_width | 予測に使用する列(モデル作成時に指定した説明変数) | 
| MODEL_NAME | 予測に使用するモデル名 | 
実装
作成したランダムフォレストモデルを実装する場合も、評価時に利用したPREDICT_RF_CLASSIFIER関数を利用できます。| 
					 1 2 3 4 5  | 
						SELECT id, species ,        PREDICT_RF_CLASSIFIER (Sepal_Length, Sepal_Width, Petal_Length, Petal_Width                                       USING PARAMETERS                                        model_name='myRFModel')         FROM <予測したいデータがあるテーブル>;  | 
					
参考情報
Random Forest for Classificationhttps://my.vertica.com/docs/9.0.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/RandomForest/RandomForest.htm
検証バージョンについて
この記事の内容はVertica 9.0で確認しています。- 投稿タグ
 - 機械学習, Machine Learning, iris, randam forest, ランダムフォレスト
 

