テーブルデータの水増し手法について

# 0. 本記事を公開した経緯

こちらの記事は、2年前に勤務先の勉強会で紹介したテーブルデータの水増し(synthesis)に関する技術動向をまとめた資料です。
意外と需要のある話だということがわかったので、社内向けの文言を削除したうえで公開いたしました。

資料執筆以降で拡散モデルを利用した手法[^24]や、LLMを一から学習させる手法[^25]も出てきました。ですが、技術的なパラダイムシフトはまだ起こっていないように思いますので、本記事の内容は今でも参考になる部分があると思います。

# 1. はじめに

テーブルデータを扱っていて、「**何らかのアルゴリズムを用いた学習に最低限必要なサンプルサイズが足りない。何とかしたい**！」と思ったことはないでしょうか。
例えば、下記のようなデータを扱う場合にそう思うことがあるのではないでしょうか。

- ex.1. **プライバシー**などの機微な事情から、限られたデータしか利用できない[^1][^7][^14][^15][^5]
- ex.2. **データ加工が自動化・効率化できず**、限られたデータしか用意できない(実務でありがち)
- ex.3. 正解ラベルに属すデータが極端に少ない[^15]

本資料では、こうした場合に使えるテーブルデータ向けの水増し手法の外観を示します。

---

# 2. テーブルデータ向けの水増し手法

一般に、**テーブルデータの水増し手法は画像のものとは異なります**。そのため画像とテーブルデータとで、**水増しを表す英単語がそれぞれ異なります**。検索するときは要注意です。

- 画像データの水増し: **augmentation**
  - 元画像の反転のみならず、拡大やノイズの追加などをし、**本来あまり無かったタイプの学習用データを増やす**イメージ
  - "image augmentation"とか"data augmentation"などのキーワードで検索すると、文献が見つかりやすいです。
- テーブルデータの水増し: **synthesis**
  - 学習データの分布に従うデータをランダムに生成していく。つまり、**本物そっくりな学習用データを増やす**イメージ
    - **テーブルデータの場合augmentationはやりづらい**です。画像の場合、反転などで特徴量の値を大きく変えても正解ラベルは変わらないのですが、テーブルデータで同じことをするとラベルが変わらないとつじつまが合わなくなるからです[^2]。
  - "tabular data synthesis"とか"synthetic tabular data"などのキーワードで検索すると、文献が見つかりやすいです。

---

# 3. 既存の主なアルゴリズム

本物に近いテーブルデータの水増しといえば、古くからSMOTE(Chawla et al. 2002)[^17]のようなアルゴリズムが知られています。

ですが、テーブルデータの水増しは現在に至るまでhotな研究対象になっています。特に、様々な種類の値を含む元データの分布をいかに上手く再現するかが盛んに研究されている印象です。

参考文献[^1]によると、近年出現した主なアルゴリズムには以下があります。(説明文は、参考文献のものから相当加筆しています)

## 3.1. MedGAN(Choi et al. 2018)[^3]

