はじめに

機械学習において、多くの特徴量を使用することは学習時間の増加を招いたり、多重共線性の確認を難しくする可能性があります。また、データの内容を理解する際も、3次元(x,y,z)を超えると可視化が難しくなります。
これらを解決する方法として、主成分分析(PCA)が用いられることがよくあります。
VerticaはPCA関数を用いることで主成分分析(PCA)を実施できます。

PCA

コマンド構文

パラメータ名内容
model‑name 任意のモデル名
input‑relation 対象テーブル名
input‑columns使用する列
exclude_columns (オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列
num_components (オプション) モデルに保持するコンポーネント数。 値を指定しないと、すべてのコンポーネントが保持されます。
scale(オプション) 列を標準化するか指定。
true:共分散行列の代わりに相関行列を使用
false:(デフォルト)
method(オプション) PCAを計算するために使用される方法。LAPACKのみ指定可能。

データ可視化のためのPCA

例として以下のworldテーブルのデータを使用します。
このテーブルには1970年から2010年までの96カ国のGDP(gdpyyyy列)とCO2排出量(emyyyy列)、及び2011年のHDI(人間開発指数)のデータが格納されています。
データセットは96行、84列(国名、GDPが41列、CO2排出レベルが41列、2011年のHDIが1列)で構成されています。
※HDI(人間開発指数)は各国の長寿、知識、人間らしい生活水準を基にした統計値で0~1の間で表されます。


このデータから各国のHDI(人間開発指数)と過去のGDP/CO2排出量にどのような関係があるか分析するには可視化が便利です。しかし、次元(列)が多すぎて可視化するのは困難です。
そこでPCA関数で次元を削減します。今回は過去のGDP/CO2排出量の82次元をPCAを用いて2次元に削減します。


作成したPCAモデルを確認します。まずGET_MODEL_ATTRIBUTEコマンドで利用可能な属性(columns)を確認します。


本例ではsingular_values(特異値)の内容を確認してみます。


accumulated_explained_variance列は、2次元に縮小してもデータの分散を99%以上で維持できることを示しています。
このことから、過去のGDP/CO2排出量を各国毎に2次元でプロットすることが可能であることがわかります。

次に、このモデルを適用して次元削減を行います。モデルの適用はAPPLY_PCA関数を使用します。

パラメータ名内容
input‑columns PCAの対象列。複数列指定する場合は「,」カンマで区切ります。
model‑name使用するPCAのモデル名
num_components(オプション) 保持するコンポーネント(次元)の数。 本パラメータとcutoffを省略すると、すべてのモデルコンポーネントが保持される。
cutoff(オプション) 1に設定すると、accumulated explained varianceの最小値が指定される。 コンポーネントは、accumulated explained varianceがこの値に達するまで実行される。
match_by_pos(オプション) 入力列と特徴量の紐付けのルール。以下のいずれかを指定。
false:入力した列名と特徴量の名前で紐付(デフォルト)
true:列名は無視し、入力した列の順番通りに紐づけ
exclude_columns(オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列
key_columns(オプション) データを一意に識別するための列名。 指定した列は出力結果に含まれる。


本例では2次元に削減した結果をtransformed_data_2compテーブルに挿入します。


出力された結果を確認すると過去のGDP/CO2排出量の82次元がcol1,col2の2次元になっていることが確認できます。


これにより以下のように可視化することができるようになりました。
※クリックで画像拡大


x軸はcol1、y軸はcol2でポインタは各国を表しています。またポインタの色は2011年のHDI(人間開発指数)を表しており、赤色に近いほど高いHDIの国です。上記結果から基本的にはHDIが近い国は近い位置にプロットされていることがわかります。また、右下のルクセンブルグのように他の国とは異なる傾向を示しながらも、HDIが高い国があることも可視化により容易に見つけることができます。
実際にルクセンブルクのデータを確認すると、40年間でCO2排出量を半分まで削減しているにも関わらずGDPは3倍になっています。


機械学習モデル作成のためのPCA

次に、PCAで変換したデータを機械学習の説明変数として利用する例を紹介します。

本例ではランダムフォレスト回帰を利用して、各国の過去のGDP(gdpyyyy)とCO2排出量(emyyyy)を説明変数として学習を行い、人間開発指数(HDI2011)の値を予測します。
その際、説明変数として、一方のモデルは元の列(82列)をそのまま使用し、もう一方のモデルはPCAで5次元に削減した列(5列)を使用します。両者を比較し、次元削減を行っても予測能力に大きな差が出ないことを確認します。

事前準備

まずはworldデータを訓練データとテストデータ(8:2)に分割します。

1)訓練データフラグ列(isTrain)を追加します。


2)全体の80%のデータに対して訓練データフラグを立てます。


3)訓練データフラグがtrueのデータをtrain_dataビューに、falseのデータをtest_dataビューに分割します。


モデル作成

元データで学習
1)元の列(82列)をそのまま使用して学習を行い、rf1モデルを作成します。


2)rf1モデルを用いてtest_dataテーブルのデータを予測し、その結果をeval_rf1_on_test_dataテーブルに保存します。


次元削減したデータで学習
1)PCAモデルを作成します。


2)作成したPCAモデルを使用して次元削減を行い、その結果をtransformed_train_dataテーブルに保存します。


3)テストデータについても同様にPCAモデルを使用して次元削減を行い、その結果をtransformed_test_dataテーブルに保存します。


4)PCAで次元削減した列(5列)を使用して学習を行い、rf2モデルを作成します。


5)rf2モデルを用いてtransformed_test_dataテーブルのデータを予測し、その結果をeval_rf2_on_test_dataテーブルに保存します。


予測精度の比較

実際のHDI(true_HDI)、rf1モデルの予測値(predicted_HDI_all_features)、rf2モデルの予測値(predicted_HDI_5components)を比較してみます。


上記結果を可視化すると以下のようになります。
※クリックで画像拡大

rf1モデルの予測結果(黄色)とrf2モデルの予測結果(赤色)を比較してみると、次元削減を行っても大きな精度劣化は発生しないことが確認できます。つまりHDIの予測については、PCAを利用することで訓練データを大幅に削減することが可能ということがわかります。

参考情報

PCA
https://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/MachineLearning/PCA.htm

APPLY_PCA
https://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/MachineLearning/APPLY_PCA.htm

検証バージョンについて

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