Разработка модуля предобработки данных с оценкой влияния шагов очистки и генерации признаков на интерпретируемость моделей
Целевая переменная: Факт совершения повторной покупки (Target = 1) в течение 3-х месяцев после даты среза .
Датасет Online Retail: https://www.kaggle.com/datasets/mashlyn/online-retail-ii-uci
Данный проект представляет собой программный модуль для автоматизации полного цикла машинного обучения: от очистки сырых транзакционных данных до детальной интерпретации предсказаний моделей.
Цель работы: Исследование влияния глубины предобработки данных и методов генерации признаков на качество прогноза и прозрачность (интерпретируемость) моделей машинного обучения.
Задачи: Реализация трех уровней пайплайнов очистки данных (от минимальной до глубокой). Автоматизация расчета поведенческих признаков на основе RFM-анализа и временных паттернов. Оценка качества моделей (Logistic Regression, Decision Tree, XGBoost) на различных наборах данных. Применение методов локальной (LIME) и глобальной (SHAP, Feature Importance) интерпретации для анализа "черных ящиков". Выявление закономерностей между качеством очистки данных и стабильностью объяснений модели.
В ходе эксперимента было протестировано 9 комбинаций (3 пайплайна × 3 модели). Итоговая таблица метрик Pipeline Model Features ROC-AUC F1-Score Precision Recall Is Best
Advanced Logistic Regression 19 0.8232 0.6621 0.6211 0.7088 ✅
Advanced Decision Tree 19 0.8192 0.6573 0.7023 0.6176 ✅
Advanced XGBoost 19 0.8184 0.6555 0.7597 0.5765 ✅
Standard Logistic Regression 9 0.8124 0.6492 0.5791 0.7386
Baseline Logistic Regression 3 0.8070 0.6683 0.6120 0.7361
Standard XGBoost 9 0.8131 0.6168 0.6828 0.5625
Baseline Decision Tree 3 0.7957 0.6481 0.5953 0.7111
Влияние предобработки: Пайплайн Advanced (с очисткой выбросов через IQR и расширенным набором признаков) показал лучшие результаты по метрике ROC-AUC для всех типов моделей.
Лидер по качеству: Логистическая регрессия на продвинутом пайплайне достигла максимума ROC-AUC = 0.8232, что доказывает важность качества признаков для линейных моделей.
Интерпретируемость: Увеличение количества признаков с 3 до 19 позволило выделить наиболее значимые факторы (например, частота покупок и время с последнего заказа), которые в методах SHAP и LIME показывают высокую стабильность.
retail_preprocessing_module/
├── config.py # Константы: даты, пути, гиперпараметры
├── data_loader.py # Загрузка данных + EDA-отчёт
├── preprocessing.py # 3 пайплайна очистки (baseline / standard / advanced)
├── features.py # Инженерия признаков: RFM + поведенческие + временны́е
├── models.py # Обучение: LogReg / DT / XGBoost + метрики
├── interpretability.py # SHAP, LIME, Feature Importance
├── experiment.py # Главный оркестратор — запускает все 9 экспериментов
├── report.py # Итоговые графики
├── requirements.txt
└── data/
# 1. Установить зависимости
pip install -r requirements.txt
# 2. Положить данные
mkdir data
cp ~/Downloads/online_retail_II.xlsx data/
# 3. Запустить полный эксперимент
python experiment.py
# 4. Сгенерировать итоговые графики
python report.pyВсе результаты появятся в папке outputs/.
| Пайплайн | Шаги очистки | Признаков |
|---|---|---|
| baseline | Только удаление NaN в Customer ID | 3 (RFM) |
| standard | + отмены, отриц. qty/price, служебные коды | ~12 |
| advanced | + выбросы по IQR (Price, Quantity) | ~20 |
3 пайплайна × 3 модели = 9 экспериментов
Модели: LogisticRegression | DecisionTree | XGBoost
Для каждой комбинации вычисляются:
- Метрики: ROC-AUC, F1, Precision, Recall, CV-AUC
- Feature Importance: abs(coef) / gain
- SHAP: TreeExplainer / LinearExplainer + summary plot
- LIME: объяснение для одного клиента
| Файл | Описание |
|---|---|
outputs/metrics_summary.csv |
Все метрики всех 9 экспериментов |
outputs/cleaning_steps.csv |
Сколько строк/клиентов удалил каждый шаг |
outputs/interpretability_summary.csv |
Топ-признаки по пайплайнам |
outputs/plots/metrics_comparison.png |
AUC/F1 по пайплайнам |
outputs/plots/cleaning_impact.png |
Влияние очистки на данные |
outputs/plots/fi_compare_*.png |
Тепловые карты FI по пайплайнам |
outputs/plots/shap/shap_compare_*.png |
Тепловые карты SHAP |
outputs/plots/lime/lime_*.png |
LIME объяснения |
Данные: 2009-12-01 — 2011-12-09
Дата среза: 2011-07-01 (train / target split)
Target-окно: 2011-07-01 — 2011-10-01 (3 месяца)
Target = 1: клиент совершил хотя бы одну покупку в target-окне
Все параметры — в config.py:
CUTOFF_DATE,TARGET_END_DATE— временны́е окнаMODEL_PARAMS— гиперпараметры моделейRANDOM_STATE— воспроизводимость
Запуск только части экспериментов:
from experiment import run_experiment
# Только baseline + XGBoost, без LIME
run_experiment(
pipelines = ["baseline", "standard"],
models = ["xgboost"],
run_lime = False,
)master