SMOTE vs 合成データ生成 — 複数データセット横断比較

同一の実験設計(リーク防止 5×5 反復層化CV・9手法・3モデル・主要指標 PR-AUC)を、性質の異なる4つの不均衡二値分類データセットに適用し、SMOTE 系オーバーサンプリングと合成データ生成(Gaussian Copula / CTGAN / TVAE)の優劣がデータセットによってどう変わるかを比較する。

データセット一覧

データセットn特徴量少数クラス(率)数値/カテゴリ
Z-Alizadeh Sani 冠動脈疾患30355Normal(28.7%)20 / 34
Pima Indians 糖尿病76881(34.9%)8 / 0
German Credit 信用リスク1000200(30.0%)3 / 17
Heart Disease (Cleveland)303130(45.5%)5 / 8

Z-Alizadeh Sani の完全な単体レポート(全項目・エグゼクティブサマリー・全図)は 詳細レポート を参照。

下図は主要手法の平均 PR-AUC をデータセット横断で並べたもの(cross_pr_auc.png)。

cross_pr_auc.png
cross_pr_auc.png

手法別の平均 PR-AUC(データセット横断)

手法Z-Alizadeh Sani 冠動脈疾患Pima Indians 糖尿病German Credit 信用リスクHeart Disease (Cleveland)
tvae0.8540.7000.6110.899
ctgan0.7820.7040.5630.899
gaussian_copula0.8200.6910.5960.902
smote0.8310.7040.5880.901
smotenc0.8430.7040.6140.901
borderline_smote0.8280.6910.5910.903
adasyn0.8300.6940.5870.902
class_weight_balanced0.8420.7090.6260.902
none0.8450.7080.6280.902

各列の最良手法を太字で示す。

SMOTE vs 合成生成: データセット別の要点

  • Z-Alizadeh Sani 冠動脈疾患: 最良手法 tvae(0.854)/合成生成の最良 tvae(0.854)が SMOTE(0.831)を上回る。 判定パターン B(CTGAN / TVAE が SMOTE を上回る)。
  • Pima Indians 糖尿病: 最良手法 class_weight_balanced(0.709)/合成生成の最良 ctgan(0.704)が SMOTE(0.704)を上回る。 判定パターン D(class_weight / threshold tuning が最良)。
  • German Credit 信用リスク: 最良手法 none(0.628)/合成生成の最良 tvae(0.611)が SMOTE(0.588)を上回る。 判定パターン C(SMOTE 系が最良)。
  • Heart Disease (Cleveland): 最良手法 borderline_smote(0.903)/合成生成の最良 gaussian_copula(0.902)が SMOTE(0.901)を上回る。 判定パターン C(SMOTE 系が最良)。

記憶(メモライゼーション)リスク: 深層生成モデル(特に TVAE)が SMOTE を上回る場合でも、小規模データでは実レコードの準重複によって利得が水増しされることがある。各データセットタブの「合成品質(DCR)」を併せて参照。

Z-Alizadeh Sani 冠動脈疾患

  • レコード数: 303、特徴量: 55(数値 20 / カテゴリ 34、削除 1)
  • ターゲット Cath、正例(少数クラス)= Normal(28.7%)/クラス数 {'Cad': 216, 'Normal': 87}
  • 判定パターン: B — CTGAN / TVAE が SMOTE を上回る

総合ランキング(平均 PR-AUC)

rankmethodmean average_precision
1tvae0.854
2none0.845
3smotenc0.843
4class_weight_balanced0.842
5smote0.831
6adasyn0.830
7borderline_smote0.828
8gaussian_copula0.820
9ctgan0.782

SMOTE と合成生成の比較

基準 SMOTE の平均 PR-AUC = 0.831。手法別の SMOTE 比:

  • smotenc: 0.843(SMOTE比 +0.012)
  • borderline_smote: 0.828(SMOTE比 -0.003)
  • adasyn: 0.830(SMOTE比 -0.001)
  • gaussian_copula: 0.820(SMOTE比 -0.011)
  • ctgan: 0.782(SMOTE比 -0.048)
  • tvae: 0.854(SMOTE比 +0.023)

