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 |
$ 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) |
ロジスティック回帰による機械学習を行うには、LOGISTIC_REG関数を利用します。
1 2 3 4 5 6 7 8 |
LOGISTIC_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(シリンダー数)、wt(重量)を説明変数として機械学習を行い、am列(0=オートマ、1=マニュアル)を予測します。
サンプルデータセットでは、すでにmtcarsデータを分割した訓練データ(mtcars_train)とテストデータ(mtcars_test)が用意されています。そのため、mtcars_trainテーブルを用いてロジスティック回帰による機械学習を行います。
1 2 3 4 5 6 |
dbadmin=> SELECT LOGISTIC_REG('logistic_reg_mtcars', 'mtcars_train', 'am', 'cyl, wt'); LOGISTIC_REG ---------------------------- Finished in 20 iterations (1 row) |
サマリを出力
作成したlogistic_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='logistic_reg_mtcars'); GET_MODEL_SUMMARY ----------------------------------------------------- ======= details ======= predictor|coefficient| std_err |z_value |p_value ---------+-----------+-----------+--------+-------- Intercept| 262.39898 |44745.77338| 0.00586| 0.99532 cyl | 16.75892 |5987.23236 | 0.00280| 0.99777 wt |-119.92116 |17237.03154|-0.00696| 0.99445 ============== regularization ============== type| lambda ----+-------- none| 1.00000 =========== call_string =========== logistic_reg('public.logistic_reg_mtcars', 'mtcars_train', '"am"', 'cyl, wt' USING PARAMETERS optimizer='newton', epsilon=1e-06, max_iterations=100, regularization='none', lambda=1, alpha=0.5) =============== Additional Info =============== Name |Value ------------------+----- iteration_count | 20 rejected_row_count| 0 accepted_row_count| 20 (1 row) |
作成したモデルの評価
学習時に利用していないテストデータ(mtcars_test)を利用して、作成したモデルの精度を評価します。作成したモデルによる評価(予測)を行うにはPREDICT_LOGISTIC_REG関数を使用します。
1 2 3 4 5 |
PREDICT_LOGISTIC_REG ( input‑columns USING PARAMETERS model_name='model‑name' [, type='prediction‑type'] [, cutoff=probability‑cutoff] [, match_by_pos=match‑by‑position] ) |
パラメータ名 | 内容 |
---|---|
input‑columns | 予測に使用する説明変数列をカンマ区切りで指定 |
model‑name | 予測に使用するモデル名 |
type | (オプション) 以下のいずれかを指定 response:予測結果を0 or 1で出力(デフォルト) probability: 予測結果が1になる確率を出力 |
cutoff | (オプション) typeをresponseに指定した場合に、予測結果を1とする閾値。例えば0.2に設定した場合は、予測結果が1になる確率が0.2以上であれば、1を返すようになる。デフォルトは0.5。 |
match_by_pos | (オプション) 入力列と特徴量の紐付けのルール。以下のいずれかを指定。 false:入力した列名と特徴量の名前で紐付(デフォルト) true:列名は無視し、入力した列の順番通りに紐づけ |
本例ではlogistic_reg_mtcarsモデルを用いて、mtcars_testのam列を予測します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
dbadmin=> SELECT car_model, dbadmin-> am, dbadmin-> PREDICT_LOGISTIC_REG(cyl, wt dbadmin(> USING PARAMETERS model_name='logistic_reg_mtcars') AS Prediction dbadmin-> FROM mtcars_test; car_model | am | Prediction ----------------+----+------------ AMC Javelin | 0 | 0 Camaro Z28 | 0 | 0 Datsun 710 | 1 | 1 Honda Civic | 1 | 1 Hornet 4 Drive | 0 | 0 Maserati Bora | 1 | 0 ★ Merc 280 | 0 | 0 Merc 450SL | 0 | 0 Porsche 914-2 | 1 | 1 Toyota Corona | 0 | 1 ★ Valiant | 0 | 0 Volvo 142E | 1 | 0 ★ (12 rows) |
★のデータについては、間違った分類を行っていますが、それ以外は期待した分類が行われていることが確認できます。
また、PREDICT_LOGISTIC_REG関数でtype=probabilityオプションを指定することで、分類される条件に合致する確率も併せて求めることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
dbadmin=> SELECT car_model, dbadmin-> am, dbadmin-> PREDICT_LOGISTIC_REG(cyl, wt dbadmin(> USING PARAMETERS model_name='logistic_reg_mtcars') AS Prediction, dbadmin-> PREDICT_LOGISTIC_REG(cyl, wt dbadmin(> USING PARAMETERS model_name='logistic_reg_mtcars', dbadmin(> type='probability') AS Probability dbadmin-> FROM mtcars_test; car_model | am | Prediction | Probability ----------------+----+------------+---------------------- AMC Javelin | 0 | 0 | 1.93335235262061e-07 Camaro Z28 | 0 | 0 | 2.22044604925031e-16 Datsun 710 | 1 | 1 | 1 Honda Civic | 1 | 1 | 1 Hornet 4 Drive | 0 | 0 | 1.54006273987709e-10 Maserati Bora | 1 | 0 | 2.22044604925031e-16 Merc 280 | 0 | 0 | 2.22044604925031e-16 Merc 450SL | 0 | 0 | 2.22044604925031e-16 Porsche 914-2 | 1 | 1 | 1 Toyota Corona | 0 | 1 | 1 Valiant | 0 | 0 | 2.22044604925031e-16 Volvo 142E | 1 | 0 | 0.0189621628149318 (12 rows) |
実装
作成したロジスティック回帰のモデルを実装する場合も、評価時に利用したPREDICT_LOGISTIC_REG関数を利用できます。
1 2 3 4 5 |
SELECT car_model, am, PREDICT_LOGISTIC_REG(cyl, wt USING PARAMETERS model_name='logistic_reg_mtcars') AS Prediction FROM <予測したいデータがあるテーブル>; |
参考情報
Building a Logistic Regression Modelhttps://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/LogisticRegression/ProgrammingExampleLogisticReg.htm