はじめに
機械学習において、学習データの中に他と比較して極端に大きな値や小さな値といった「異常値」が存在すると、その値の影響により正しい学習が行えない場合があります。
そのため、異常値はノイズとして事前に学習データから排除する場合が多いです。
VerticaはDETECT_OUTLIERS関数を利用するとデータ内の異常値を簡単に検出し除外することが可能です。
DETECT_OUTLIERS
コマンド構文
SELECT DETECT_OUTLIERS ( 'output‑table', 'input‑relation','input‑columns', 'detection‑method'
[ USING PARAMETERS [outlier_threshold=threshold]
[, exclude_columns='excluded‑columns']
[, partition_columns='partition‑columns'] ] )パラメータ名 | 内容 |
|---|---|
output‑table | 異常値データの出力先テーブル名 |
input‑relation | 異常値検出対象のテーブル、ビュー |
input‑columns | 異常値検出対象の列。複数列指定する場合は「,」カンマで区切ります。 |
detection‑method | 使用するメソッド。Version 9.1現在、指定できるメソッドはrobust_zscoreのみです。 |
exclude_columns | (オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列 |
partition_columns | (オプション) パーティションを定義する場合のパーティション列。複数列指定する場合は「,」カンマで区切ります。 |
利用例
例として以下の野球選手の成績が格納されているbaseball_rosterテーブルを利用します。
dbadmin=> SELECT * FROM baseball_roster;
id | last_name | hr | avg
----+-----------+--------+--------
1 | Polo | 7 | 0.233
2 | Gloss | 45 | 0.17
3 | Gus | 12 | 0.345
4 | Gee | 1 | 0.125
5 | Laus | 3 | 0.095
6 | Hilltop | 16 | 0.222
7 | Wicker | 78 | 0.333
8 | Scooter | 0 | 0.121
9 | Hank | 999999 | 0.8888
10 | Popup | 35 | 0.378
(10 rows)DETECT_OUTLIERS関数を利用し、hr(ホームラン数)が異常値であるデータを検出し除外します。
dbadmin=> SELECT DETECT_OUTLIERS('baseball_outliers', 'baseball_roster', 'hr', 'robust_zscore');
DETECT_OUTLIERS
----------------------
Detected 2 outliers
(1 row)作成されたbaseball_outliersテーブルを検索すると、以下の2件がhrが異常値のデータとして検出されたことが確認できます。
dbadmin=> SELECT * FROM baseball_outliers;
id | last_name | hr | avg
----+-----------+--------+--------
7 | Wicker | 78 | 0.333
9 | Hank | 999999 | 0.8888
(2 rows)以下のSQLで異常値データ(id=7,9のデータ)を除外したビューを作成できます。
dbadmin=> CREATE VIEW clean_baseball_roster AS
dbadmin-> SELECT * FROM baseball_roster WHERE id NOT IN (SELECT id FROM baseball_outliers);
CREATE VIEW
dbadmin=> SELECT * FROM clean_baseball_roster ;
id | last_name | hr | avg
----+-----------+----+-------
1 | Polo | 7 | 0.233
2 | Gloss | 45 | 0.17
3 | Gus | 12 | 0.345
4 | Gee | 1 | 0.125
5 | Laus | 3 | 0.095
6 | Hilltop | 16 | 0.222
8 | Scooter | 0 | 0.121
10 | Popup | 35 | 0.378
(8 rows)除外対象の閾値
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で確認しています。
