はじめに

機械学習を行う際、多くの場合はカテゴリデータをそのまま利用することはできないため、事前にベクトル表現に変換する必要があります。例えば、カラー列に「赤」、「緑」、「青」の三種類のデータがある場合単純に赤→[1]、緑→[2]、青→[3]に置き換えると、機械学習の結果に悪影響が生じることがあります。

上記データの場合1から3までのユークリッド距離は1から2までと比較して2倍になります。つまり
「赤(1)」と「青(3)」より「赤(1)」と「緑(2)」の方が距離が近い(似ている)ことになってしまいます。
この問題を回避するために各値をバイナリベクトルにマッピングします。

例えば上記カラー列の場合は以下のようにマッピングできます。
赤→[1,0,0]、緑→[0,1,0]、青→[0,0,1]
これをOne-hot表現と言います。
One-hot表現のイメージ

Vertica 9.0より、ONE_HOT_ENCODER_FIT/APPLY_ONE_HOT_ENCODER関数を使用することで、上記のようなOne-hot表現を簡単に行うことが可能になりました。

ONE_HOT_ENCODER

コマンド構文

パラメータ名意味
model_name任意のモデル名
input_relation対象テーブル名
input_columns対象列名
exclude_columns(オプション) 対象列を*(全列)と指定した場合に、対象列から除外する列
output_view(オプション) 対象テーブルにOne-hot表現に変更した列を付与した結果を保存するビュー
extra_levels(オプション) 対象テーブルに存在しない各カテゴリの追加のレベルを指定します。

利用例

性別データが格納されているt1テーブルを例にします。

gender列の値をOne-hot表現に変換します。

変換内容のサマリー情報はGET_MODEL_SUMMARY関数で確認できます。

この情報を利用して、実際にOne-hot表現に変換する際は、APPLY_ONE_HOT_ENCODER関数を利用します。

パラメータ名意味
input_columns対象列名
model_name対象モデル名(ONE_HOT_ENCODER_FIT関数で作成したモデルを指定)
drop_first(オプション) Falseの場合、カテゴリ変数のすべてのレベルに対応する列が出力ビューに表示されます。 Trueの場合、カテゴリ変数の最初のレベルは参照レベルとして扱われます。(デフォルト:True)
ignore_null(オプション) Falseの場合、対象列のNULL値はカテゴリレベルとして扱われます。 Trueの場合、NULL値は対応する1ホットバイナリ列をすべてNULLに設定します。(デフォルト:True)
separator(オプション) 出力表の入力変数名と標識変数レベルの間の区切り文字を示します。 セパレータを使用したくない場合はNULLを指定します。(デフォルト:_(アンダースコア))


ONE_HOT_ENCODER_FIT関数を利用して作成したt1_encoderを使用して、実際にOn-hot表現に変換します。

上記の場合、以下のようにマッピングされていることがわかります。

Female→[0,0]、Male→[1,0]、Not specified→[0,1]

このように、ONE_HOT_ENCODER_FIT/APPLY_ONE_HOT_ENCODER関数を使用することで、簡単にOne-hot表現に変換することができます。

応用例:タイタニック乗船者の生死予測のデータ準備でOne-hot表現変換を行う

機械学習のデータ準備としてONE_HOT_ENCODER_FIT/APPLY_ONE_HOT_ENCODER関数を利用する例をご紹介します。
本例ではタイタニックデータセットを利用して、どの乗客がタイタニック号の沈没を生き延びたかをロジスティック回帰を使用して予測します。
※タイタニックデータセットの詳細についてはkaggleのサイトをご参照ください。

データ準備

学習データとして「titanic_training」テーブルを使用します。
本テーブルにはpassenger_id(乗客ID)、survived(助かったか否か)、pclass(乗客の階級)、name(名前)、sex(性別)、age(年齢)、sibling_and_spouse_count(兄弟、配偶者の数)、parent_and_child_count(両親、子どもの数)、ticket(チケット番号)、fare(チケット料金)、embarkation_point(乗船場所)という情報があります。

本例ではsurvived(助かったか否か)を予測する説明変数としてpclass、sex、age、sibling_and_spouse_count、parent_and_child_count、fare、embarkation_point列を利用しますが、sex、embarkation_point列は文字列であり、そのままでは機械学習には利用できません。

そのため、学習データ(titanic_training)のsex、embarkation_point列をOne-hot表現に変換するモデルを作成します。

サマリー情報を確認します。 sex列は2種類、embarkation_pointは空白(NULL値)を除いて3種類のデータがあることがわかります。

学習データ(titanic_training)、テストデータ(titanic_testing)に対して、先ほど作成したtitanic_encoderモデルを使用してOne-hot表現に変換するビューを作成します。
●学習データ(titanic_training)のOne-hot表現変換

●テストデータ(titanic_training)のOne-hot表現変換

学習データ(titanic_training_encoded)、テストデータ(titanic_testing_encoded)を確認すると、sex、embarkation_point列がOne-hot表現に変換されていることが確認できます。
●学習データ(titanic_training_encoded)

●テストデータ(titanic_testing_encoded)

上記の場合、以下のようにマッピングされていることがわかります。
●sex列
Female→[0]、Male→[1]

●embarkation_point列
C→[0,0]、S→[0,1]、Q→[1,0]

モデル作成

One-hot表現に変換した後のデータ(titanic_training_encodedビュー)を学習データとして、survived(助かったか否か)を予測するロジスティック回帰モデルを作成します。

実装

※本例では評価ステップは割愛しています。

作成したtitanic_log_regモデルを使用して、One-hot表現に変換したテストデータ(titanic_testing_encodedビュー)に対して、予測を行うことができました。
※予測結果はPREDICT_LOGISTIC_REG列の値を参照(0:死亡、1:生存)

参考情報

Encoding Categorical Columns
https://my.vertica.com/docs/9.0.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/DataPreparation/EncodingCategoricalColumns.htm

検証バージョンについて

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