SMOTE とのペア比較(Wilcoxon 符号順位検定、fold 単位、PR-AUC):

methodmodelmean_diffp_valuen
tvaerandom_forest0.0250.02625
tvaelogistic_regression0.0230.00025
tvaexgboost0.0220.01925
nonelogistic_regression0.0180.00325
nonerandom_forest0.0140.13425
smotenclogistic_regression0.0140.01025
smotencxgboost0.0130.03025
class_weight_balancedlogistic_regression0.0130.01225
class_weight_balancedxgboost0.0110.10725
nonexgboost0.0110.18225
class_weight_balancedrandom_forest0.0110.03225
smotencrandom_forest0.0090.23025
adasynlogistic_regression0.0040.44225
gaussian_copularandom_forest0.0030.71125
borderline_smotelogistic_regression0.0030.79125
gaussian_copulaxgboost0.0000.87425
adasynrandom_forest-0.0030.83325
adasynxgboost-0.0040.97925
borderline_smotexgboost-0.0040.57825
borderline_smoterandom_forest-0.0080.44225
ctganrandom_forest-0.0310.00725
gaussian_copulalogistic_regression-0.0350.00625
ctganxgboost-0.0540.00025
ctganlogistic_regression-0.0610.00025

CV fold は完全独立ではないため、p 値は示唆的に扱う。

合成品質(忠実度 / 記憶リスク)

忠実度(fidelity)(SDMetrics, fold 0):

methodoverall_qualitycolumn_shapescolumn_pair_trends
gaussian_copula0.7810.8860.677
ctgan0.7180.8320.604
tvae0.7360.8470.625

プライバシー / 記憶(メモライゼーション)代理指標(DCR ほか、正式な保証ではない):

methodexact_duplicate_ratecategorical_quasi_duplicate_ratedcr_meandcr_p05dcr_below_threshold_rate
gaussian_copula0.0000.0006.1675.2920.000
ctgan0.0000.0007.0325.7680.000
tvae0.0000.5493.8423.1610.392

主要な図

図: pr_auc_boxplot.png, roc_auc_boxplot.png, brier_score_boxplot.png, nn_distance_distribution.png。

brier_score_boxplot.png
brier_score_boxplot.png
nn_distance_distribution.png
nn_distance_distribution.png
pr_auc_boxplot.png
pr_auc_boxplot.png
roc_auc_boxplot.png
roc_auc_boxplot.png

Pima Indians 糖尿病

  • レコード数: 768、特徴量: 8(数値 8 / カテゴリ 0)
  • ターゲット Outcome、正例(少数クラス)= 1(34.9%)/クラス数 {'0': 500, '1': 268}
  • 判定パターン: D — class_weight / threshold tuning が最良

総合ランキング(平均 PR-AUC)

rankmethodmean average_precision
1class_weight_balanced0.709
2none0.708
3ctgan0.704
4smotenc0.704
5smote0.704
6tvae0.700
7adasyn0.694
8borderline_smote0.691
9gaussian_copula0.691

SMOTE と合成生成の比較

基準 SMOTE の平均 PR-AUC = 0.704。手法別の SMOTE 比:

  • smotenc: 0.704(SMOTE比 +0.000)
  • borderline_smote: 0.691(SMOTE比 -0.013)
  • adasyn: 0.694(SMOTE比 -0.009)
  • gaussian_copula: 0.691(SMOTE比 -0.013)
  • ctgan: 0.704(SMOTE比 +0.001)
  • tvae: 0.700(SMOTE比 -0.003)

SMOTE とのペア比較(Wilcoxon 符号順位検定、fold 単位、PR-AUC):