- もともと、検診データや患者さんへの処置を記録したテーブルデータを水増しするために作られました。
- 医療データ以外にも使えますが、**カテゴリデータなどの離散的なものしか生成できない**制限があります。
- [画像用の同名のGAN](https://arxiv.org/abs/1806.06397)があることに注意。

---

## 3.2. TGAN(Xu et al. 2018)[^5]

- **カテゴリデータと数値データが混在したテーブルデータでも水増しできます**。カテゴリ数や定義域がそれぞれ異なっていてもOKです。
  - そのためTGANでは、離散変数・連続変数の分布をそれぞれ以下と見なします。**扱う分布を限定する狙いと考えられます**。
    - **1つの離散変数の分布は、普通にカテゴリカル分布**と見なします。
    - **1つの連続変数の分布は、カテゴリカル分布と、(-1, 1)の値域に収まる数値の分布の組**と見なします。
- テーブルデータの各行が確率的に独立であることを仮定しているため、**自己回帰性のあるデータには適しません**。
- 同時期に提案されたTableGAN[^4]はCNNベースですが、TGANはLSTMを使って1変数ずつ順繰りに分布を学習する点が異なります。
- 開発チームが過去に手掛けたSDV[^20]などの手法に比べて、教師あり学習に向いた水増しデータができたと主張。

---

### 3.2.2. TGANの学習詳細

- まずはじめに、変数の分布を学習できるよう**離散変数・連続変数を変換する前処理**を行います。
  - **離散の場合**、テーブルデータのk列目の**変数X_kをOne Hot Encodingしたベクトルの要素にノイズを足し、その後正規化。この結果をD_k**とします。
    - よって、**D_kを再現できるカテゴリカル分布を推定するのがGANの仕事のひとつ**になります。
  - **連続の場合**はちょっと複雑で、変数ごとに下記の処理を順次実行して、**i列目の変数からU_iとV_iという値を求めます**。
    - １．テーブルデータのi番目の列に出現する元の変数X_iをGMMにかけ、m個の正規分布の山を得る。ここでは例えばm=3とする。
    - ２．変数X_iに含まれるそれぞれの値x_i_jについて、3つあるそれぞれの山に属する確率を推定。この結果をU_iとする。
      - つまり、**U_iを再現するカテゴリカル分布を推定するのもGANの仕事**になります。
    - ３．同じく各x_i_jについて、属する確率が最も高い正規分布の山から何σ離れているかを計算。
    - ４．上記３で求めた「何σ離れているか」の値を、下限-0.99、上限0.99としてclipする。この結果をV_iとする。
      - よって、**V_iを再現する分布を推定するのもGANの仕事**になります。

---

- **連続値に対する前処理を図解したものは以下**です。(この図はCTGAN論文[^6]から引用。ただTGANと処理はほぼ同じ)
    ![202112100943453975_4.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268034/4781749b-7067-7467-7c36-4de04108abd4.jpeg)

---

- **GeneratorのLSTMは、各変数について求めたU_i・V_iあるいはD_kを再現できるように順次学習**していきます。(下図は原著論文[^5] Fig.1を引用)
  ![tgan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268034/48551624-3741-c584-8f79-38eb6b3344c8.png)

---

- 最後に**学習済モデルからU_i、V_iあるいはD_kに相当するデータを新たに生成します。それらに対して前処理と逆のことをすれば、元のデータそっくりなものが得られます**。
  - 特に連続値の場合、各サンプルの属するGMMの山がU_iのデータからわかり、属する山と各サンプルの間の距離がV_iのデータからわかるので、そこから逆算すれば元の連続値を再現できます。(下図で言えば、αの式からのcの導出に相当)
    ![202112100943453975_4.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268034/4781749b-7067-7467-7c36-4de04108abd4.jpeg)
---

## 3.3. CTGAN(Xu et al. 2019)[^6]

- [3.2節](#32-tganxu-et-al-20185)で挙げた**TGANを改良したもの**です。
- 学習方法はTGANからかなり変わり、LSTMから**普通の多層ニューラルネット**になりました。
- **変数の前処理方法も、その復元処理もTGANと基本はほぼ同じ**です。
  - ただし連続変数の分布V_iを作るときに値をclipするかわりに、tanhで活性化するようになっています。
  - カテゴリカル分布に従うU_iやD_kは、softmaxで活性化するようになっています。
- 原著論文ではCTGANとの比較用に、**CTGANのGANの部分を変分オートエンコーダにまるごと差し替えたTVAE**というアルゴリズムを開発したことが述べられています。
  - **データセットによってはTVAEのほうが優れる**とのことです(下図は原著論文[^6] table 2を引用)。
  ![8-Table2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268034/f7f0060f-1d1a-17e2-c2a5-46abf2c4f2d8.png)

---

## 3.4. 非GANベースの手法

参考文献[^1]によると、GANを用いない手法にもいくつか有力なものがあります。

### 3.4.1. Copula Flows for Synthetic Data Generation(Kamthe et al. 2021)[^7]

- **コピュラとは**「複数の周辺分布をインプットにして、多変量の同時累積分布をアウトプットする関数」であり、**正規分布では表現できない複雑な多変量分布を表す**のに使えるものです[^11][^18]。
- **連続値も離散値も取り扱い可能**です。
  - コピュラを使った従来手法では離散値を扱えなかったのですが、離散値の累積分布関数をいったん連続値のものに置き換えて解決している模様です(原著論文[^7] 3.3節参照)。
- [3.3節](#33-ctganxu-et-al-201911)で述べた**CTGANよりも、教師あり学習に向いた水増しデータができたと主張**。
  - ただし、本手法の実装は公開されていない様子…
- **本手法のポイントは、n次元の多変量一様分布上の値から元データの値を求める関数を、コピュラと「フロー関数」というものを使って再現すること**です(原著論文[^7] Fig.2参照)。
  - 下図が論文のFig.2です。そこには、左のグラフの2変量一様分布をコピュラにかけると、真ん中のグラフの分布ができることが描かれています。真ん中のグラフには元の2変量の相関が反映されています。
  - コピュラにより相関が加えられた分布を「フロー関数」にかけると、右のグラフの分布が得られます。これが元の分布を再現したものになっています。
  - こうした一連の処理を実現できるコピュラやフロー関数を作るのが本手法です。これにより元データの分布を従来よりも柔軟に再現できる上、水増しデータの生成過程の解釈性も実現できていると主張しています。
  ![4-Figure2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268034/f7629048-a47a-d46d-e1f3-32c9550feef2.png)

---

### 3.4.2. Hierarchical Modeling Algorithm[^8]

- RDB上のデータのように、**階層構造を持つテーブルデータの水増しに特化**した手法です。
- 一番下の階層にあるテーブルデータから順番にその中身のデータの分布を学習していきます。
- **分布の学習自体にはガウシアンコピュラを利用**した手法を用います。
  - [3.4.1項](#341-copula-flows-for-synthetic-data-generationkamthe-et-al-20212)のものと同じ手法かは不明です。

### 3.4.3. 統計値を用いたプライバシ保護擬似データ生成手法(岡田ら 2017)[^9]

- NTT系の研究所による手法です。
- 「データの各属性のヒストグラムと等しくなる乱数を線形変換することによって各属性の平均，分散共分散を正確に保持，各二属性間のクロス集計表の近似を保持する擬似データの生成方法」とのこと。
- 実装はあるらしいのですが、有償。(詳細後述)

---

# 4. 主な水増しツール

文献[^1]によると、テーブルデータを水増しするアルゴリズムを実装した主なツールには以下があります。

- **SDV[^13]**
  - **Pythonライブラリ。OSS。無償。素晴らしい**。
  - ツールと同名のSDVアルゴリズムをはじめ、**[3章](#3-既存の主なアルゴリズム)で言及したCTGAN、TVAEなど多くのアルゴリズムを実行可。強い**。
    - CTGANなどでは扱えない、**時系列データの生成ができる**アルゴリズムもあったはず[^23]。偉い。
  - CTGANなどの出力内容に対し、**各変数の値域に関する制約を追加することもできる。強すぎる**。
- Mostly AI - Synthetic Data Platform[^15]
  - **1日あたり10万件までのデータ生成が永久に無償[^16]。ここまでは素晴らしい**。
  - ユーザ登録には企業アカウントのメールアドレスが必要。困った。
  - **非倫理的なバイアスを除去したデータの生成に優れる**との主張あり。
    - 倫理対策がある手法は他に聞かないので、おそらくアルゴリズムは独自のものではないか。
- tasokarena[^12]
  - 有償。エンタープライズ版は年180万円から。
  - 参考文献[^1]によると、[3.4.3で紹介したNTTによる論文](#343-統計値を用いたプライバシ保護擬似データ生成手法岡田ら-201715)のアルゴリズムを実装したものでは？とのこと。

---

# 4. ツールの利用例の資料

私の目についた資料を下記に示します。

- SDV
  - 文献[^1]の後半部分にある、[「実験：SDVによる制約付き擬似データ生成」](https://qiita.com/gg_hatano/items/cf87fe5e1166a2ba80b2#%E5%AE%9F%E9%A8%93sdv%E3%81%AB%E3%82%88%E3%82%8B%E5%88%B6%E7%B4%84%E4%BB%98%E3%81%8D%E6%93%AC%E4%BC%BC%E3%83%87%E3%83%BC%E3%82%BF%E7%94%9F%E6%88%90)に利用例あり。
    - ここには、**出力内容に関する制約定義の言及もあり**ます。
  - あと忘れちゃいけません。**[本家本元のドキュメント](https://sdv.dev/SDV/user_guides/index.html)[^22]は、コード例がとても丁寧。必見**。
- TGAN、CTGAN
  - [GANで偽のテーブルデータを生成する](https://qiita.com/jovyan/items/c41ab61a6b04e9a6e4df)[^10]
    - **丁寧な図解**を交えて、CTGANの動作や水増しデータをXGBoostにかけた結果を解説。
    - **本資料の補足として見ていただければ**。
  - [「TGAN, CTGANの使い方メモ」](https://qiita.com/studio_haneya/items/6870c7d9559f9f53fc2e)[^19]にもそれぞれの使い方が示されています。
    - ただ、SDVからTGANもCTGANも呼べるので、これらの単品での挙動を理解したい場合に参考になる程度か。

---

# 5. 所感

**今のところテーブルデータ水増しに使うツールは、SDVがよいのでは**ないかと思います。

特に、調べた範囲で優れていたCTGAN、TVAEを実行できるSDVが個人的には興味深いです。
CTGANを倒したものではなさそうですが、SDVではコピュラを使ったデータ水増しも実行できますし、おそらくSDVで扱えるアルゴリズムは今後もどんどん増えていくと予想されるからです。
実際2022年に入ってからもCTAB-GAN+[^14]のような手法が提案されており、学習データの分布の再現に一層優れたものが出てくる期待があります。

**Mostly AIも興味はあるのですが、利用にあたって企業アカウントのメールアドレスを必要とするため、自己啓発で使いづらい**のが懸念点です。
**オンラインツールのように見受けられるので、会社で利用したくても実際の案件のデータを渡せない**のも悩ましいです。

---

# 6. 今後の課題

テーブルデータの水増しにおける今後の課題として、「**学習データが真の分布よりも偏ったサンプルだったときに、分布推定結果をどう修正するか**」ということが挙げられると思います。
**[2章](#2-テーブルデータ向けの水増し手法)で述べた通り、テーブルデータの水増し結果は学習データの分布に依存するからです**。偏ったサンプルをもとにいくら水増しをしても偏ったデータしかできず、それらを学習したところでモデルの汎化性能は限界があります。

[1章](#1-はじめに)で述べたex.1やex.2のケースでは、大量に供与できないが元のデータ自体は多く存在し、その内容について知見を持つ人がいる可能性がありえます。
その場合は、**人の知見を外からフィードバックできるアルゴリズムがあれば、上記の課題にアプローチできます**。

**そうしたフィードバックを可能にするアルゴリズムを、私がCTGANをベースに試作したものがあります[^21]ので**、別途紹介できればと思います。

---

[^1]: ["気の利いた"擬似データを生成したい](https://qiita.com/gg_hatano/items/cf87fe5e1166a2ba80b2)
[^2]: [Augmentation on tabular data](https://www.kaggle.com/general/197748)
[^3]: [Generating Multi-label Discrete Patient Records using Generative Adversarial Networks](https://arxiv.org/abs/1703.06490)
[^4]: [Data Synthesis based on Generative Adversarial Networks](https://arxiv.org/abs/1806.03384)
[^5]: [Synthesizing Tabular Data using Generative Adversarial Networks](https://arxiv.org/abs/1811.11264)
[^6]: [Modeling Tabular data using Conditional GAN](https://arxiv.org/abs/1907.00503)
[^7]: [Copula Flows for Synthetic Data Generation](https://arxiv.org/abs/2101.00598)
[^8]: [HMA1 Class](https://sdv.dev/SDV/user_guides/relational/hma1.html)
[^9]: [統計値を用いたプライバシ保護擬似データ生成手法](https://ipsj.ixsq.nii.ac.jp/ej/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=8&item_id=187369&item_no=1)
[^10]: [GANで偽のテーブルデータを生成する](https://qiita.com/jovyan/items/c41ab61a6b04e9a6e4df)
[^11]: [Wikipedia: コピュラ_(統計学)](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%94%E3%83%A5%E3%83%A9_(%E7%B5%B1%E8%A8%88%E5%AD%A6))
[^12]: [tasokarena](https://www.ntt-tx.co.jp/whatsnew/2021/211026.html)
[^13]: [SDV](https://github.com/sdv-dev/SDV)
[^14]: [CTAB-GAN+: Enhancing Tabular Data Synthesis](https://arxiv.org/abs/2204.00401)
[^15]: [MOSTLY AI](https://mostly.ai/synthetic-data/)
[^16]: [Generate synthetic data for free forever](https://mostly.ai/synthetic-data-platform/generate-synthetic-data/)
[^17]: [SMOTE Synthetic Minority Over-sampling Technique](https://arxiv.org/pdf/1106.1813)
[^18]: [コピュラとは](https://quantcollege.net/%E3%82%B3%E3%83%94%E3%83%A5%E3%83%A9%E3%81%A8%E3%81%AF)
[^19]: [TGAN, CTGANの使い方メモ](https://qiita.com/studio_haneya/items/6870c7d9559f9f53fc2e)
[^20]: [The Synthetic Data Vault](https://ieeexplore.ieee.org/abstract/document/7796926)
[^21]: [human_ctgan](https://github.com/kzkymn/human_ctgan)
[^22]: [User Guides](https://sdv.dev/SDV/user_guides/index.html)
[^23]: [PAR Model](https://sdv.dev/SDV/user_guides/timeseries/par.html)
[^24]: 一例は[TabDDPM](https://arxiv.org/abs/2209.15421)
[^25]: 一例は[TabuLa](https://arxiv.org/abs/2310.12746)