はじめに
機械学習の分類において、作成した予測モデルを評価する際にROC/AUCを用いることがあります。
VerticaはROC関数を利用するとROC/AUCによる評価を行えます。
ROC
コマンド構文
ROC ( targets, probabilities
[ USING PARAMETERS [num_bins=num‑bins]
[, AUC=output] ] )
OVER()パラメータ名 | 内容 |
|---|---|
targets | 目的変数(正解情報)が格納されている列 |
probabilities | 予測結果(クラスが1である確率)が格納されている列 |
num‑bins | (オプション) 決定境界の数。デフォルトは100です。 |
output | (オプション) AUCを出力するか否か。デフォルトはtrue(出力する)です。 |
Vertica 9.2から、INTEGER型だけでなく、BOOLEAN型、CHAR/VARCHAR型の入力データもサポートされ、分類アルゴリズムでも利用できるようになりました。
利用例
例として以下のロジスティック回帰を使用して作成したタイタニックの生存者予測モデル(titanic_log_regの予測結果を評価します。
survived列が正解情報、predectionがVerticaが予測した結果です。
※0=死亡、1=生存
dbadmin=> SELECT passenger_id, survived,
dbadmin-> PREDICT_LOGISTIC_REG(pclass, sex_1, age, sibling_and_spouse_count,parent_and_child_count,fare,embarkation_point_1,embarkation_point_2
dbadmin(> USING PARAMETERS model_name='titanic_log_reg') AS prediction
dbadmin-> FROM titanic_training_encoded ORDER BY passenger_id LIMIT 5;
passenger_id | survived | prediction
--------------+----------+------------
1 | 0 | 0
2 | 1 | 1
3 | 1 | 1
4 | 1 | 1
5 | 0 | 0
(5 rows)※本例では説明の都合上、トレーニングデータで評価を実施しています。
ROC関数を利用し、上記の予測結果を評価します。
事前準備として、予測結果の呼び出しを簡素化するために、上記SQLをビューとして登録しておきます。
dbadmin=> CREATE VIEW titanic_probability AS
dbadmin-> SELECT passenger_id, survived AS obs,
dbadmin-> PREDICT_LOGISTIC_REG(pclass, sex_1, age, sibling_and_spouse_count,parent_and_child_count,fare,embarkation_point_1,embarkation_point_2
dbadmin(> USING PARAMETERS model_name='titanic_log_reg',type='probability') AS prob
dbadmin-> FROM titanic_training_encoded;
CREATE VIEW※ROC/AUCは予測の確率を基に計算を行うため、PREDICT_LOGISTIC_REGのオプションでtype=’probability’を指定して確率表示を行っています。
作成したtitanic_probabilityビューに対してROC関数を実行します。
dbadmin=> SELECT ROC(obs::int, prob::float) OVER() FROM titanic_probability;
decision_boundary | false_positive_rate | true_positive_rate | AUC | comment
-------------------+---------------------+---------------------+-------------------+-------------------------------------------------
0 | 1 | 1 | |
0.01 | 1 | 1 | |
0.02 | 0.997506234413965 | 1 | |
0.03 | 0.987531172069825 | 1 | |
0.04 | 0.965087281795511 | 1 | |
0.05 | 0.925187032418953 | 1 | |
0.06 | 0.870324189526185 | 0.988142292490119 | |
0.07 | 0.825436408977556 | 0.980237154150198 | |
0.08 | 0.763092269326683 | 0.964426877470356 | |
0.09 | 0.708229426433915 | 0.936758893280632 | |
0.1 | 0.660847880299252 | 0.924901185770751 | |
0.11 | 0.603491271820449 | 0.91304347826087 | |
・
・
・
0.95 | 0.00249376558603491 | 0.102766798418972 | |
0.96 | 0.00249376558603491 | 0.0513833992094862 | |
0.97 | 0 | 0.0118577075098814 | |
0.98 | 0 | 0.00395256916996047 | |
0.99 | 0 | 0 | |
1 | 0 | 0 | 0.861556582851173 | Of 815 rows, 654 were used and 161 were ignored
(101 rows)上記結果よりtitanic_log_regモデルのAUCは0.861556582851173であることが確認できます。
また、Excel等で上記結果を利用することでROC曲線を描くことが可能です。
ROC曲線の出力例
参考情報
検証バージョンについて
この記事の内容はVertica 9.1、9.2で確認しています。
更新履歴
2019/07/09 Vertica 9.2の情報を追加
2018/11/09 本記事を公開

