0. エグゼクティブサマリー

要点: リーク防止の5×5反復層化CV(675 fold評価)のもとで、9種類のデータ拡張戦略 × 3種類の分類器を比較した結果、PR-AUCでは TVAE が1位(0.854)となり、SMOTE(0.831)および強力な無拡張ベースライン(0.845)を上回った。ただし、TVAE の優位は記憶(メモライゼーション)によって交絡しており、慎重に解釈すべきである。

主な知見(すべての数値は outputs/metrics/ に基づく):

1. TVAE は有用性(utility)で勝るが、その一部は実レコードのコピーによるもの。 TVAE は3モデルすべてで PR-AUC において SMOTE を上回る(ペアWilcoxon p = 1.6e-4 LR、0.026 RF、0.019 XGB)。しかし、その合成少数クラス行は最もプライバシー性が低い。最近傍実レコードまでの距離の平均 = 3.84(Gaussian Copula の 6.17、CTGAN の 7.03 と比較)、TVAE 行の39%が DCR 閾値を下回り55%が実患者のカテゴリ準重複である。したがって、見かけの利得は学習データの準重複によって水増しされている。これはまさに H3 で仮説とした小規模データにおける記憶リスクである。
2. データ拡張は無拡張をかろうじて上回るのみ。 none は2位(0.845)。データはすでにかなり分離可能であり(ROC-AUC ≈ 0.93)、Normal 少数クラスのリサンプリングはほとんど寄与しない。n=303 では、適切に正則化されたベースラインを信頼性高く安全に上回ることは難しい。
3. Gaussian Copula は SMOTE を上回らなかった(0.820 < 0.831)。これは事前の期待(H2)と矛盾する。Gaussian Copula は最も正直な生成器であり(完全重複0/準重複0、DCR 最高値 6.17)、balanced accuracy では競争力がある(最良の単一セル: GC + random_forest = 0.851)。しかし PR-AUC の有用性は低く、ペア検定では RF/XGB に対して SMOTE との有意差はなく、ロジスティック回帰では劣位であった。
4. CTGAN は明確に最下位(0.782)であり、すべてのモデルで SMOTE を有意に下回る。これは n=303 でデータ不足に陥った深層GANの典型例である。
5. SMOTE系の手法はベースライン付近に集まるsmotenc(混合型に対応)はその中で最良(0.843)であり、最も安全な「実質的な」改善シグナルである。

結論(ニュアンスを含むパターンB → C): SMOTE を統計的に上回る唯一の手法(TVAE)は、その一部を記憶によって達成しており、一方で安全な生成器(Gaussian Copula、CTGAN)は SMOTE を上回らない。このデータセットに対する妥当な結論は、n=303 では合成生成が SMOTE や無拡張に対してクリーンかつ安全な優位をもたらさないということであり、有用性(utility)/忠実度(fidelity)/プライバシーのトレードオフ(H4)が支配的である。単純で安全なベースラインとしては smotenc または class_weight を用いるべきであり、TVAE のヘッドライン数値は臨床的シグナルではなく記憶に交絡したものとして扱うべきである。

日本語要約: 9手法×3分類器・リーク防止5×5 CV(計675評価)で PR-AUC 最良は TVAE (0.854)。 ただし TVAE は合成行の DCR が最小(3.84)・39%が閾値内・カテゴリ準重複55% と実データを強く 「記憶」しており、利得は記憶バイアスで水増しされている可能性が高い。Gaussian Copula(0.820) は SMOTE(0.831) を上回らず(H2は不成立)、安全だが utility は劣る。CTGAN(0.782) は全モデルで 最下位。無拡張(0.845)も強く、n=303 では合成生成が SMOTE / 無拡張に対して明確かつ安全な優位を もたらすとは言えない(utility と fidelity/privacy のトレードオフが支配的)。実務的には smotenc / class_weight が安全な選択。

