Synthetic Data Vault (SDV)

SDVとは、合成データ生成ライブラリ集であり、ユーザーは単一テーブル、複数テーブル、および時系列データセットを簡単に学習して、後で元のデータセットと同じ形式と統計プロパティを持つ新しい合成データを生成できます。

合成データを使用して、機械学習モデルのトレーニング時に実際のデータを補足、増強、および場合によっては置き換えることができます。 さらに、機械学習やその他のデータに依存するソフトウェア システムのテストを、データの開示に伴うリスクなしに行うことができます。

内部では、いくつかの確率論的グラフィカル モデリングとディープ ラーニング ベースの手法が使用されています。 さまざまなデータ ストレージ構造を有効にするために、独自の階層生成モデリングと再帰的サンプリング手法を採用しています。

1.特徴と機能:

2.利用方法

SDVを利用して合成データを生成し、評価することができます。SDVを使うために、以下のことを理解する必要があります。

  1. モデルを訓練する元データ(DataFrame)
  2. 元データの構造等を定義するメタデータ(Metadata)
  3. 偽データ生成器・識別可能情報の匿名化
  4. モデル初期化
  5. モデル訓練(fit)
  6. 訓練済みモデルを使ってサンプルデータを生成

3.単一テーブルのデータ合成

3.1 元データを用意する

csv形式(utf-8)。Pandas DataFrameへ変換できれば、Excelやテキスト等の形式でもよい。日本語のカラム名はサポートしないらしい。

元データ(例):students.csv

