Verticaでは、機械学習の回帰アルゴリズムとしてSVM(サポートベクターマシン)を利用できます。
SVM(サポートベクターマシン)回帰とは
SVM(サポートベクターマシン)回帰は、機械学習における教師あり学習のアルゴリズムであり、回帰を行う際に利用できます。
例えば、商品の需要予測や応募人数の予測など数値を予測したい際に利用します。
以降では、サンプルデータを例にVerticaでSVM(サポートベクターマシン)回帰を利用する手順をご紹介します。
VerticaでSVM(サポートベクターマシン)回帰を利用する手順
サンプルスキーマ、データのダウンロード
以下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 TABLESVM(サポートベクターマシン)回帰モデルの作成
本記事では機械学習のサンプルデータとしてよく用いられる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)SVM(サポートベクターマシン)回帰による機械学習を行うには、SVM_REGRESSOR関数を利用します。
SVM_REGRESSOR ( 'model‑name', input‑relation, 'response‑column', 'predictor‑columns'
[ USING PARAMETERS [exclude_columns='excluded‑columns']
[, error_tolerance=error‑tolerance ]
[, C=cost]
[, epsilon=epsilon‑value]
[, max_iterations=max‑iterations]
[, intercept_mode='mode']
[, intercept_scaling='scale'] ] ) パラメータ名 | 内容 |
|---|---|
model‑name | 任意のモデル名 |
input‑relation | 学習データのテーブル名 |
response‑column | 予測したい列(目的変数) |
predictor‑columns | 予測に使用する説明変数 |
exclude_columns | (オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列 |
error_tolerance | (オプション) 許容されるエラーマージン。指定した領域外のデータポイントはコスト関数でペナルティが追加される。デフォルトは0.1 |
C | (オプション) 誤分類コストの重みパラメータ。 |
epsilon | (オプション) アルゴリズムが指定した精度に達成したかを決める閾値。 |
max_iterations | (オプション) 反復回数の上限値。デフォルトは100 |
intercept_mode | (オプション) インターセプトの処理方法を次の何れかで指定。 |
intercept_scaling | (オプション) モデルの切片を計算するために使用するダミーフィーチャの値。 ダミーフィーチャはトレーニングデータに含まれていないため、その値は定数に設定される。デフォルトは1。 |
本例ではcyl(シリンダー数), hp(馬力), drat(リアアクセル比), wt(重量)を説明変数として機械学習を行い、carb(キャブレター数)の値を予測します。
サンプルデータセットでは、すでにmtcarsデータを分割した訓練データ(mtcars_train)とテストデータ(mtcars_test)が用意されています。そのため、mtcars_trainテーブルを用いてSVM(サポートベクターマシン)回帰による機械学習を行います。
dbadmin=> SELECT SVM_REGRESSOR('svm_reg_mtcars', 'mtcars_train', 'carb', 'cyl, hp, drat, wt'
dbadmin(> USING PARAMETERS C=10);
SVM_REGRESSOR
---------------------------------------------------------------
Finished in 7 iterations.
Accepted Rows: 20 Rejected Rows: 0
(1 row)サマリを出力
作成したsvm_reg_mtcarsモデルのサマリ情報を確認します。
dbadmin=> SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='svm_reg_mtcars');
GET_MODEL_SUMMARY
-----------------------------------------------------
=======
details
=======
predictor|coefficient
---------+-----------
Intercept| 0.03064
cyl | -0.19211
hp | 0.01786
drat | 0.32413
wt | 0.10653
===========
call_string
===========
SELECT svm_regressor('public.svm_reg_mtcars', 'mtcars_train', '"carb"', 'cyl, hp, drat, wt'
USING PARAMETERS error_tolerance=0.1, C=10, max_iterations=100, intercept_mode='regularized', intercept_scaling=1, epsilon=0.001);
===============
Additional Info
===============
Name |Value
------------------+-----
accepted_row_count| 20
rejected_row_count| 0
iteration_count | 7
(1 row)作成したモデルの評価
学習時に利用していないテストデータ(mtcars_test)を利用して、作成したモデルの精度を評価します。
作成したモデルによる評価(予測)を行うにはPREDICT_SVM_REGRESSOR関数を使用します。
PREDICT_SVM_REGRESSOR(input‑columns
USING PARAMETERS model_name='model‑name'
[, match_by_pos=match‑by‑position] ) パラメータ名 | 内容 |
|---|---|
input‑columns | 予測に使用する説明変数列をカンマ区切りで指定 |
model‑name | 予測に使用するモデル名 |
match_by_pos | (オプション) 入力列と特徴量の紐付けのルール。以下のいずれかを指定。 |
本例ではsvm_reg_mtcarsモデルを用いて、mtcars_testのcarb列を予測します。
dbadmin=> SELECT car_model,
dbadmin-> carb,
dbadmin-> ROUND(PREDICT_SVM_REGRESSOR(cyl, hp, drat, wt USING PARAMETERS model_name='svm_reg_mtcars')) AS pred
dbadmin-> FROM mtcars_test;
car_model | carb | pred
----------------+------+------
AMC Javelin | 2 | 3
Camaro Z28 | 4 | 4
Datsun 710 | 1 | 2
Honda Civic | 2 | 2
Hornet 4 Drive | 1 | 2
Maserati Bora | 8 | 6
Merc 280 | 4 | 3
Merc 450SL | 3 | 3
Porsche 914-2 | 2 | 3
Toyota Corona | 1 | 2
Valiant | 1 | 2
Volvo 142E | 2 | 3
(12 rows)MSEによる評価も確認します。
dbadmin=> SELECT MSE (carb::float, pred::float) OVER() FROM
dbadmin-> (SELECT carb,
dbadmin(> PREDICT_SVM_REGRESSOR(cyl, hp, drat, wt USING PARAMETERS model_name='svm_reg_mtcars') AS pred
dbadmin(> FROM mtcars_test) AS prediction_output;
mse | Comments
------------------+---------------------------------------------
1.14796496265019 | Of 12 rows, 12 were used and 0 were ignored
(1 row)実装
作成したSVM(サポートベクターマシン)回帰のモデルを実装する場合も、評価時に利用したPREDICT_SVM_REGRESSOR関数を利用できます。
SELECT car_model,
carb,
ROUND(PREDICT_SVM_REGRESSOR(cyl, hp, drat, wt USING PARAMETERS model_name='svm_reg_mtcars')) AS pred
FROM <予測したいデータがあるテーブル>;参考情報
Building an SVM for Regression Model
https://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/SVM/BuildinganSVMforRegressionModel.htm
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。