methodmodelmean_diffp_valuen
ctganrandom_forest0.0140.05225
class_weight_balancedrandom_forest0.0100.00125
nonerandom_forest0.0100.02225
class_weight_balancedxgboost0.0030.41125
nonelogistic_regression0.0020.12725
class_weight_balancedlogistic_regression0.0010.15625
nonexgboost0.0010.50825
tvaexgboost0.0000.91625
ctganxgboost0.0000.73125
smotenclogistic_regression0.0001.00025
smotencxgboost0.0001.00025
smotencrandom_forest0.0001.00025
gaussian_copularandom_forest-0.0020.87425
tvaerandom_forest-0.0030.67225
adasynlogistic_regression-0.0040.00725
gaussian_copulaxgboost-0.0060.54225
borderline_smotelogistic_regression-0.0060.04225
tvaelogistic_regression-0.0070.22025
adasynxgboost-0.0110.02225
ctganlogistic_regression-0.0110.14125
borderline_smotexgboost-0.0130.01525
adasynrandom_forest-0.0130.00825
borderline_smoterandom_forest-0.0200.00325
gaussian_copulalogistic_regression-0.0310.00125

CV fold は完全独立ではないため、p 値は示唆的に扱う。

合成品質(忠実度 / 記憶リスク)

忠実度(fidelity)(SDMetrics, fold 0):

methodoverall_qualitycolumn_shapescolumn_pair_trends
gaussian_copula0.8260.7440.909
ctgan0.6810.6610.700
tvae0.8820.8020.961

プライバシー / 記憶(メモライゼーション)代理指標(DCR ほか、正式な保証ではない):

methodexact_duplicate_ratedcr_meandcr_p05dcr_below_threshold_rate
gaussian_copula0.0001.8530.9780.011
ctgan0.0002.0201.1800.005
tvae0.0001.1750.7150.048

主要な図

図: pr_auc_boxplot.png, roc_auc_boxplot.png, brier_score_boxplot.png, nn_distance_distribution.png。

brier_score_boxplot.png
brier_score_boxplot.png
nn_distance_distribution.png
nn_distance_distribution.png
pr_auc_boxplot.png
pr_auc_boxplot.png
roc_auc_boxplot.png
roc_auc_boxplot.png

German Credit 信用リスク

  • レコード数: 1000、特徴量: 20(数値 3 / カテゴリ 17)
  • ターゲット credit_risk、正例(少数クラス)= 0(30.0%)/クラス数 {'1': 700, '0': 300}
  • 判定パターン: C — SMOTE 系が最良

総合ランキング(平均 PR-AUC)

rankmethodmean average_precision
1none0.628
2class_weight_balanced0.626
3smotenc0.614
4tvae0.611
5gaussian_copula0.596
6borderline_smote0.591
7smote0.588
8adasyn0.587
9ctgan0.563

SMOTE と合成生成の比較

基準 SMOTE の平均 PR-AUC = 0.588。手法別の SMOTE 比:

  • smotenc: 0.614(SMOTE比 +0.025)
  • borderline_smote: 0.591(SMOTE比 +0.002)
  • adasyn: 0.587(SMOTE比 -0.001)
  • gaussian_copula: 0.596(SMOTE比 +0.008)
  • ctgan: 0.563(SMOTE比 -0.025)
  • tvae: 0.611(SMOTE比 +0.022)

SMOTE とのペア比較(Wilcoxon 符号順位検定、fold 単位、PR-AUC):

methodmodelmean_diffp_valuen
tvaelogistic_regression0.0520.00025
nonelogistic_regression0.0500.00025
smotenclogistic_regression0.0480.00025
class_weight_balancedlogistic_regression0.0460.00025
nonexgboost0.0360.00025
class_weight_balancedxgboost0.0350.00225
nonerandom_forest0.0340.00025
class_weight_balancedrandom_forest0.0310.00125
smotencxgboost0.0240.06325
tvaexgboost0.0230.09025
gaussian_copulalogistic_regression0.0220.00825
gaussian_copularandom_forest0.0080.25225
borderline_smotelogistic_regression0.0070.17325
borderline_smotexgboost0.0060.06725
smotencrandom_forest0.0040.71125
adasynlogistic_regression0.0020.79125
adasynxgboost0.0010.59625
borderline_smoterandom_forest-0.0060.35325
gaussian_copulaxgboost-0.0060.44225
adasynrandom_forest-0.0070.26325
ctganxgboost-0.0080.45825
tvaerandom_forest-0.0090.38125
ctganrandom_forest-0.0280.01225
ctganlogistic_regression-0.0390.00425

