Навчання моделі генерації табличних даних (Tabular ML)

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Навчання моделі генерації табличних даних (Tabular ML)
Середній
~5 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1281
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Навчання моделі генерації табличних даних (Tabular ML)

Генерація табличних даних — це навчання моделі, яка синтезує нові рядки, статистично невідрізнені від навчального датасету. Застосування: збільшення для незбалансованих датасетів, синтетичні дані для конфіденційності, тестові дані.

CTGAN: навчання та налаштування

from sdv.single_table import CTGANSynthesizer
from sdv.metadata import SingleTableMetadata
from sdv.evaluation.single_table import evaluate_quality, run_diagnostic
import pandas as pd

def train_tabular_generator(df: pd.DataFrame,
                              target_column: str = None) -> CTGANSynthesizer:
    metadata = SingleTableMetadata()
    metadata.detect_from_dataframe(df)

    # Тонке налаштування типів
    if target_column:
        # Бінарний таргет — завжди категоріальний
        metadata.update_column(target_column, sdtype='categorical')

    synthesizer = CTGANSynthesizer(
        metadata,
        epochs=500,
        batch_size=500,
        generator_dim=(256, 256, 256),    # Глибше для складних даних
        discriminator_dim=(256, 256, 256),
        pac=10,                            # Упакування для стабілізації навчання
        log_frequency=True,
        verbose=True
    )

    synthesizer.fit(df)
    return synthesizer

def evaluate_generator(real_df: pd.DataFrame,
                        synthetic_df: pd.DataFrame,
                        metadata: SingleTableMetadata) -> dict:
    quality_report = evaluate_quality(real_df, synthetic_df, metadata)
    diagnostic = run_diagnostic(real_df, synthetic_df, metadata)

    return {
        'quality_score': quality_report.get_score(),
        'column_shapes': quality_report.get_details('Column Shapes'),
        'column_pair_trends': quality_report.get_details('Column Pair Trends'),
        'diagnostic': diagnostic.get_results()
    }

SMOTE для незбалансованих класів

from imblearn.over_sampling import SMOTE, ADASYN, BorderlineSMOTE
from imblearn.combine import SMOTETomek

def balance_dataset(X: pd.DataFrame, y: pd.Series,
                     method: str = 'smote') -> tuple:
    methods = {
        'smote': SMOTE(sampling_strategy='auto', random_state=42),
        'adasyn': ADASYN(sampling_strategy='auto', random_state=42),
        'borderline': BorderlineSMOTE(random_state=42),
        'smote_tomek': SMOTETomek(random_state=42)  # SMOTE + очищення Tomek Links
    }

    resampler = methods[method]
    X_res, y_res = resampler.fit_resample(X, y)

    print(f"Original distribution: {y.value_counts().to_dict()}")
    print(f"Resampled distribution: {pd.Series(y_res).value_counts().to_dict()}")

    return X_res, y_res

TableDiffusion: дифузійні моделі для таблиць

Новітній підхід для складних мультимодальних табличних даних:

# TabDDPM — SOTA для табличної генерації
from tab_ddpm import TabDDPM

model = TabDDPM(
    num_numerical=10,  # Кількість числових ознак
    num_categorical=5, # Кількість категоріальних ознак
    d_layers=[256, 256, 256],
    dropout=0.0,
    rtdl_params={},
)

model.fit(X_train, num_epochs=1000, batch_size=256)
synthetic = model.sample(n=len(X_train))

ML Utility тест (TSTR)

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import roc_auc_score

def tstr_evaluation(real_train: pd.DataFrame, synthetic_train: pd.DataFrame,
                     real_test: pd.DataFrame, target: str) -> dict:
    """Навчання на синтетичних, тестування на реальних"""
    X_real = real_train.drop(columns=[target])
    X_synth = synthetic_train.drop(columns=[target])
    X_test = real_test.drop(columns=[target])

    # Модель на реальних даних
    clf_real = GradientBoostingClassifier(random_state=42)
    clf_real.fit(X_real, real_train[target])
    auc_real = roc_auc_score(real_test[target], clf_real.predict_proba(X_test)[:, 1])

    # Модель на синтетичних даних
    clf_synth = GradientBoostingClassifier(random_state=42)
    clf_synth.fit(X_synth, synthetic_train[target])
    auc_synth = roc_auc_score(real_test[target], clf_synth.predict_proba(X_test)[:, 1])

    utility_gap = (auc_real - auc_synth) / auc_real
    print(f"AUC Real: {auc_real:.4f}, AUC Synthetic: {auc_synth:.4f}")
    print(f"ML Utility Gap: {utility_gap:.2%} (target: < 5%)")

    return {'auc_real': auc_real, 'auc_synthetic': auc_synth, 'utility_gap': utility_gap}

Для більшості задач CTGAN з 300-500 епохами навчання дає ML utility gap < 5% при високій якості вихідних даних. TabDDPM показує кращі результати на складних датасетах з високою розмірністю.