student_id,student_name,overall_gpa,obtained_credits,enrolled_credits,attendance_rate
21GW001,奥村 里歩,0.410 ,3,22,68.6
21GW002,酒井 璃玖,0.548 ,10,22,73.9
21GW003,大橋 雄大,0.835 ,11,18,65.0
21GW004,川村 杏莉,1.003 ,14,22,81.6
21GW005,大沢 楽,1.047 ,12,23,64.9
21GW006,岡田 理恵,1.089 ,17,23,86.0
21GW007,丸山 春輝,1.634 ,13,21,77.7
21GW008,早川 望美,1.652 ,17,20,87.3
21GW009,三宅 汐里,1.657 ,20,23,85.3
21GW010,澤田 幸之助,1.718 ,18,21,92.7
21GW011,野田 宗太,1.776 ,20,22,82.4
21GW012,星野 諒,1.778 ,18,22,99.4
21GW013,松村 洋介,1.795 ,20,24,97.6
21GW014,原田 斗真,1.796 ,21,24,91.3
21GW015,五十嵐 陽一,1.916 ,21,23,89.5
21GW016,原 奈緒美,1.959 ,23,23,95.2
21GW017,成田 智恵,1.960 ,22,22,93.7
21GW018,水野 亜由美,1.960 ,22,24,95.9
21GW019,永田 隼,2.046 ,23,24,91.8
21GW020,濱田 舞衣,2.186 ,20,22,97.5
21GW021,村上 一太,2.241 ,19,21,85.7
21GW022,武田 友梨,2.244 ,25,25,91.8
21GW023,馬場 楓花,2.255 ,22,24,87.1
21GW024,土屋 涼香,2.263 ,21,23,91.1
21GW025,後藤 俊哉,2.302 ,20,20,99.4
21GW026,山崎 晴喜,2.319 ,20,22,89.4
21GW027,菅原 聖也,2.365 ,22,22,94.1
21GW028,宮崎 竜也,2.366 ,20,22,92.9
21GW029,大森 香帆,2.368 ,18,22,86.1
21GW030,村田 千明,2.395 ,23,23,92.3
21GW031,松原 結月,2.410 ,20,22,97.6
21GW032,吉田 勲,2.414 ,22,22,91.2
21GW033,片岡 仁志,2.420 ,21,24,92.4
21GW034,沢田 美桜,2.458 ,22,22,95.3
21GW035,山田 尚,2.460 ,24,24,95.3
21GW036,横田 千尋,2.503 ,22,22,93.6
21GW037,安田 あい,2.505 ,22,22,94.1
21GW038,小島 和花,2.543 ,24,24,92.5
21GW039,中西 かえで,2.548 ,22,22,97.0
21GW040,中田 大知,2.570 ,21,23,97.6
21GW041,大塚 敦子,2.595 ,20,22,96.6
21GW042,松尾 美樹,2.611 ,21,23,97.6
21GW043,遠藤 慶吾,2.612 ,23,23,98.9
21GW044,荒木 みずき,2.639 ,22,22,91.4
21GW045,石井 有紗,2.653 ,23,23,94.0
21GW046,永井 慶子,2.654 ,18,20,93.7
21GW047,伊東 晴大,2.655 ,23,23,95.4
21GW048,中野 美央,2.668 ,19,21,94.0
21GW049,黒田 瑛,2.669 ,24,24,95.0
21GW050,野村 沙耶,2.685 ,22,22,91.1
21GW051,新井 慶人,2.686 ,22,22,98.4
21GW052,矢野 泰志,2.696 ,26,26,97.8
21GW053,野口 舞,2.698 ,23,23,94.8
21GW054,高田 奏多,2.710 ,24,24,95.5
21GW055,田辺 寛,2.717 ,21,21,92.2
21GW056,鈴木 由貴,2.718 ,21,21,86.1
21GW057,阿部 真悠,2.731 ,22,22,89.5
21GW058,秋山 拓海,2.731 ,22,22,98.2
21GW059,篠原 涼平,2.744 ,23,23,99.4
21GW060,渡辺 知世,2.771 ,26,26,90.1
21GW061,高橋 慎吾,2.793 ,24,24,93.0
21GW062,熊谷 春菜,2.812 ,19,21,91.6
21GW063,谷口 里佳,2.813 ,21,21,99.2
21GW064,斉藤 奏介,2.835 ,24,24,97.3
21GW065,千葉 裕美子,2.862 ,21,21,96.3
21GW066,佐野 清香,2.865 ,22,22,95.8
21GW067,林 希望,2.867 ,20,22,98.7
21GW068,櫻井 大貴,2.869 ,22,22,96.1
21GW069,山口 眞子,2.911 ,22,22,98.6
21GW070,森 音葉,2.914 ,22,22,96.2
21GW071,石原 真凛,2.914 ,20,22,96.1
21GW072,須藤 容子,2.915 ,23,23,99.4
21GW073,平田 麗華,2.917 ,25,25,90.0
21GW074,大久保 天音,2.920 ,24,24,98.3
21GW075,古川 華音,2.959 ,23,23,97.7
21GW076,小山 敬子,2.961 ,23,23,99.5
21GW077,佐藤 総司,2.961 ,24,24,96.4
21GW078,山中 洸,3.001 ,21,23,94.9
21GW079,田村 聡子,3.003 ,22,22,98.1
21GW080,池田 紗良,3.004 ,22,22,97.4
21GW081,坂本 優介,3.044 ,24,24,96.7
21GW082,小沢 香苗,3.047 ,23,23,98.2
21GW083,大島 洋子,3.049 ,20,22,93.5
21GW084,田邊 健悟,3.079 ,28,26,99.5
21GW085,廣瀬 諒真,3.089 ,23,23,94.3
21GW086,佐々木 優太,3.096 ,22,22,97.6
21GW087,石橋 雅樹,3.128 ,24,24,94.6
21GW088,川口 翔,3.128 ,24,24,97.4
21GW089,西村 寛太,3.139 ,22,22,99.3
21GW090,宮田 優香,3.145 ,21,21,98.7
21GW091,小松 友希,3.154 ,20,20,91.7
21GW092,上野 由紀,3.164 ,23,25,93.4
21GW093,中村 悠人,3.168 ,24,24,97.3
21GW094,井上 なな,3.171 ,24,24,93.3
21GW095,清水 健二,3.187 ,22,22,94.2
21GW096,森本 雅斗,3.192 ,21,21,98.8
21GW097,松本 羽奈,3.228 ,22,22,97.8
21GW098,中島 志帆,3.230 ,22,22,96.1
21GW099,桜井 優希,3.230 ,22,22,98.2
21GW100,内山 篤志,3.241 ,21,21,97.5
21GW101,菊池 紗和,3.243 ,21,21,97.5
21GW102,岩田 花子,3.243 ,23,23,94.6
21GW103,服部 晴人,3.254 ,20,20,100.0
21GW104,松岡 拓巳,3.255 ,20,20,96.0
21GW105,上田 蒼依,3.276 ,22,22,98.2
21GW106,高木 ゆら,3.278 ,22,22,95.6
21GW107,内田 奈美,3.305 ,21,23,99.0
21GW108,今井 裕二,3.323 ,22,22,97.6
21GW109,西川 優華,3.350 ,23,23,95.1
21GW110,福田 彩乃,3.350 ,23,23,97.0
21GW111,吉川 麻衣,3.353 ,20,20,98.7
21GW112,渡邊 彩夏,3.367 ,22,22,100.0
21GW113,森田 茉奈,3.368 ,24,24,99.0
21GW114,小川 圭祐,3.368 ,22,22,98.8
21GW115,小池 俊祐,3.384 ,20,21,98.7
21GW116,山下 優佳,3.413 ,22,22,99.4
21GW117,斎藤 薫,3.431 ,21,21,83.9
21GW118,南 麻央,3.431 ,19,23,100.0
21GW119,工藤 芽依,3.433 ,21,21,97.7
21GW120,市川 亜紀子,3.502 ,22,22,99.4
21GW121,川崎 太郎,3.503 ,22,22,95.8
21GW122,木下 徹,3.504 ,20,20,99.4
21GW123,横山 泰子,3.525 ,21,21,100.0
21GW124,小西 美琴,3.547 ,22,22,100.0
21GW125,高野 勇希,3.548 ,22,22,95.6
21GW126,浅野 奈穂,3.653 ,20,22,98.9
21GW127,中山 瑞稀,3.716 ,21,21,100.0
21GW128,杉山 航輝,3.729 ,22,22,100.0
21GW129,竹内 綾音,3.731 ,22,22,99.0
21GW130,増田 拓未,3.822 ,22,22,98.7
import numpy as np
import pandas as pd

