Verticaはデータベース上でSQLを使った機械学習を実施することが可能です。
本記事ではVerticaの機械学習機能を利用してタイタニック号の乗客生存予測にチャレンジします。

使用するデータ

KaggleやSignate等で機械学習の初心者向けに公開されているデータセットである、タイタニックデータを使用します。

タイタニック号は1912年4月15日の早朝、氷山と衝突して大西洋に沈没しました。
タイタニックデータには、沈没時にタイタニック号に乗船していた乗客の名簿情報が格納されています。
この名簿情報を学習し、各乗客が「生存」したか「死亡」したかを予測していきます。

サンプルスキーマ、データのダウンロード

本記事では、Verticaが公開している機械学習のサンプルデータセットに含まれているタイタニックデータを使用します。
以下URLよりサンプルファイルをダウンロードします。
https://github.com/vertica/Machine-Learning-Examples

画面右上にある「Clone or Download」をクリックします。


展開される画面の右下にある「Download ZIP」をクリックしてファイルを保存します。

サンプルスキーマの作成、データのロード

ダウンロードしたファイルをVerticaサーバ上の任意のディレクトリに転送します。
転送後、以下コマンドでファイルを解凍します。

解凍後に以下コマンドでサンプルスキーマとテーブルの作成、データロードを実行します。

データの確認

本記事ではtitanic_trainingを使用します。

各列の意味は以下の通りです。

パラメータ名意味
passenger_id乗客のID
survived生死情報
0 = 死亡
1 = 生存
pclass乗客のクラス
1 = 一等客室
2 = 二等客室
3 = 三等客室
name 乗客名
sex性別
age年齢
sibling_and_spouse_count兄弟および妻の人数
parent_and_child_count親および子の人数
ticketチケット番号
fare乗船料金
cabinキャビン番号
embarkation_point乗船地
C = Cherbourg (フランス)
Q = Queenstown (アイルランド)
S = Southampton (イングランド)


まず、データ件数を確認します。


死亡(survived=0)、生存(survived=1)の割合も併せて確認します。

生存者データは全体の36%程度であることが確認できました。

次にSUMMARIZE_NUMCOL関数を利用して数値データの基本統計量を確認します。


次に文字データも含む全列の欠損の有無を確認します。

age列、cabin列、embarkation_point列に欠損データがあることがわかります。

データ準備

タイタニックデータに限らず、集めたデータをそのまま機械学習で利用できることは滅多にありません。
まずは、機械学習で利用できるようにデータを加工していきます。

欠損値の補完

欠損データがあると、その行は学習データとして利用できません。そのためage列、cabin列の欠損値を補完します。
cabin列は欠損データが多すぎるため、補完は行わず学習の対象から除外します。
欠損値の補完はIMPUTE関数を使用します。

まずはage列の欠損データを補完します。今回はpclass、sex列のパーティションごとの平均値で補完します。

補完後のデータはtitanic_training_age_imputeビューを検索すると確認できます。

次に、embarkation_point列の欠損データを補完します。今回は全データの最頻値で補完します。

上記にて、age列、embarkation_point列の欠損データが補完されたtitanic_training_embark_imputeビューが作成されました。
再度欠損データを確認するとage列、embarkation_point列の結果が「0」(欠損なし)になっていることが確認できます。


新しい特徴量の生成

家族の人数と死亡/生存者数を確認すると、家族の人数が死亡 or 生存に影響を及ぼす可能性が考えられます。
※sibling_and_spouse_count(兄弟および妻の人数)、parent_and_child_count(親および子の人数)に本人(+1)を足した値を家族の人数(family_size)とする


そのため、以下のSQLでfamily_size(家族の人数)という新たな特徴量を生成します。


以下のようにfamily_size列が追加されました。


One-hot表現変換

データ内にはカテゴリデータがいくつか含まれているため、One-hot表現に変換します。
One-hot表現変換はONE_HOT_ENCODER関数を使用します。

上記にて、sex列、embarkation_point列をOne-hot表現に変換するためのエンコーダ(titanic_encoder)が作成されました。

次に、APPLY_ONE_HOT_ENCODER関数でtitanic_encoderを使用して、One-hot表現変換を実行します。
その際、今回学習に使用しないname列、ticket列、cabin列、sex列、embarkation_point列は選択リストから除外します。


ここまでで、以下のような学習データができあがりました。


正規化

最後に、One-hot表現以外の列の正規化を行います。本記事ではminmax法を使用します。
正規化はNORMALIZE関数を使用します。


以上でデータ準備は完了です。最終的には以下のデータができあがりました。


予測モデルの作成(学習)/評価

Cross-Validation(交差検証)

本記事では、Cross-Validation(交差検証)を利用して予測モデルを作成し、評価ます。
Cross-Validationを実施するには、CROSS_VALIDATE関数を使用します。

なお、利用する予測モデルはCROSS_VALIDATE関数で利用可能なサポートベクターマシン(SVM)ナイーブベイズロジスティック回帰の3つです。また評価指標としてaccuracyとAUCを使用します。

サポートベクターマシン


ナイーブベイズ


ロジスティック回帰


本記事ではAUCが一番高いサポートベクターマシンを採用することにします。

グリッドサーチ

次に、サポートベクターマシンのハイパーパラメータをチューニングします。
引き続きCROSS_VALIDATE関数を使用します。今回はC(コスト)パラメータのグリッドサーチを行い、最適なパラメータ値を見つけます。


accuracyはC >= 100は変化がありません。AUCはC=1000が一番良い精度となりました。
そのため、今回はC=1000を採用します。

予測モデルの実装

サポートベクターマシンを利用した予測モデルの作成を行います。作成時のC(コスト)パラメータは、上記結果のC=100を採用します。

サポートベクターマシンを利用したモデル作成はSVM_CLASSIFIER関数を使用します。


作成したモデルのサマリー情報はGET_MODEL_SUMMARY関数で確認できます。


作成した予測モデルを呼び出して、予測結果を確認してみます。予測モデルの呼び出しはPREDICT_SVM_CLASSIFIER関数を使用します。


以上で、タイタニック号の乗客生存予測チャレンジは終了です。
このように、Verticaでは機械学習で一般的に必要な操作を、全てVertica上でSQLを用いて実施することができます。



参考情報

Titanic: Machine Learning from Disaster (Kaggle)
https://www.kaggle.com/c/titanic

【練習問題】タイタニックの生存予測 (Signate)
https://signate.jp/competitions/102

検証バージョンについて

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