はじめに
機械学習において分類問題などを扱う場合、学習対象データのクラス比率が不均衡であると正しい学習ができないことがあります。このような場合、件数が多い方のデータを削減する「アンダーサンプリング」や、件数が少ない方のデータを増幅する「オーバーサンプリング」を行い、データのバランスを均一に近づけてから学習を行います。
VerticaはBALANCE関数を利用するとデータのバランシング(アンダー/オーバーサンプリング)が可能です。
BALANCE
コマンド構文
1 2 |
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:件数が多いカテゴリのデータを削除します。 over_sampling:件数が少ないカテゴリのデータを増幅します。 hybrid_sampling:アンダー/オーバーサンプリングを組み合わせてサンプリングします。 weighted_sampling:under_samplingと同様の動作をします。 |
ratio=ratio | (オプション) バランスの比率を指定します。デフォルトは0.5(50%)ずつになるようにバランシングされます。 |
利用例
例として以下のトランザクションデータが格納されているtransaction_dataテーブルを利用します。fraud列が「TRUE」が正常なトランザクション、「FALSE」が異常なトランザクションデータです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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の方が圧倒的に多い、偏りのあるデータであることが確認できます。
このような場合、以降の何れかの方法でバランシングが可能です。
1 2 3 4 5 6 7 |
SELECT fraud, COUNT(fraud) FROM transaction_data GROUP BY fraud; fraud | COUNT -------+------- FALSE | 981 TRUE | 19 ★TRUEのデータがFALSEと比較して少ない (2 rows) |
アンダーサンプリング
アンダーサンプリングを実施し、FALSEのデータを削減します。
1 2 3 4 5 6 |
SELECT BALANCE('balance_us_data', 'transaction_data', 'fraud', 'under_sampling'); BALANCE -------------------------- Finished in 1 iteration (1 row) |
作成されたbalance_us_dataを確認するとFALSEのデータが削減されたことが確認できます。
1 2 3 4 5 6 7 |
SELECT fraud, COUNT(fraud) FROM balance_us_data GROUP BY fraud; fraud | COUNT -------+------- FALSE | 22 ★削減 TRUE | 19 (2 rows) |
上記のように件数が少ない方と同レベル(50%)まで削減するとデータ件数がかなり少なくなってしまいます。
このような場合は、ratioオプションで調整します。
以下の例ではTRUEのデータが全体の約20%になるようにFALSEのデータを削減します。
1 2 3 4 5 6 7 |
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データがアンダーサンプリングされています。
1 2 3 4 5 6 7 |
SELECT fraud, COUNT(fraud) FROM balance_us_data_20 GROUP BY fraud; fraud | COUNT -------+------- FALSE | 84 ★削減 TRUE | 19 (2 rows) |
オーバーサンプリング
オーバーサンプリングを実施した場合は以下のように、TRUEのデータが増幅されます。
1 2 3 4 |
SELECT BALANCE('balance_os_data', 'transaction_data', 'fraud', 'over_sampling'); BALANCE -------------------------- Finished in 1 iteration |
作成されたbalance_os_dataを確認するとTRUEのデータが増幅されたことが確認できます。
1 2 3 4 5 6 7 8 |
SELECT fraud, COUNT(fraud) FROM balance_os_data GROUP BY fraud; fraud | COUNT -------+------- FALSE | 981 TRUE | 981 ★増幅 (2 rows) |
ハイブリットサンプリング
ハイブリットサンプリングは、以下のようにアンダー/オーバーサンプリングを組み合わせる手法です。・件数の多いデータ:アンダーサンプリングでデータを削減
・件数の少ないデータ:オーバーサンプリングでデータを増幅
1 2 3 4 5 6 |
SELECT BALANCE('balance_hv_data', 'transaction_data', 'fraud', 'hybrid_sampling'); BALANCE -------------------------- Finished in 1 iteration (1 row) |
元は1000件のデータが、約500件ずつにバランシングされました。
1 2 3 4 5 6 7 |
SELECT fraud, COUNT(fraud) FROM balance_hv_data GROUP BY fraud; fraud | COUNT -------+------- FALSE | 495 ★削減 TRUE | 503 ★増幅 (2 rows) |
参考情報
BALANCEhttps://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/MachineLearning/BALANCE.htm
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。- 投稿タグ
- Machine Learning, サンプリング, データ準備, ml, データプレパレーション, balance, 機械学習