はじめに

機械学習において、学習データの中に他と比較して極端に大きな値や小さな値といった「異常値」が存在すると、その値の影響により正しい学習が行えない場合があります。

そのため、異常値はノイズとして事前に学習データから排除する場合が多いです。
VerticaはDETECT_OUTLIERS関数を利用するとデータ内の異常値を簡単に検出し除外することが可能です。

DETECT_OUTLIERS

コマンド構文

パラメータ名内容
output‑table異常値データの出力先テーブル名
input‑relation異常値検出対象のテーブル、ビュー
input‑columns 異常値検出対象の列。複数列指定する場合は「,」カンマで区切ります。
detection‑method使用するメソッド。Version 9.1現在、指定できるメソッドはrobust_zscoreのみです。
exclude_columns (オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列
partition_columns(オプション) パーティションを定義する場合のパーティション列。複数列指定する場合は「,」カンマで区切ります。

利用例

例として以下の野球選手の成績が格納されているbaseball_rosterテーブルを利用します。


DETECT_OUTLIERS関数を利用し、hr(ホームラン数)が異常値であるデータを検出し除外します。


作成されたbaseball_outliersテーブルを検索すると、以下の2件がhrが異常値のデータとして検出されたことが確認できます。


以下のSQLで異常値データ(id=7,9のデータ)を除外したビューを作成できます。


除外対象の閾値

DETECT_OUTLIERS関数はoutlier_thresholdパラメータの値に基いて除外対象の閾値を決定しています。
パラメータを指定しない場合はoutlier_threshol=3.0となります。
その場合、正規分布表の±3σの区間に納まらない値を除外対象とするということを意味します。
※±3σの区間に値が入る確率は99.74%です。



なお、VerticaのDETECT_OUTLIERS関数はロバストzスコアを用いているため、厳密には標準偏差、平均値は利用せず、以下のように正規四分位範囲、中央値を用いて計算しています。

Z = (Xi – Xm) / NIQR

Xi:対象データxのi番目のデータ
Xm:対象データxの中央値
NIQR:正規四分位範囲


参考情報

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

検証バージョンについて

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