CV fold は完全独立ではないため、p 値は示唆的に扱う。

合成品質(忠実度 / 記憶リスク)

忠実度(fidelity)(SDMetrics, fold 0):

methodoverall_qualitycolumn_shapescolumn_pair_trends
gaussian_copula0.8780.9300.826
ctgan0.8020.8500.753
tvae0.8410.8680.813

プライバシー / 記憶(メモライゼーション)代理指標(DCR ほか、正式な保証ではない):

methodexact_duplicate_ratecategorical_quasi_duplicate_ratedcr_meandcr_p05dcr_below_threshold_rate
gaussian_copula0.0000.0003.2162.5210.009
ctgan0.0000.0003.4152.7260.006
tvae0.0000.0162.4581.5610.338

主要な図

図: pr_auc_boxplot.png, roc_auc_boxplot.png, brier_score_boxplot.png, nn_distance_distribution.png。

brier_score_boxplot.png
brier_score_boxplot.png
nn_distance_distribution.png
nn_distance_distribution.png
pr_auc_boxplot.png
pr_auc_boxplot.png
roc_auc_boxplot.png
roc_auc_boxplot.png

Heart Disease (Cleveland)

  • レコード数: 303、特徴量: 13(数値 5 / カテゴリ 8)
  • ターゲット target、正例(少数クラス)= 0(45.5%)/クラス数 {'1': 165, '0': 138}
  • 判定パターン: C — SMOTE 系が最良

総合ランキング(平均 PR-AUC)

rankmethodmean average_precision
1borderline_smote0.903
2class_weight_balanced0.902
3adasyn0.902
4none0.902
5gaussian_copula0.902
6smotenc0.901
7smote0.901
8ctgan0.899
9tvae0.899

SMOTE と合成生成の比較

基準 SMOTE の平均 PR-AUC = 0.901。手法別の SMOTE 比:

  • smotenc: 0.901(SMOTE比 +0.001)
  • borderline_smote: 0.903(SMOTE比 +0.002)
  • adasyn: 0.902(SMOTE比 +0.001)
  • gaussian_copula: 0.902(SMOTE比 +0.001)
  • ctgan: 0.899(SMOTE比 -0.002)
  • tvae: 0.899(SMOTE比 -0.002)

SMOTE とのペア比較(Wilcoxon 符号順位検定、fold 単位、PR-AUC):

methodmodelmean_diffp_valuen
gaussian_copulaxgboost0.0040.09025
borderline_smotelogistic_regression0.0030.01125
class_weight_balancedrandom_forest0.0030.23025
borderline_smotexgboost0.0020.26325
ctganlogistic_regression0.0020.49125
borderline_smoterandom_forest0.0020.07125
smotenclogistic_regression0.0020.10725
adasynlogistic_regression0.0020.06325
nonelogistic_regression0.0020.06325
adasynrandom_forest0.0010.38125
nonerandom_forest0.0010.38125
smotencxgboost0.0010.31225
class_weight_balancedlogistic_regression0.0010.08525
adasynxgboost0.0010.56025
nonexgboost0.0010.56025
class_weight_balancedxgboost0.0010.33925
tvaelogistic_regression0.0010.93725
gaussian_copularandom_forest-0.0000.85325
gaussian_copulalogistic_regression-0.0000.87425
smotencrandom_forest-0.0010.38125
ctganxgboost-0.0020.56025
tvaexgboost-0.0020.42625
tvaerandom_forest-0.0040.14825
ctganrandom_forest-0.0050.04525

CV fold は完全独立ではないため、p 値は示唆的に扱う。

合成品質(忠実度 / 記憶リスク)

忠実度(fidelity)(SDMetrics, fold 0):

methodoverall_qualitycolumn_shapescolumn_pair_trends
gaussian_copula0.6610.8060.515
ctgan0.5970.7310.463
tvae0.6000.7320.467

プライバシー / 記憶(メモライゼーション)代理指標(DCR ほか、正式な保証ではない):