1. データセット概要

  • レコード数: 303、生の特徴量: 55(ソース: local_snapshot
  • ターゲット Cath のクラス数: {'Cad': 216, 'Normal': 87}
  • 不均衡: 少数クラス = Normal。正例(y=1)としてモデル化。
  • 特徴量の型: 数値20、カテゴリ34、1つ削除(分散ゼロ: Exertional CP)。
  • 欠損値: データセットはほぼ完全。中央値/最頻値による補完を fold ごとにフィット。

2. 実験設計

  • CV: RepeatedStratifiedKFold、5分割 × 5反復(random_state=42)。
  • モデル: logistic_regression、random_forest、xgboost。
  • サンプリング手法: none、class_weight_balanced、smote、smotenc、borderline_smote、adasyn、gaussian_copula、ctgan、tvae。
  • サンプリング比率: [1.0](データ拡張後の少数クラス/多数クラス)。
  • リーク防止: 補完、エンコーディング、スケーリング、リサンプリング、合成生成はすべて各学習fold内でのみフィットし、テストfoldには一切触れない。合成器は学習foldでフィットし、モデル間で再利用する(モデルごとに再フィットしない)。

3. 主要な結果

主要指標: PR-AUC(Average Precision) — 少数クラスを正例とするタスクに適切。

平均 PR-AUC による総合ランキング(モデル平均、ratio=1.0):

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

指標別の最良(method, model):

PR-AUC による最良:

methodmodelratioaverage_precision
tvaerandom_forest1.00.863 (±0.070)
tvaelogistic_regression1.00.860 (±0.068)
nonelogistic_regression1.00.855 (±0.068)
nonerandom_forest1.00.852 (±0.075)
smotenclogistic_regression1.00.851 (±0.072)
class_weight_balancedlogistic_regression1.00.850 (±0.073)

Balanced Accuracy による最良:

methodmodelratiobalanced_accuracy
gaussian_copularandom_forest1.00.851 (±0.050)
class_weight_balancedrandom_forest1.00.851 (±0.061)
adasynrandom_forest1.00.849 (±0.053)
class_weight_balancedlogistic_regression1.00.844 (±0.048)
smotenclogistic_regression1.00.843 (±0.048)
smoterandom_forest1.00.841 (±0.048)

Brier スコアによる最良(低いほど良い):

methodmodelratiobrier_score
tvaelogistic_regression1.00.098 (±0.030)
nonelogistic_regression1.00.099 (±0.029)
smotenclogistic_regression1.00.102 (±0.031)
tvaerandom_forest1.00.103 (±0.019)
tvaexgboost1.00.105 (±0.031)
smotencrandom_forest1.00.105 (±0.020)

Recall@Precision≥0.80 による最良:

methodmodelratiorecall_at_prec_80
nonerandom_forest1.00.747 (±0.201)
class_weight_balancedrandom_forest1.00.742 (±0.207)
smotencrandom_forest1.00.736 (±0.174)
tvaerandom_forest1.00.729 (±0.198)
smoterandom_forest1.00.717 (±0.229)
nonexgboost1.00.712 (±0.198)

図: pr_auc_boxplot.pngroc_auc_boxplot.pngbrier_score_boxplot.pngbalanced_accuracy_boxplot.pngtopk_precision.png

balanced_accuracy_boxplot.png
balanced_accuracy_boxplot.png
brier_score_boxplot.png
brier_score_boxplot.png
pr_auc_boxplot.png
pr_auc_boxplot.png
roc_auc_boxplot.png
roc_auc_boxplot.png
topk_precision.png
topk_precision.png

4. SMOTE と合成生成の比較

参照となる SMOTE の平均 PR-AUC = 0.831。手法別の平均 PR-AUC:

  • smote: 0.831(SMOTE比 +0.000)
  • 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値は確証的なものではなく、あくまで参考として扱うこと。

  • データ拡張が合成行を生成しなかった fold(スキップ/失敗): fold_metrics.csv(n_synthetic=0 の行)を参照。

5. 合成データの品質

忠実度(fidelity)(SDMetrics、少数クラス合成 vs 少数クラス実データ、fold 0):

methodoverall_qualitycolumn_shapescolumn_pair_trends
gaussian_copula0.7810.8860.677
ctgan0.7180.8320.604
tvae0.7360.8470.625

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

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

図: nn_distance_distribution.png(最近傍実レコードまでの距離の分布)。

nn_distance_distribution.png
nn_distance_distribution.png

6. 確率校正(キャリブレーション)

Brier スコアと ECE は各 fold の生のモデル確率に対して計算される(主要な結果 / boxplot を参照)。手法別の信頼性曲線は calibration_curves.png にある。確率はさらに、学習fold内でフィットした Platt スケーリング / 等調回帰(isotonic regression)で再校正できる(cad_synth.calibration.compare_calibration)。

calibration_curves.png
calibration_curves.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

7. 解釈

  • 結果パターン: B — CTGAN / TVAE が SMOTE を上回る。

非線形な特徴量依存を生成モデルが捉えた可能性がある。ただし、小規模データでの記憶リスクを追加評価する必要がある。

  • PR-AUC による最良手法: tvae(0.854)。SMOTE = 0.831。
  • 合成生成が有効だったかどうか: 上記の手法別デルタを比較する。信頼区間が重なる範囲に収まる数千分の一 PR-AUC 程度の改善は、n=303 では信頼できる差ではないと読むべきである。
  • 安定性: 反復 CV では、信頼区間が SMOTE の平均を含まない手法を優先する。

8. 制約

  • 小規模データセット(n=303): 深層生成モデル(CTGAN/TVAE)はデータ不足に陥る。結果は慎重に扱い、重複 / 最近傍リスクを点検すべきである。
  • クラス方向: 少数クラスは CAD ではなく Normal である。Normal のオーバーサンプリングは CAD 検出の感度を直接改善するものではない。
  • 正式なプライバシー保証はない。プライバシー指標はあくまで代理指標である。
  • 公開ベンチマークのみを対象としており、診断的妥当性・臨床的有用性・実運用可能性に関するいかなる主張も行わない

9. 今後のステップ

  • configs/full.yaml を実行する(5×20 CV、LightGBM・SVM を含む全手法/全モデルのグリッド)。
  • Borderline-SMOTE/SVM-SMOTE のデルタと比率別スイープ(0.5 / 0.75 / 1.0)を追加する。
  • TabDDPM(任意)を追加し、同一 fold 上で拡散モデルと copula を比較する。
  • 感度分析として cad_positive 方向を評価する。

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

本ドキュメントは、実験パイプラインのエンジニアリングおよび前処理の詳細を、再現性・実装レベルの理解を求める読者に向けて説明するものである。記載内容はすべてリポジトリのソース(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 — 環境管理。

データプロファイル — Z-Alizadeh Sani CAD データセット

ソース: data/raw/z_alizadeh_sani.xlsx · 患者数: 303 · カラム数: 56(55特徴量 + ターゲット Cath
欠損値: 0(データセットは完全に揃っており、補完は不要)。

1. 構造とカラム型

  • 形状: 303行 × 56列。
  • 読み込み時の dtype: 22列が object(文字列)、34列が数値(int64/float64)。
  • モデリングにあたり、カラムは以下に分類される。
    • 連続数値(21): Age, Weight, Length, BMI, BP, PR, FBS, CR, TG, LDL, HDL, BUN, ESR, HB, K, Na, WBC, Lymph, Neut, PLT, EF-TTE。
    • カテゴリ/二値(34): 22列の文字列カラム(Sex, Obesity, CRF, CVA, Airway disease, Thyroid Disease, CHF, DLP, Dyspnea, Atypical, Nonanginal, Exertional CP, LowTH Ang, VHD, BBB, murmurs, LVH など)に加え、11列の整数コード化された二値フラグ(DM, HTN, Current Smoker, EX-Smoker, FH, Edema, Typical Chest Pain, Q Wave, St Elevation, St Depression, Tinversion)。Function Class(0–3)と Region RWMA(0–4)は低カーディナリティの順序整数であり、VHD と BBB は多水準の文字列である。

これらの整数コード化された二値フラグは、dtype としては数値だが意味的にはカテゴリであり、値を {0,1} に保つため、あらゆる SMOTE/合成生成パイプラインではカテゴリとして明示する必要がある。

2. ターゲット分布と不均衡

クラスn割合
Cad(多数派)21671.3%
Normal(少数派 / 正例)8728.7%

不均衡比 ≈ 2.48 : 1(Cad : Normal)。Normal は少数クラスであり、下流の実験では正例として扱われる。これがオーバーサンプリング/合成によって拡張すべきクラスである。

3. クラス別の主要な数値特徴量

全体の平均 ± 標準偏差、続いてクラス別、そして Cohen's d(Cad − Normal)。|d| > 0.5 はおよそ中程度の分離を意味する。

特徴量平均標準偏差Cad 平均Normal 平均Cohen's d
Age58.9010.3961.2553.06+0.84
BMI27.254.1027.0527.75-0.17
BP129.5518.94132.41122.47+0.54
FBS119.1852.08125.97102.34+0.46
LDL104.6435.40104.12105.95-0.05
HDL40.2310.5639.9540.94-0.09
TG150.3497.96159.07128.68+0.31
EF-TTE47.238.9345.9150.52-0.53
ESR19.4615.9421.2614.99+0.40
HB13.151.6113.1113.26-0.09

最も分離のよい数値特徴量: Age(Cad 患者は約8歳年上)、低い EF-TTE(Cad では駆出率(EF)の低下)、高い BP、そして高い FBS/ESR。LDL, HDL, HB, BMI はクラス間でほとんど分離しない。

4. クラス別の主要なカテゴリ/二値特徴量

全体および各クラス内での陽性率(% positive)。

特徴量全体 %Cad %Normal %
Sex = Male58.160.252.9
DM = 129.737.011.5
HTN = 159.168.136.8
Typical Chest Pain = 154.171.311.5
Current Smoker = 120.822.716.1
FH = 115.816.713.8
Region RWMA > 028.438.04.6

最も分離のよいカテゴリ特徴量: Typical Chest Pain(Cad で71%に対し Normal で12%)と Region RWMA > 0(38% 対 5%)は、データセット中で群を抜いて識別力の高い単一特徴量である。DM と HTN も Cad で顕著に多い。Sex, 喫煙, 家族歴は分離が弱い。

5. 数値相関

大半の数値特徴量は相関が弱い。|r| ≥ 0.4 のペア:

ペアr
Lymph ↔ Neut-0.92
Weight ↔ BMI+0.73
CR ↔ BUN+0.51
Weight ↔ Length+0.46

Lymph/Neut はほぼ完全な負の相関を示し(両者は合計がおよそ100%になる相補的な白血球分画のパーセンテージである)、Weight/BMI は機構的に連動している(BMI は Weight と Length から導出される)。これらの冗長性は、相関を考慮する合成生成器や特徴量リークの回避において重要である。eda_correlation_heatmap.png を参照。

eda_correlation_heatmap.png
eda_correlation_heatmap.png

6. SMOTE / 合成生成に向けたデータ品質メモ

  • 混在する特徴量型。 22列の文字列カテゴリ + 11列の整数コード化二値 + 低カーディナリティの順序変数(Function Class, Region RWMA, VHD, BBB)が連続値の検査値と混在する。素の SMOTE は連続なユークリッド空間を仮定するため、SMOTE-NC(またはカテゴリを認識できる合成生成器)を用いない限り、二値/カテゴリのカラムに小数値を補間してしまう。カテゴリのカラムは明示的にエンコードして宣言すること。
  • 定数カラムが1つ: Exertional CP は100%が 'N' であり、分散がゼロで削除すべきである(情報を持たず、一部の指標を破綻させる)。
  • 準定数に近いカラムが複数(1つの値が≥97%): CRF, CVA, Thyroid Disease, CHF(99.7%), Weak Peripheral Pulse, Diastolic Murmur, LowTH Ang(99.3%), Poor R Progression。これらの稀な二値変数は、少数クラスを合成する際に忠実に再現するのが難しく、見かけ上の忠実度を過大に見せることがある。多数派の値へのモード崩壊に注意する。
  • 歪んだ/裾の重い検査値と外れ値(IQR ルール): TG(外れ値16件, 最大1050), FBS(30件, 最大400), Na(15件, 最大156), ESR, PLT(最大742), WBC(最大18000)。生成器は非現実的な合成値を避けるため、これらを制約するか対数処理する必要があるかもしれない。SMOTE の補間はサンプルをこれらの極値へ引き寄せる。
  • 機構的な冗長性: Weight/Length/BMI と Lymph/Neut は導出可能な関係を符号化している。これらに反する合成サンプル(例: Weight/Length と矛盾する BMI)は、手軽な忠実度チェックになる。
  • 欠損データなしであるため、生成器や SMOTE に補完ステップは不要である。実データとの差異は補完ノイズではなく、純粋に生成モデルに由来する。

  • outputs/figures/eda_target_distribution.png — クラス数と不均衡。
  • outputs/figures/eda_numeric_by_class.png — クラス別に分割した主要な数値特徴量10件の箱ひげ図。
  • outputs/figures/eda_correlation_heatmap.png — 数値相関行列。

実験によって生成されたすべての図を、インラインで埋め込んで一覧表示します。