Verticaでは、機械学習の回帰アルゴリズムとして線形回帰を利用できます。
※Lasso回帰(L1正則化)、Ridge回帰(L2正則化)、Elastic Netにも対応しています。
目次
線形回帰とは
線形回帰は、機械学習における教師あり学習のアルゴリズムであり、回帰を行う際に利用できます。例えば、商品の需要予測や応募人数の予測など数値を予測したい際に利用します。
以降では、サンプルデータを例に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 |
$ 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の側面から構成されています。
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) |
線形回帰による機械学習を行うには、LINEAR_REG関数を利用します。
1 2 3 4 5 6 7 8 9 |
LINEAR_REG ( 'model‑name', 'input‑relation', 'response‑column', 'predictor‑columns' [ USING PARAMETERS [exclude_columns='excluded‑columns'] [, optimizer='optimizer‑method'] [, regularization='regularization‑method'] [, epsilon=epsilon‑value] [, max_iterations=iterations] [, lambda=lamda‑value] [, alpha=alpha‑value] ] ) |
パラメータ名 | 内容 |
---|---|
model‑name | 任意のモデル名 |
input‑relation | 学習データのテーブル名 |
response‑column | 予測したい列(目的変数) |
predictor‑columns | 予測に使用する説明変数 |
exclude_columns | (オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列 |
optimizer | (オプション) モデルが利用するオプティマイザ。以下から選択が可能。 ・Newton ・BFGS ・CGD (デフォルト) |
regularization | (オプション) 正則化の方法。以下から選択が可能。 ・None (デフォルト) ・L1 ・L2 ・ENet |
epsilon | (オプション) アルゴリズムが指定した精度に達成したかを決める閾値。 デフォルトは1e-6(0.000001) |
max_iterations | (オプション) 反復回数の上限値。デフォルトは100 |
lambda | (オプション) 正則化パラメータの値(0以上で指定)。デフォルトは1 |
alpha | (オプション) regularizationでENetを指定した場合のL1、L2正則化の混合パラメータ値を0~1の範囲で指定。 ・0:L2正則化 ・1:L1正則化 0を指定した場合はL2正則化、1を指定した場合はL1正則化に相当する。 |
本例ではcyl(シリンダー数), hp(馬力), drat(リアアクセル比), wt(重量)を説明変数として機械学習を行い、carb(キャブレター数)の値を予測します。
サンプルデータセットでは、すでにmtcarsデータを分割した訓練データ(mtcars_train)とテストデータ(mtcars_test)が用意されています。そのため、mtcars_trainテーブルを用いて線形回帰による機械学習を行います。
1 2 3 4 5 6 7 |
dbadmin=> SELECT LINEAR_REG('linear_reg_mtcars', 'mtcars_train', 'carb', 'cyl, hp, drat, wt' dbadmin(> USING PARAMETERS optimizer='BFGS'); LINEAR_REG --------------------------- Finished in 6 iterations (1 row) |
サマリを出力
作成したlinear_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 32 33 34 35 36 37 38 |
dbadmin=> SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='linear_reg_mtcars'); GET_MODEL_SUMMARY ----------------------------------------------------- ======= details ======= predictor|coefficient|std_err |t_value |p_value ---------+-----------+--------+--------+-------- Intercept| -3.54354 | 5.11045|-0.69339| 0.49866 cyl | -0.03511 | 0.41928|-0.08374| 0.93437 hp | 0.01398 | 0.00952| 1.46924| 0.16243 drat | 0.97173 | 0.97816| 0.99343| 0.33626 wt | 0.35160 | 0.40195| 0.87473| 0.39551 ============== regularization ============== type| lambda ----+-------- none| 1.00000 =========== call_string =========== linear_reg('public.linear_reg_mtcars', 'mtcars_train', '"carb"', 'cyl, hp, drat, wt' USING PARAMETERS optimizer='bfgs', epsilon=1e-06, max_iterations=100, regularization='none', lambda=1, alpha=0.5) =============== Additional Info =============== Name |Value ------------------+----- iteration_count | 6 rejected_row_count| 0 accepted_row_count| 20 (1 row) |
作成したモデルの評価
学習時に利用していないテストデータ(mtcars_test)を利用して、作成したモデルの精度を評価します。作成したモデルによる評価(予測)を行うにはPREDICT_LINEAR_REG関数を使用します。
1 2 3 |
PREDICT_LINEAR_REG ( input‑columns USING PARAMETERS model_name='model‑name' [, match_by_pos=match‑by‑position] ) |
パラメータ名 | 内容 |
---|---|
input‑columns | 予測に使用する説明変数列をカンマ区切りで指定 |
model‑name | 予測に使用するモデル名 |
match_by_pos | (オプション) 入力列と特徴量の紐付けのルール。以下のいずれかを指定。 false:入力した列名と特徴量の名前で紐付(デフォルト) true:列名は無視し、入力した列の順番通りに紐づけ |
本例ではlinear_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_LINEAR_REG(cyl, hp, drat, wt USING PARAMETERS model_name='linear_reg_mtcars')) AS pred dbadmin-> FROM mtcars_test; car_model | carb | pred ----------------+------+------ AMC Javelin | 2 | 3 Camaro Z28 | 4 | 5 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_LINEAR_REG(cyl, hp, drat, wt USING PARAMETERS model_name='linear_reg_mtcars') AS pred dbadmin(> FROM mtcars_test) AS prediction_output; mse | Comments -----------------+--------------------------------------------- 1.0610631269984 | Of 12 rows, 12 were used and 0 were ignored (1 row) |
実装
作成した線形回帰のモデルを実装する場合も、評価時に利用したPREDICT_LINEAR_REG関数を利用できます。
1 2 3 4 |
SELECT car_model, carb, ROUND(PREDICT_LINEAR_REG(cyl, hp, drat, wt USING PARAMETERS model_name='linear_reg_mtcars')) AS pred FROM <予測したいデータがあるテーブル>; |
参考情報
Building a Linear Regression Modelhttps://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/LinearRegression/ProgrammingExampleLinearReg.htm