Verticaでは、機械学習の回帰アルゴリズムとしてSVM(サポートベクターマシン)を利用できます。
目次
SVM(サポートベクターマシン)回帰とは
SVM(サポートベクターマシン)回帰は、機械学習における教師あり学習のアルゴリズムであり、回帰を行う際に利用できます。例えば、商品の需要予測や応募人数の予測など数値を予測したい際に利用します。
以降では、サンプルデータを例にVerticaでSVM(サポートベクターマシン)回帰を利用する手順をご紹介します。
VerticaでSVM(サポートベクターマシン)回帰を利用する手順
サンプルスキーマ、データのダウンロード
以下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 |
SVM(サポートベクターマシン)回帰モデルの作成
本記事では機械学習のサンプルデータとしてよく用いられる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) |
SVM(サポートベクターマシン)回帰による機械学習を行うには、SVM_REGRESSOR関数を利用します。
1 2 3 4 5 6 7 8 |
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 | (オプション) アルゴリズムが指定した精度に達成したかを決める閾値。 デフォルトは1e-6(0.000001) |
max_iterations | (オプション) 反復回数の上限値。デフォルトは100 |
intercept_mode | (オプション) インターセプトの処理方法を次の何れかで指定。 regularized:インターセプトに適合し、それに対して正規化を適用。(デフォルト) unregularized:インターセプトに適合するが、正規化は適用されない。 |
intercept_scaling | (オプション) モデルの切片を計算するために使用するダミーフィーチャの値。 ダミーフィーチャはトレーニングデータに含まれていないため、その値は定数に設定される。デフォルトは1。 |
本例ではcyl(シリンダー数), hp(馬力), drat(リアアクセル比), wt(重量)を説明変数として機械学習を行い、carb(キャブレター数)の値を予測します。
サンプルデータセットでは、すでにmtcarsデータを分割した訓練データ(mtcars_train)とテストデータ(mtcars_test)が用意されています。そのため、mtcars_trainテーブルを用いてSVM(サポートベクターマシン)回帰による機械学習を行います。
1 2 3 4 5 6 7 8 |
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モデルのサマリ情報を確認します。
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 |
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関数を使用します。
1 2 3 |
PREDICT_SVM_REGRESSOR(input‑columns USING PARAMETERS model_name='model‑name' [, match_by_pos=match‑by‑position] ) |
パラメータ名 | 内容 |
---|---|
input‑columns | 予測に使用する説明変数列をカンマ区切りで指定 |
model‑name | 予測に使用するモデル名 |
match_by_pos | (オプション) 入力列と特徴量の紐付けのルール。以下のいずれかを指定。 false:入力した列名と特徴量の名前で紐付(デフォルト) true:列名は無視し、入力した列の順番通りに紐づけ |
本例ではsvm_reg_mtcarsモデルを用いて、mtcars_testのcarb列を予測します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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による評価も確認します。
1 2 3 4 5 6 7 8 |
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関数を利用できます。
1 2 3 4 |
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 Modelhttps://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/SVM/BuildinganSVMforRegressionModel.htm
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。- 投稿タグ
- 機械学習, Machine Learning, SVM, SVR