はじめに
機械学習において分類問題などを扱う場合、学習対象データのクラス比率が不均衡であると正しい学習ができないことがあります。
このような場合、件数が多い方のデータを削減する「アンダーサンプリング」や、件数が少ない方のデータを増幅する「オーバーサンプリング」を行い、データのバランスを均一に近づけてから学習を行います。
VerticaはBALANCE関数を利用するとデータのバランシング(アンダー/オーバーサンプリング)が可能です。
BALANCE
コマンド構文
SELECT BALANCE ( 'output‑view', 'input‑relation', 'response‑column', 'balance‑method'
[ USING PARAMETERS sampling_ratio=ratio ] )パラメータ名 | 内容 |
|---|---|
output‑view | バランシング後のデータを格納するビュー名 |
input‑relation | バランシング対象のテーブル、ビュー |
response‑column | 従属変数(バランシングの基準となる列) |
balance‑method | under_sampling:件数が多いカテゴリのデータを削除します。 |
ratio=ratio | (オプション) バランスの比率を指定します。デフォルトは0.5(50%)ずつになるようにバランシングされます。 |
利用例
例として以下のトランザクションデータが格納されているtransaction_dataテーブルを利用します。
fraud列が「TRUE」が正常なトランザクション、「FALSE」が異常なトランザクションデータです。
SELECT * FROM transaction_data;
first_name | last_name | store | cost | fraud
-------------+------------+-------------+---------+-------
Patrick | Crawford | Asoka | 941.75 | FALSE
Roy | Jenkins | Zoolab | 6631.31 | FALSE
Lawrence | Henry | Flowdesk | 7497.62 | FALSE
Janice | Ferguson | Hatity | 1839.41 | FALSE
Edward | Wallace | Zaam-Dox | 2964.77 | FALSE
Thomas | Harvey | Daltfresh | 823.2 | FALSE
Deborah | Harris | Biodex | 3179.37 | FALSE
Joseph | Boyd | Zontrax | 3985.45 | FALSE
Juan | Bishop | Voyatouch | 2487.95 | FALSE
Theresa | Ruiz | Vagram | 6609.19 | FALSE
Robert | Hill | Daltfresh | 7227.63 | FALSE
Eugene | Willis | Regrant | 3730.3 | FALSE
Carlos | Rice | Kanlam | 6603.13 | FALSE
Chris | Austin | Toughjoyfax | 6899.27 | FALSE
Maria | Webb | Temp | 7976.72 | FALSE
Lois | Freeman | Daltfresh | 4633 | FALSE
Joseph | Tucker | Stronghold | 645.46 | FALSE
Theresa | Foster | Flexidy | 3830.15 | FALSE
Adam | Rice | Gembucket | 8757.35 | FALSE
Henry | Ruiz | Mat Lam Tam | 4709.18 | FALSE
Jack | Alvarez | Zaam-Dox | 7554.48 | TRUE
Andrew | Nelson | Overhold | 6400.08 | FALSE
・
・
・
(1000 rows)fraud列を目的変数とする正常/異常なトランザクションを分類するような予測モデルを作成しようとした場合、TRUE/FALSEの件数を集計してみると、FALSEの方が圧倒的に多い、偏りのあるデータであることが確認できます。
このような場合、以降の何れかの方法でバランシングが可能です。
SELECT fraud, COUNT(fraud) FROM transaction_data GROUP BY fraud;
fraud | COUNT
-------+-------
FALSE | 981
TRUE | 19 ★TRUEのデータがFALSEと比較して少ない
(2 rows)アンダーサンプリング
アンダーサンプリングを実施し、FALSEのデータを削減します。
SELECT BALANCE('balance_us_data', 'transaction_data', 'fraud', 'under_sampling');
BALANCE
--------------------------
Finished in 1 iteration
(1 row)作成されたbalance_us_dataを確認するとFALSEのデータが削減されたことが確認できます。
SELECT fraud, COUNT(fraud) FROM balance_us_data GROUP BY fraud;
fraud | COUNT
-------+-------
FALSE | 22 ★削減
TRUE | 19
(2 rows)上記のように件数が少ない方と同レベル(50%)まで削減するとデータ件数がかなり少なくなってしまいます。
このような場合は、ratioオプションで調整します。
以下の例ではTRUEのデータが全体の約20%になるようにFALSEのデータを削減します。
SELECT BALANCE('balance_us_data_20', 'transaction_data', 'fraud', 'under_sampling'
USING PARAMETERS sampling_ratio = 0.2);
BALANCE
--------------------------
Finished in 1 iteration
(1 row)作成されたデータを確認するとTRUEデータがデータ全体の20%程度になるようにFALSEデータがアンダーサンプリングされています。
SELECT fraud, COUNT(fraud) FROM balance_us_data_20 GROUP BY fraud;
fraud | COUNT
-------+-------
FALSE | 84 ★削減
TRUE | 19
(2 rows)オーバーサンプリング
オーバーサンプリングを実施した場合は以下のように、TRUEのデータが増幅されます。
SELECT BALANCE('balance_os_data', 'transaction_data', 'fraud', 'over_sampling');
BALANCE
--------------------------
Finished in 1 iteration作成されたbalance_os_dataを確認するとTRUEのデータが増幅されたことが確認できます。
SELECT fraud, COUNT(fraud) FROM balance_os_data GROUP BY fraud;
fraud | COUNT
-------+-------
FALSE | 981
TRUE | 981 ★増幅
(2 rows)ハイブリットサンプリング
ハイブリットサンプリングは、以下のようにアンダー/オーバーサンプリングを組み合わせる手法です。
・件数の多いデータ:アンダーサンプリングでデータを削減
・件数の少ないデータ:オーバーサンプリングでデータを増幅
SELECT BALANCE('balance_hv_data', 'transaction_data', 'fraud', 'hybrid_sampling');
BALANCE
--------------------------
Finished in 1 iteration
(1 row)元は1000件のデータが、約500件ずつにバランシングされました。
SELECT fraud, COUNT(fraud) FROM balance_hv_data GROUP BY fraud;
fraud | COUNT
-------+-------
FALSE | 495 ★削減
TRUE | 503 ★増幅
(2 rows)参考情報
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。
