Digital Reactor
合成データ・プライバシー

合成データはどこまで実データの代わりになるか:TSTRによる有用性の定量評価

合成データはどこまで実データの代わりになるか:TSTRによる有用性の定量評価

はじめに

合成データの分布は実データによく似ています。ではその合成データで訓練したモデルは、本物のデータで通用するのでしょうか。導入を検討する側が最初に抱く問いはこれで、分布の類似度だけでは答えられません。

今回、相関構造を持つ表形式データで、3つの生成手法を、実データで訓練したモデル(TRTR, Train on Real)と比べました。各列の分布だけを合わせる独立サンプリングは、一列ずつ見れば実データと見分けがつかないほど似ています。それでも、その合成データで訓練したモデルの性能は、実データで訓練した場合の88%止まりでした。列と列の関係(相関)が崩れていたためです。相関まで保つコピュラ法なら97%を保ちます。この記事では、合成データの有用性を下流タスクで測るTSTR(Train on Synthetic, Test on Real)というプロトコルを実装し、分布が似ていても有用性が落ちる仕組みを確かめます。

対象読者:

  • 合成データの導入を検討している方(データ共有・開発環境・プライバシー対応)
  • 分布類似度の指標の先にある「実用性」を測りたい方
  • 生成モデルの評価設計に関わる方

記事のポイント:

  • TSTRという評価プロトコルを理解します
  • 分布類似度が高くても下流性能が落ちるケース(相関構造の崩れ)を確認します
  • 「実データ比◯%の性能」という形で有用性を数値化し、導入の判断に使えるようにします

合成データ評価の3層

合成データの評価は3つの層で考えると整理しやすくなります。忠実度(分布がどれだけ似ているか)、有用性(下流タスクでどれだけ使えるか)、プライバシー(個人をどれだけ秘匿できるか)です。分布の類似度を測る指標は忠実度の層を担いますが、忠実度が高いことは有用性が高いことを意味しません。

落とし穴は、忠実度を周辺分布だけで測ってしまうことです。各列のヒストグラムが実データと一致していても、列と列の間の相関、つまり結合構造が崩れていれば、下流のモデルは実データで学べたはずの関係を学べません。今回の実験は、まさにこの乖離を可視化します。

TSTRプロトコル

有用性は下流タスクの性能で測ります。基準になるのがTRTR(Train on Real, Test on Real)、実データで訓練し実データでテストしたときの性能です。これに対してTSTR(Train on Synthetic, Test on Real)は、合成データで訓練し実データでテストします。TSTRをTRTRで割った比を見れば、合成データで実データをどこまで代替できるかが、導入を決める材料としてそのまま読み取れます。

比較を公平にする条件は3つあります。同一のモデル、同一のハイパーパラメータ、同一のテストセットです。そしてテストは必ず実データで行います。合成データでテストすると、生成器の癖に downstream モデルが合っているだけの自己欺瞞になりかねません。

def auc_of(Xtrain, ytrain):
    clf = RandomForestClassifier(n_estimators=200, random_state=0)
    clf.fit(Xtrain, ytrain)
    return roc_auc_score(yte, clf.predict_proba(Xte)[:, 1])  # テストは常に実データ

trtr = auc_of(Xtr, ytr)                       # 基準
tstr = auc_of(X_synthetic, y_synthetic)       # 合成で訓練
ratio = tstr / trtr                            # 実データ比

何が有用性を壊すか

有用性を壊す典型が、結合構造の劣化です。今回は3つの生成手法を用意しました。独立サンプリングは各列を独立にリサンプルするので、周辺分布は完全に保たれますが列間の相関は消えます。多変量ガウスは平均と共分散を当てるので線形相関を保ちます。ガウスコピュラは、順位を正規スコアに変換して相関を推定し、元の周辺分布へ戻すので、周辺分布と相関の両方を保ちます。

