はじめに
機械学習において、学習データの中に他と比較して極端に大きな値や小さな値といった「異常値」が存在すると、その値の影響により正しい学習が行えない場合があります。そのため、異常値はノイズとして事前に学習データから排除する場合が多いです。
VerticaはDETECT_OUTLIERS関数を利用するとデータ内の異常値を簡単に検出し除外することが可能です。
DETECT_OUTLIERS
コマンド構文
1 2 3 4 |
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テーブルを利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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(ホームラン数)が異常値であるデータを検出し除外します。
1 2 3 4 5 6 |
dbadmin=> SELECT DETECT_OUTLIERS('baseball_outliers', 'baseball_roster', 'hr', 'robust_zscore'); DETECT_OUTLIERS ---------------------- Detected 2 outliers (1 row) |
作成されたbaseball_outliersテーブルを検索すると、以下の2件がhrが異常値のデータとして検出されたことが確認できます。
1 2 3 4 5 6 |
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のデータ)を除外したビューを作成できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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_OUTLIERShttps://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/MachineLearning/DETECT_OUTLIERS.htm
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。- 投稿タグ
- 機械学習, Machine Learning, データ準備, 異常値