methodexact_duplicate_ratecategorical_quasi_duplicate_ratedcr_meandcr_p05dcr_below_threshold_rate
gaussian_copula0.0000.0452.4421.9990.000
ctgan0.0000.1822.8262.0010.000
tvae0.0000.9092.1281.6930.000

主要な図

図: pr_auc_boxplot.png, roc_auc_boxplot.png, brier_score_boxplot.png, nn_distance_distribution.png。

brier_score_boxplot.png
brier_score_boxplot.png
nn_distance_distribution.png
nn_distance_distribution.png
pr_auc_boxplot.png
pr_auc_boxplot.png
roc_auc_boxplot.png
roc_auc_boxplot.png

手法の解説

本実験で比較する各データ拡張/合成生成手法について、概要・仕組み・長所・注意点・参考URLをまとめる。
実装は src/cad_synth/samplers.py(無拡張・SMOTE 系)と src/cad_synth/synthesizers.py(SDV 合成生成)にある。
いずれも各 training fold 内でのみ fit し、少数クラスを目標比率(sampling_ratio)まで拡張する。

記法: 「少数クラス」= 本データでは Normal(正例)。SMOTE 系の近傍数 k は、少数クラスのサンプル数が少ない fold では自動的に縮小される(k = min(5, n_minority − 1))。


無拡張・ベースライン

none(無拡張)

  • 概要: リサンプリングを一切行わず、元の不均衡データでそのまま学習するベースライン。
  • 仕組み: 恒等変換(X, y をそのまま返す)。他手法が「無拡張に対して本当に改善するのか」を測る基準線。
  • 長所: バイアスや記憶(メモライゼーション)リスクがなく、最も安全。データが元々分離可能なら十分競争力がある。
  • 注意点: 少数クラスの再現率が低くなりやすい。分類器の閾値調整と併用するのが実務的。
  • 参考: imbalanced-learn: 不均衡データの概説

class_weight_balanced(クラス重み調整)

  • 概要: データは拡張せず、分類器側でクラスの重みを不均衡比に応じて調整する(class_weight='balanced')。
  • 仕組み: 損失関数において少数クラスの誤分類ペナルティを n_samples / (n_classes × n_class) で重み付け。本実装では拡張器は恒等で、ランナーが分類器に class_weight='balanced' を設定する。
  • 長所: 合成行を作らないため記憶リスクゼロ。実装が単純で計算コストも低い。
  • 注意点: 重みに対応した分類器(ロジスティック回帰・RF・SVM 等)でのみ有効。確率校正が崩れることがある。
  • 参考: scikit-learn: class_weight(用語集)

SMOTE 系(オーバーサンプリング)

いずれも少数クラスのサンプル空間を補間・複製して増やす手法。混在型データでは、素の SMOTE がカテゴリ/二値列を小数に補間してしまうため、型の扱いが重要(smotenc 参照)。本実装ではカテゴリ列を整数エンコードして処理し、生成後に最近傍カテゴリへ復元する。

random_oversampling(ランダムオーバーサンプリング)

  • 概要: 少数クラスの既存サンプルを復元抽出で単純複製して数を揃える。
  • 仕組み: 新しい点は作らず、既存の少数クラス行をランダムに重複させる(RandomOverSampler)。
  • 長所: 型を問わず安全(実在する行のみ)。高速で、SMOTE 系の下限ベースラインとして有用。
  • 注意点: 完全な重複を増やすため、過学習を招きやすい。多様性は増えない。
  • 参考: imbalanced-learn: RandomOverSampler

smote(SMOTE)

  • 概要: 少数クラスの各点と、その k 近傍の少数クラス点との間を線形補間して合成点を作る(Chawla ら, 2002)。
  • 仕組み: 少数点 x と近傍 x_nn に対し x_new = x + λ(x_nn − x)λ∈[0,1])。特徴空間はユークリッド距離を仮定。
  • 長所: 単純複製より多様性が高く、決定境界を滑らかにする。不均衡学習の事実上の標準。
  • 注意点: 連続特徴量を前提とするため、カテゴリ/二値列には不適(小数を生成)。外れ値やクラス重複領域にノイズを生みやすい。
  • 参考: Chawla ら (2002) JAIRimbalanced-learn: SMOTE

