OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

Verticaで始める機械学習~ロジスティック回帰を使った分類~

公開日:
更新日:
基本操作
機械学習
#機械学習

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

ロジスティック回帰モデルの作成

本記事では機械学習のサンプルデータとしてよく用いられる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)

ロジスティック回帰による機械学習を行うには、LOGISTIC_REG関数を利用します。

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テーブルを用いてロジスティック回帰による機械学習を行います。

dbadmin=> SELECT LOGISTIC_REG('logistic_reg_mtcars', 'mtcars_train', 'am', 'cyl, wt');
        LOGISTIC_REG
----------------------------
 Finished in 20 iterations

(1 row)

サマリを出力

作成したlogistic_reg_mtcarsモデルのサマリ情報を確認します。

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関数を使用します。

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列を予測します。

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オプションを指定することで、分類される条件に合致する確率も併せて求めることができます。

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関数を利用できます。

SELECT car_model,
       am,
       PREDICT_LOGISTIC_REG(cyl, wt
                           USING PARAMETERS model_name='logistic_reg_mtcars') AS Prediction
FROM <予測したいデータがあるテーブル>;

参考情報

Building a Logistic Regression Model
https://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/LogisticRegression/ProgrammingExampleLogisticReg.htm

検証バージョンについて

この記事の内容はVertica 9.1で確認しています。