איסוף נתונים אמיתיים ל-ML נתקל לא פעם במגבלות רגולציה: GDPR, HIPAA או מדיניות ארגונית אוסרות על העברת מערכי נתונים גולמיים למפתחים. בפרויקט עם עסקאות בנקאיות, לא יכולנו להשתמש ברשומות אמיתיות — נאלצנו לייצר נתונים סינתטיים המשמרים התפלגויות ומתאמים עד ערך p של KS > 0.4. נתונים סינתטיים פותרים בעיה זו: מרחיבים מערכי נתונים, מאזנים מחלקות (למשל, הופכים 1% עסקאות הונאה ל-50%), ובודקים מודלים ללא סיכון פרצה. בעבודתנו, יישמנו יצירה עבור 15+ פרויקטים בפיננסים, בריאות וקמעונאות. כל פרויקט דורש גישה אישית — אין פתרון אוניברסלי. הבעיה חריפה במיוחד עם מערכי נתונים לא מאוזנים: אם מחלקת היעד היא פחות מ-1%, ללא נתונים סינתטיים אי אפשר לאמן מודל. אנו משתמשים ב-CTGAN עם דגימה מותנית כדי לייצר דוגמאות של המחלקה הנדרשת בפרופורציה הנכונה. חיסכון באיסוף נתונים — עד 40%, ובביקורת רגולציה — עד 30%.
מדוע נתונים טבלאיים סינתטיים נחוצים ל-ML?
נקודת הכאב המרכזית היא מחסור בנתונים מתויגים איכותיים. גם אם נתונים קיימים, הם מכילים לעיתים קרובות מידע אישי שאינו נגיש לצוותים חיצוניים. נתונים סינתטיים מסירים מגבלות אלה: אתה מקבל מערך נתונים עם אותן תכונות סטטיסטיות אך ללא סיכון דליפה. למשימות לא מאוזנות (זיהוי הונאה, מחלות נדירות), זו הדרך היחידה להשיג מדגם מייצג של מחלקת המיעוט. החיסכון באיסוף נתונים יכול להגיע ל-40%, ומהירות הפיתוח גדלה פי כמה.
כיצד נתונים טבלאיים סינתטיים פותרים את בעיית המחלקות הלא מאוזנות
CTGAN משתמש בוקטור מותנה הקובע את היחס הרצוי של קטגוריות במערך הנתונים שנוצר. לדוגמה, לזיהוי הונאה אנו קובעים את חלקם של עסקאות ההונאה על 50% — זה משפר בחדות את רמת ה-recall של המודל. המחולל והמבחין מתחרים: הראשון לומד ליצור רשומות מציאותיות, השני להבחין בינן לבין אמיתיות. כתוצאה מכך, התפלגויות ומתאמים נשמרים בדיוק גבוה. לנתונים פיננסיים, ערך p טיפוסי של KS עבור תכונות מספריות הוא 0.2–0.6.
בחירת שיטת יצירה — נתונים טבלאיים סינתטיים
הבחירה תלויה בסוג הנתונים ובדרישות הפרטיות. על סמך ניסיוננו:
| שיטה | מהירות | איכות | פרטיות | מתאימה ל |
|---|---|---|---|---|
| Gaussian Copula | מהירה | טובה | גבוהה | נתונים מספריים, התפלגויות נורמליות |
| CTGAN | איטית | מצוינת | בינונית | קטגוריים + מספריים |
| TVAE | בינונית | מצוינת | בינונית | ממדיות גבוהה |
| REaLTabFormer | איטית | עליונה | דורש DP | תלות מורכבת |
Gaussian Copula עובדת פי 10 מהר יותר מ-CTGAN, אך CTGAN משמרת טוב יותר התפלגויות מולטי-מודליות מורכבות. למחלקות לא מאוזנות, CTGAN מבטיחה יחס מחלקות מדויק לאחר היצירה באמצעות וקטור מותנה. אנו מכוונים היפרפרמטרים (embedding_dim, generator_dim) עבור כל מערך נתונים — ניצול GPU מגיע ל-90% לכל epoch.
כיצד לשפר את איכות הנתונים הסינתטיים עם fine-tuning
כיוונון עדין של מודל גנרטיבי על תחום ספציפי משפר את האיכות. לנתונים רפואיים, אנו מבצעים fine-tuning ל-CTGAN מאומן מראש במשך 10 epochs עם קצב למידה מופחת. תוצאה: ערך p של KS משתפר מ-0.05 ל-0.4. עם זאת, חשוב לא לבצע overfitting — אנו משתמשים ב-early stopping המבוסס על מדדי SDMetrics. עבור כל פרויקט, אנו יוצרים כרטיס מודל המתעד היפרפרמטרים, מדדים ותנאי יצירה.
כיצד להעריך את איכות הנתונים הסינתטיים
ולידציה היא שלב מפתח. אנו משתמשים ב-SDMetrics ו-scipy כדי לבדוק התפלגויות ומתאמים. המטרה היא שנתונים סינתטיים יהיו בלתי ניתנים להבחנה סטטיסטית מאמיתיים (ערך p > 0.05).
from scipy.stats import ks_2samp
import matplotlib.pyplot as plt
def validate_synthetic_quality(real: pd.DataFrame, synthetic: pd.DataFrame) -> dict:
results = {}
for col in real.select_dtypes(include=np.number).columns:
ks_stat, p_value = ks_2samp(real[col].dropna(), synthetic[col].dropna())
results[col] = {
'real_mean': real[col].mean(),
'synthetic_mean': synthetic[col].mean(),
'real_std': real[col].std(),
'synthetic_std': synthetic[col].std(),
'ks_stat': ks_stat,
'distribution_match': p_value > 0.05
}
real_corr = real.select_dtypes(np.number).corr()
synth_corr = synthetic.select_dtypes(np.number).corr()
corr_diff = (real_corr - synth_corr).abs().mean().mean()
results['correlation_mae'] = corr_diff
return results
ספי איכות טיפוסיים הניתנים להשגה בפועל:
| מדד | ערך יעד | תוצאה טיפוסית (CTGAN) |
|---|---|---|
| ערך p של KS (מספרי) | > 0.05 | 0.10–0.60 |
| MAE של מתאם | < 0.05 | 0.02–0.04 |
| כיסוי קטגוריות | > 95% | 98–100% |
לרוב משימות ה-ML, נתונים סינתטיים שנוצרו על ידי CTGAN עם ציון > 0.85 ב-SDMetrics מאפשרים השגת 95–98% מאיכות המודל בהשוואה לאימון על נתונים אמיתיים באותו נפח.
הרחב דוגמת קוד CTGAN
import pandas as pd
from ctgan import CTGAN
import numpy as np
def train_ctgan_synthesizer(
data: pd.DataFrame,
discrete_columns: list,
epochs: int = 300
) -> CTGAN:
synthesizer = CTGAN(
embedding_dim=128,
generator_dim=(256, 256),
discriminator_dim=(256, 256),
batch_size=500,
epochs=epochs,
verbose=True,
pac=10,
)
synthesizer.fit(data, discrete_columns=discrete_columns)
return synthesizer
financial_data = pd.read_parquet("transactions.parquet")
discrete_cols = ['merchant_category', 'transaction_type', 'currency', 'is_fraud']
synth = train_ctgan_synthesizer(financial_data, discrete_cols)
n_real = len(financial_data)
synthetic = synth.sample(n_real * 5)
print(f"Real fraud rate: {financial_data['is_fraud'].mean():.4f}")
print(f"Synthetic fraud rate: {synthetic['is_fraud'].mean():.4f}")CTGAN: Modeling Tabular Data using Conditional GAN (Xu et al., 2019)
מתי ולידציה קריטית: טעויות טיפוסיות
- Overfitting של המחולל: אם המודל שינן רשומות אמיתיות, ערך p של KS גבוה באופן חריג (> 0.9). בדוק כפילויות.
- בחירת מדד שגויה: מבחן KS לבדו אינו מספיק — הקפד לבדוק גם MAE של מתאם וכיסוי קטגוריות.
- התעלמות מסוגי נתונים: תכונות קטגוריות עם ערכים נדירים דורשות הגדלת batch_size ו-epochs.
מה כולל פיתוח צינור נתונים סינתטיים?
אנו מציעים מחזור עבודה מלא:
- ניתוח מערך נתונים: הערכת התפלגויות, מתאמים, ערכים חסרים וחריגים.
- בחירה וכיוונון מודל: בחירת ארכיטקטורה (CTGAN, TVAE, Gaussian Copula) והיפרפרמטרים.
- אימון וולידציה: שימוש ב-SDMetrics, מבחני KS, ניתוח מתאמים.
- אינטגרציה: יצירת צינור על Airflow או Docker, API ליצירה.
- תיעוד: כרטיס מודל עם מדדים, מדריך הפעלה, דוח איכות.
- הכשרת צוות: סדנה על שימוש בסינתיסייזר ופרשנות מדדים.
- תמיכה באחריות: שבועיים לאחר היישום.
לוחות זמנים — בין 2 ל-4 שבועות בהתאם למורכבות מערך הנתונים. העלות מחושבת באופן אישי. קבל ייעוץ לבחירת שיטת יצירה עבור מערך הנתונים שלך — צור קשר. הזמן פיתוח צינור עבור הנתונים שלך.