smotenc(SMOTE-NC)

  • 概要: 数値とカテゴリが混在するデータ向けの SMOTE(SMOTE for Nominal and Continuous)。
  • 仕組み: 距離計算でカテゴリ列を特別扱いし、合成点のカテゴリ値は近傍間の最頻値で決める(連続列のみ補間)。本実装ではカテゴリ列インデックスを categorical_features に渡す(カテゴリ列が無い fold では素の SMOTE にフォールバック)。
  • 長所: 二値フラグやカテゴリを {0,1}/実在カテゴリに保てる。混在型データで最も「安全な実質改善」になりやすい。
  • 注意点: カテゴリ列の型宣言が必須。高カーディナリティのカテゴリでは効果が薄れる。
  • 参考: imbalanced-learn: SMOTENCChawla ら (2002) §6.1

borderline_smote(Borderline-SMOTE)

  • 概要: 決定境界付近の少数クラス点に絞って合成する SMOTE 変種(Han ら, 2005)。
  • 仕組み: 各少数点の近傍における多数クラス比率から「境界(danger)」点を特定し、その点のみを補間対象にする(本実装は m_neighbors で危険度を判定)。
  • 長所: 分類が難しい境界領域を重点的に補強するため、境界付近の判別が改善しうる。
  • 注意点: 境界がノイズを含む場合、逆にノイズを増幅する。安全領域内の少数構造は補強されない。
  • 参考: Han, Wang, Mao (2005)imbalanced-learn: BorderlineSMOTE

svm_smote(SVM-SMOTE)

  • 概要: SVM のサポートベクターを使って境界付近の少数点を選び、そこから合成する SMOTE 変種(Nguyen ら, 2011)。
  • 仕組み: SVM を学習し、少数クラスのサポートベクター近傍で補間/外挿して合成点を生成する。
  • 長所: SVM が捉えた決定境界に沿って合成するため、Borderline-SMOTE と同様に境界を重点補強できる。
  • 注意点: SVM の学習コストが加わる。少数サンプルが極端に少ないとサポートベクターが不安定。
  • 参考: Nguyen, Cooper, Kamei (2011)imbalanced-learn: SVMSMOTE

adasyn(ADASYN)

  • 概要: 学習が難しい少数点ほど多く合成する適応的オーバーサンプリング(He ら, 2008)。
  • 仕組み: 各少数点の近傍に含まれる多数クラス比率に比例して、生成数を配分する。密度分布を適応的に補正。
  • 長所: 判別が難しい領域を自動的に厚くする。境界の学習を助ける。
  • 注意点: 外れ値やノイズ点を「難しい」とみなして過剰生成することがある。生成数がデータ依存で変動する。
  • 参考: He, Bai, Garcia, Li (2008) IJCNNimbalanced-learn: ADASYN
  • 概要: SMOTE で過剰サンプリングした後、Tomek リンクでクラス境界の重複点を除去するハイブリッド(Batista ら, 2004)。
  • 仕組み: SMOTE 生成 → 互いに最近傍でクラスが異なるペア(Tomek link)を検出し、その多数側(または両方)を削除して境界を明確化。
  • 長所: SMOTE の多様性に加え、境界のクリーニングでノイズを低減できる。
  • 注意点: クリーニングで有用な境界サンプルも消えることがある。計算量が増える。
  • 参考: Batista, Prati, Monard (2004) SIGKDD Explorationsimbalanced-learn: SMOTETomek

smote_enn(SMOTE + ENN)

  • 概要: SMOTE の後、Edited Nearest Neighbours(ENN)でより積極的に誤分類近傍を除去するハイブリッド(Batista ら, 2004)。
  • 仕組み: SMOTE 生成 → 各点について近傍多数決と一致しない点を削除。Tomek より強いクリーニング。
  • 長所: 境界のノイズ除去が強力で、クラス重複が大きいデータで有効なことがある。
  • 注意点: 削除が過剰になり、少数クラスの正例まで消える場合がある。データが小さいと不安定。
  • 参考: Batista, Prati, Monard (2004) SIGKDD Explorationsimbalanced-learn: SMOTEENN

