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
以下のようなテーブルが作成されます。
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(花びら)の長さと幅の情報が含まれています。
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関数を利用します。
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モデルのサマリ情報を確認します。
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関数を使用します。
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関数を利用することで、分類される条件に合致する確率も併せて求めることができます。
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関数を利用できます。
SELECT id, species ,
PREDICT_RF_CLASSIFIER (Sepal_Length, Sepal_Width, Petal_Length, Petal_Width
USING PARAMETERS
model_name='myRFModel')
FROM <予測したいデータがあるテーブル>;参考情報
Random Forest for Classification
https://my.vertica.com/docs/9.0.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/RandomForest/RandomForest.htm
検証バージョンについて
この記事の内容はVertica 9.0で確認しています。

