OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

不均衡データをバランシングする(アンダー/オーバーサンプリング)

公開日:
更新日:
基本操作
機械学習
#機械学習

はじめに

機械学習において分類問題などを扱う場合、学習対象データのクラス比率が不均衡であると正しい学習ができないことがあります。
このような場合、件数が多い方のデータを削減する「アンダーサンプリング」や、件数が少ない方のデータを増幅する「オーバーサンプリング」を行い、データのバランスを均一に近づけてから学習を行います。

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:件数が多いカテゴリのデータを削除します。
over_sampling:件数が少ないカテゴリのデータを増幅します。
hybrid_sampling:アンダー/オーバーサンプリングを組み合わせてサンプリングします。
weighted_sampling: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)

参考情報

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

検証バージョンについて

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