合成データ生成(SDV)

X_train + y_train同時分布を生成モデルで学習し、少数クラスの行を条件付き/棄却サンプリングで生成する。SMOTE 系の局所補間と異なり、データ全体の分布・相関を学習する点が特徴。本実装では fold ごとに1回学習し、複数モデル間で再利用する。

gaussian_copula(Gaussian Copula)

  • 概要: 各列の周辺分布と、列間の相関構造(コピュラ)を分離して学習する統計的生成モデル。
  • 仕組み: 各特徴量を周辺分布で正規空間に変換し、多変量正規コピュラで相関を表現してサンプリング(Sklar の定理)。深層学習を用いない軽量モデル。
  • 長所: 小規模データでも安定。学習が高速で、重複を作りにくく、プライバシー代理指標(DCR)が高くなりやすい(=最も「正直」)。
  • 注意点: 線形相関中心のため、複雑な非線形依存や多峰性は捉えにくい。
  • 参考: SDV: GaussianCopulaSynthesizer

ctgan(CTGAN)

  • 概要: 表形式データ向けの条件付き GAN(Xu ら, 2019)。
  • 仕組み: mode-specific normalization で連続列の多峰性を扱い、training-by-sampling でカテゴリの不均衡に対処。生成器と識別器を敵対的に学習(本実装 epochs=150, batch_size=60)。
  • 長所: 非線形な特徴量依存や複雑な分布を表現できる可能性がある。
  • 注意点: データ量を要求する。n が小さいと学習が不安定でモード崩壊しやすく、本実験(n=303)では最下位になった。
  • 参考: Xu ら (2019) NeurIPS "Modeling Tabular Data using Conditional GAN"SDV: CTGANSynthesizer

tvae(TVAE)

  • 概要: 表形式データ向けの変分オートエンコーダ(VAE)(Xu ら, 2019、CTGAN と同論文)。
  • 仕組み: エンコーダ/デコーダで潜在変数を学習し、潜在空間からサンプリングして生成(本実装 epochs=150, batch_size=60)。
  • 長所: GAN より学習が安定しやすく、忠実度・有用性ともに高くなりやすい。本実験では PR-AUC 最良。
  • 注意点: 小規模データでは実レコードを「記憶」しやすい。本実験では合成行の DCR が最小・カテゴリ準重複が多く、見かけの利得が記憶で水増しされている可能性がある(結果タブ参照)。
  • 参考: Xu ら (2019) NeurIPS "Modeling Tabular Data using Conditional GAN"SDV: TVAESynthesizer

エンジニアリング / 前処理ノート

本ドキュメントは、実験パイプラインのエンジニアリングおよび前処理の詳細を、再現性・実装レベルの理解を求める読者に向けて説明するものである。記載内容はすべてリポジトリのソース(src/cad_synth/preprocessing.py, README.md, configs/report.yaml, SPEC.md)に基づく。

1. パイプライン全体像

エンドツーエンドの処理は以下の流れで進む。

  • データ読み込みsrc/cad_synth/data.pydata/raw/ のローカルスナップショット(z_alizadeh_sani.xlsx/.csv)を優先し、なければ ucimlrepo.fetch_ucirepo(id=412) を試行する。
  • 特徴量型判定detect_feature_types により、各カラムを数値/カテゴリ/削除に分類する(§2)。
  • fold 分割RepeatedStratifiedKFold(5×5, random_state=42)で層化交差検証の fold を生成する。
  • fold 内前処理build_preprocessor が生成する ColumnTransformer を、各 training fold 内でのみ fit する(§3)。
  • リサンプリング/合成 — SMOTE 系または SDV 合成生成器を training fold 内で適用し、少数クラスを拡張する(§5)。
  • 学習 — 拡張後の training データで分類器を学習する。
  • 評価 — 一切拡張・前処理の学習に使われていない test fold で評価する。

重要: fold 分割以降のあらゆる処理(補完・エンコーディング・スケーリング・リサンプリング・合成・閾値調整・校正)は、各 training fold の内側でのみ fit される。CV split より前に全データへ適用することはない(§4)。

2. 特徴量型の自動判定

