SDVとは、合成データ生成ライブラリ集であり、ユーザーは単一テーブル、複数テーブル、および時系列データセットを簡単に学習して、後で元のデータセットと同じ形式と統計プロパティを持つ新しい合成データを生成できます。
合成データを使用して、機械学習モデルのトレーニング時に実際のデータを補足、増強、および場合によっては置き換えることができます。 さらに、機械学習やその他のデータに依存するソフトウェア システムのテストを、データの開示に伴うリスクなしに行うことができます。
内部では、いくつかの確率論的グラフィカル モデリングとディープ ラーニング ベースの手法が使用されています。 さまざまなデータ ストレージ構造を有効にするために、独自の階層生成モデリングと再帰的サンプリング手法を採用しています。
SDVを利用して合成データを生成し、評価することができます。SDVを使うために、以下のことを理解する必要があります。
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())
{項目1:定義1,項目2:定義2,項目3:定義3,…}
メタデータ(例):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()
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]
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
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