def gen_copula(Xc, rng):
    ranks = np.argsort(np.argsort(Xc, axis=0), axis=0)   # 経験順位
    z = norm.ppf((ranks + 1) / (len(Xc) + 1))            # 正規スコアへ
    zs = rng.multivariate_normal(np.zeros(Xc.shape[1]),
                                 np.corrcoef(z, rowvar=False), len(Xc))
    us = norm.cdf(zs)
    return np.column_stack([np.quantile(Xc[:, j], us[:, j])  # 周辺へ戻す
                            for j in range(Xc.shape[1])])

表形式データで測る

相関・冗長特徴を持つ2クラスの表形式データ8000件を「実データ」とし、半分を訓練、半分をテストに使います。各生成手法はクラスごとに訓練データへ当て、同数の合成データを作ります。TSTRは5回の生成で平均しました。乱数シードは42に固定しました。

実データでのTRTRのAUCは0.989です。これを基準に各手法を並べます。

生成手法TSTR AUCTRTR比周辺分布の忠実度相関の忠実度
独立サンプリング0.87488.3%1.0000.371
多変量ガウス0.95896.8%0.9660.972
ガウスコピュラ0.96197.1%0.9860.961

TRTR比を棒で見ると、独立サンプリングだけが明確に落ちています。

TSTR AUCとTRTR比

なぜ落ちるかは相関行列を並べると一目で分かります。実データの豊かな相関構造が、独立サンプリングでは対角線以外ほぼ消えています。コピュラは元の構造をよく再現しています。

相関行列の比較

忠実度と有用性の関係を散布図にすると、独立サンプリングの位置が象徴的です。周辺分布の忠実度(丸)は1.0で満点なのに、有用性は0.88で最も低くなっています。相関の忠実度(三角)が0.37まで落ちていることが、その理由を説明しています。

忠実度と有用性の関係

有用性評価をどう使うか

周辺分布の忠実度は、有用性を保証しません。独立サンプリングは各列のヒストグラムを完璧に再現します(忠実度1.000)が、列間の相関を壊すため、下流のTSTRは88%まで落ちました。もし忠実度をヒストグラムの一致だけで検収していたら、この手法は満点合格になってしまいます。忠実度は必ず相関や結合構造まで含めて測る必要があります。

相関を保つ2手法は、TRTR比97%前後を維持しました。多変量ガウスとコピュラの差は小さいですが、コピュラは周辺分布の形(非ガウス性)も保てるぶん、周辺忠実度が0.986と高くなっています。元データが正規から外れた分布を持つほど、この差は広がります。実務では、まずコピュラのような相関保存手法を基準線に置き、それでTRTR比が足りなければGAN系のより表現力の高い生成に進む、という順で考えます。

TRTR比を数字で示せること自体に価値があります。「実データの97%の性能」と言えれば、導入するかどうかの判断が揺れません。ただしこの比はタスク依存で、ある分類タスクで97%でも、別の回帰タスクや少数クラスの予測では大きく下がることもあります。導入判断では、実際に使う下流タスクでTSTRを測る必要があります。汎用の忠実度指標だけで代替しないほうがよいです。

今回の実験は相関構造の劣化に絞ったものです。実務ではモード崩壊(少数クラスやレアパターンの欠落)も有用性を壊す主因になります。テストは必ず実データで行ってください。そして有用性とプライバシーは三すくみの関係にあり、有用性を上げると概して漏洩リスクも上がります。導入前の監査では、TSTRでの有用性と、メンバーシップ推論のようなプライバシー攻撃の両方を並べて見るべきです。合成データの品質を複数指標で測る枠組みや、ADS-GANによる生成と評価も、あわせて設計に組み込むとよいです。

まとめ

合成データの価値は、分布の見た目ではなく下流タスクで測ります。今回の実験では、周辺分布が完璧(忠実度1.000)でも相関を壊した独立サンプリングはTRTR比88%にとどまり、相関を保つコピュラは97%を保ちました。TRTR比◯%という数字があれば、導入の可否を同じ土俵で議論できます。合成データの検収を設計するなら、まず実際に使う下流タスクを定義し、相関保存手法を基準線にTSTRを測り、忠実度は周辺だけでなく相関まで含めて確認し、最後にプライバシー監査を重ねる、という順で進めるとよいです。

関連記事

← 技術ブログ一覧へ