detect_feature_types(X, max_categorical_cardinality=12) は各カラムを次のルールで分類する。

  • 削除: ユニーク値が1以下(分散ゼロ)のカラムは削除する(例: Exertional CP)。
  • カテゴリ: 非数値(文字列)のカラム。または、数値であっても低カーディナリティかつ整数コード化されたカラム(ユニーク値が max_categorical_cardinality(=12)以下で、値がすべて整数)。
  • 数値: 上記に該当しない数値カラム。

なぜこの判定が必要か:

  • DM/HTN のような二値フラグは値を {0,1} に保つ必要がある。
  • これらを数値として扱うと、素の SMOTE が補間して小数値を生成してしまう。
  • 同様に SDV は連続値としてモデル化してしまう。
  • したがって、意味的にカテゴリなものは明示的にカテゴリとして宣言する。

結果: 数値 20 / カテゴリ 34 / 削除 1。

3. 前処理パイプライン(モデル別)

build_preprocessor(model_name, schema) は、モデルの系統に応じた未 fit の ColumnTransformer を返す。

  • ツリー系モデルrandom_forest, xgboost):
    • 数値: SimpleImputer(strategy="median") による中央値補完。
    • カテゴリ: SimpleImputer(strategy="most_frequent")(最頻値補完)+ OneHotEncoder(handle_unknown='ignore')
  • スケーリング系モデルlogistic_regression, svm_rbf):
    • 上記に加えて、数値に StandardScaler を適用する。
  • ColumnTransformerremainder='drop' を指定し、変換対象外のカラムは破棄する。

補完は中央値/最頻値で行うが、本データセットは実質的に完全(欠損なし)であるため、補完はセーフティネットとして機能する。

4. リーク防止(設計上の保証)

  • 補完・エンコーディング・スケーリング・リサンプリング・合成生成・閾値調整・確率校正は、すべて各 training fold 内でのみ fit する。
  • test fold は、拡張・前処理の学習に一切使用されない。
  • 合成生成器(synthesizer)は fold ごとに1回学習し、その fold 内の複数モデル間で再利用する(モデルごとに再学習しない)。
  • 交差検証は RepeatedStratifiedKFold(5分割 × 5反復, random_state=42)。

5. 合成データ生成の設定

SDV 合成生成器:

  • gaussian_copula — 古典的な統計モデル。
  • ctganepochs=150, batch_size=60
  • tvaeepochs=150, batch_size=60
  • 生成の試行上限は max_sample_attempts=20

SMOTE 系:

  • smote, smotenc(混在型を認識), borderline_smote, adasyn

共通設定:

  • サンプリング比率は 1.0(少数クラスを多数クラスと同数まで拡張してバランスさせる)。
  • 合成生成器は少数クラスの行のみを生成する。

6. 再現性と実行

  • 環境は uv + pyproject.toml + uv.lock により完全に固定される。
  • random_state=42 により fold 分割・生成を固定。

主なコマンド:

uv sync --extra dev
uv run python experiments/run_experiment.py --config configs/report.yaml   # 約20分
uv run python experiments/build_report_html.py

出力レイアウト(outputs/ 配下):

  • metrics/fold_metrics.csv, aggregate_metrics.csv, method_model_summary.csv, statistical_tests.csv, synthetic_quality.csv, fold_predictions.csv
  • figures/ — 各種箱ひげ図・EDA 図。
  • synthetic_samples/fold_0_<method>_r1.0.csv
  • reports/experiment_report.md, data_profile.md, experiment_report.html

7. 技術スタック

  • Python
  • scikit-learnPipeline / ColumnTransformer / SimpleImputer / OneHotEncoder / StandardScaler、および RepeatedStratifiedKFold
  • imbalanced-learn — SMOTE 系(smote, smotenc, borderline_smote, adasyn)。
  • SDV — 合成生成器(gaussian_copula, ctgan, tvae)。
  • SDMetrics — 合成データの忠実度(fidelity)評価。
  • scipy — 統計比較(Wilcoxon)。
  • matplotlib — 図の生成。
  • pandas / numpy — データ操作。
  • uv — 環境管理。