はじめに

機械学習において数値データの列を説明変数として利用する場合は、事前に正規化を行うと精度が向上することがあります。
例えば従業員データの内、「給与」列と「勤続年数」列を説明変数として機械学習に利用する場合、給与は「円」や「ドル」、勤続年数は「年」といったように単位が異なります。また単位が異なれば当然数値の範囲も異なります。このようなスケールが異なる列を同じスケールにするために正規化を利用します。



VerticaはNORMALIZE_FIT/APPLY_NORMALIZE関数を利用するとデータの正規化を行うことができます。

NORMALIZE_FIT/APPLY_NORMALIZE

コマンド構文

パラメータ名内容
model‑name正規化の計算パラメータを保持するモデル名
input‑relation正規化対象のテーブル、ビュー
input‑columns 正規化対象の列。複数列指定する場合は「,」カンマで区切ります。
normalization‑methodminmax:0~1の範囲で正規化を実施します。
zscore:平均値0、標準偏差1になるように正規化を実施します。
robust_zscore:正規四分位範囲を用いて正規化を実施します。
exclude_columns (オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列
output_view(オプション) 正規化後のデータを保存する場合はそのビュー名を指定します。

利用例

例として従業員データであるsalary_dataテーブルを正規化します。

1)years_worked(勤続年数)、current_salary(給与)列はスケールが異なるため、正規化を実施します。


2)years_worked、current_salary列に対して、NORMALIZE_FIT関数を使用して正規化の計算を行います。
 ※本例ではminmax法を用いて正規化を計算します。


3)GET_MODEL_SUMMARY関数を使用すると、計算時に利用したデータの範囲(min/max)を確認することができます。


4)NORMALIZE_FIT関数で計算した正規化パラメータはモデルとしてVertica内に保存されています。
 実際に正規化を行う場合はAPPLY_NORMALIZE関数を使用してモデルを適用します。

パラメータ名内容
input‑columns 正規化対象の列。複数列指定する場合は「,」カンマで区切ります。
model‑name使用する正規化パラメータのモデル名


APPLY_NORMALIZE関数で実際にsalary_dataテーブルのyears_worked、current_salary列を正規化します。
※手順2)で作成したsalary_data_normfitを使用します。


これにより、years_worked、current_salary列の値がデータ間の差は維持したまま0~1の範囲に置き換えられました。

例えば、years_workedの最大値は手順2)で20であることが確認できています。
以下のemployee_id 2974のデータはyears_workedが20ですが、正規化後は1に置き換えられています。


また、employee_id 2659のデータはyears_workedが10で全体の中央値のため、正規化後は0.5に置き換えられています。


なお、NORMALIZE_FIT関数で作成した正規化モデルは、計算時に指定したテーブル以外でも適用可能なため、学習時だけでなく実際の予測時にも前処理で利用可能です。

参考情報

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

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

検証バージョンについて

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