datapath = 'Datasets/students'
dataset = f"{datapath}/students.csv"

data = pd.read_csv(dataset)

# print(data.head())

3.2 メタデータ(Metadata)を定義する

メタデータ(例):metadata.json

{
    "tables": {
        "students": {
            "primary_key": "student_id",
            "fields": {
                "student_id": {
                    "type": "id",
                    "subtype": "string",
                    "regex": "21WT[0-9]{2}[1-9]"
                },
                "student_name": {
                    "type": "categorical",
                    "pii": true,
                    "pii_locales": ["jp-JP"],
                    "pii_category": "name"
                },
                "overall_gpa": {
                    "type": "numerical",
                    "subtype": "float"
                },
                "obtained_credits": {
                    "type": "numerical",
                    "subtype": "integer"
                },
                "enrolled_credits": {
                    "type": "numerical",
                    "subtype": "integer"
                },
                "attendance_rate": {
                    "type": "numerical",
                    "subtype": "float"
                }
            }
        }
    }
}
# メタデータ:テーブル(table)や属性(field)の定義
from sdv import Metadata
# with open('students/metadata.json') as meta_file:
#     print(meta_file.read())
metadata = Metadata(datapath +'/metadata.json')
metadata.visualize()

3.3 制約(Constraint)を定義する

from sdv.constraints import Inequality
from sdv.constraints import ScalarInequality

enrolled_gt_obtained_constraint = Inequality(
    low_column_name ='obtained_credits',
    high_column_name='enrolled_credits'
)
obtained_constraint = ScalarInequality(
    column_name='obtained_credits',
    relation ="<=",
    value=26
)
enrolled_constraint = ScalarInequality(
    column_name='enrolled_credits',
    relation ="<=",
    value=26
)

constraints=[enrolled_gt_obtained_constraint,obtained_constraint,enrolled_constraint]

3.4 モデルを訓練する

a. 単一テーブルの場合

from sdv.tabular import GaussianCopula
from sdv.tabular import CTGAN
from sdv.tabular import TVAE
from sdv.tabular import CopulaGAN

# Extract table_metadata for a single table
table_meta = metadata.get_table_meta('students')

# GaussianCopulaモデルを例にする。
# 他の単一テーブル(CTGAN、TVAE、CopulaGAN)も同様
model = GaussianCopula(
    field_names=table_meta['fields'].keys(),
    field_types=table_meta['fields'],
    primary_key=table_meta['primary_key'],
    constraints=constraints,
    enforce_min_max_values=False)

model.fit(data)

#訓練済みモデルで、サンプルデータを抽出する
new_data = model.sample(100)

from sdv.utils import display_tables
display_tables(new_data.head())

出力結果

student_id	student_name	overall_gpa	obtained_credits	 enrolled_credits	attendance_rate
0	21WT001	伊藤 零	3.104	22	22	93.5
1	21WT003	鈴木 くみ子	3.390	23	24	97.6
2	21WT004	村上 和也	3.237	24	25	98.5
3	21WT005	中川 京助	3.483	23	23	91.9
4	21WT006	渡辺 幹	3.028	23	23	92.9

b. 複数テーブルの場合

from sdv import SDV
from sdv.relational import HMA1

model = SDV() 

# テーブル一覧。一つだけの場合
tables = {'students':data}
#複数の場合は
#tables = {'students':data1, 'teachers':data2,...}

model.fit(metadata, tables)

sampled = model.sample_all()

from sdv.utils import display_tables
display_tables(sampled)

出力結果

students
student_id	student_name	overall_gpa	obtained_credits	 
enrolled_credits	attendance_rate
21WT001	山本 くみ子	2.647	21	22	91.3
21WT002	加藤 明美	2.747	20	23	97.2
21WT003	井上 結衣	2.943	22	23	92.3
21WT004	加藤 英樹	3.118	22	22	97.7
21WT005	坂本 聡太郎	2.427	19	21	93.2
21WT006	佐藤 裕樹	3.243	21	22	100.0
21WT007	吉田 里佳	3.526	22	21	100.0
21WT008	渡辺 直子	2.988	24	22	98.2
21WT009	佐藤 花子	3.205	18	18	94.1
21WT011	渡辺 加奈	2.681	25	22	98.5

Last-modified: 2023-09-16 (土) 16:32:13