Воспроизводимое решение задачи классификации куки по событиям внутри суточного окна. Для каждой куки вычисляется score от 0 до 1. Основная метрика — максимальный Precision среди порогов с Recall ≥ 70%.
Результат на платформе: 0,80750 — по скриншоту проверки, предоставленному пользователем. Меток скрытой выборки в репозитории нет.
Решение, получившее этот балл, зафиксировано тегом score-0.80750. Основной solution.ipynb и команда train.py воспроизводят именно его.
artifacts/candidate.csv объединяет общий ансамбль (85%) и отдельные модели для веба и мобильного трафика (15%). Его оценка на скрытом тесте ещё неизвестна.
| Временной период | Общий ансамбль | Кандидат |
|---|---|---|
| 11–13 апреля | 0,6731 | 0,6965 |
| 14–16 апреля | 0,7709 | 0,7740 |
| 17–19 апреля | 0,7943 | 0,7972 |
| Среднее | 0,7461 | 0,7559 |
Повторить обучение кандидата из исходных данных:
python train_candidate.py --data data --output candidate.csv
python verify_submission.py --submission candidate.csv --test data/test.csv --manifest artifacts/candidate_manifest.jsonФайл candidate_description.txt содержит короткое описание для сдачи. Дополнительные проверки и сравнения находятся в experiments. Улучшение на локальных отрезках не гарантирует прироста на скрытом тесте или достижения 1,0.
- Ноутбук с кодом и пояснениями
- Отправленный файл прогнозов
- Краткое описание подхода
- Скачать весь репозиторий ZIP
Проверенное окружение: Python 3.13.13, CPU, версии библиотек зафиксированы. Из исходного архива задания bot_detection_challenge.zip поместите train.csv, test.csv, events.csv.gz в папку data/.
python -m pip install -r requirements.txt
python train.py --data data --output submission.csv
python verify_submission.py --submission submission.csv --test data/test.csvКод заново строит признаки и обучает модели на размеченных данных. Файл artifacts/submission.csv используется проверкой только как эталон контрольной суммы. Он не читается при обучении или предсказании. Исходный набор данных не публикуется; его контрольные суммы записаны в artifacts/manifest.json.
Проверено полным запуском ноутбука: все 6 вычислительных ячеек выполнены сверху вниз; получено побайтовое совпадение с отправленным CSV. SHA-256: 45c6660d9e40560903bdf7bd0d649c1e294a2c9ab80cfc86401ce34874ac8a61.
python -m pip install -r requirements-notebook.txt
python execute_notebook.pyНоутбук исполняется сверху вниз, сохраняет результаты ячеек и формирует submission.csv. Его можно также открыть в Jupyter или VS Code. По умолчанию обучение на всей выборке запускается заново, а таблица временной валидации читается из сохранённых результатов. Для повторения самой валидации задайте RUN_VALIDATION=True в ноутбуке либо выполните:
python train.py --data data --validate --output validation.csvСобытия ограничены интервалом [window_start_ts, window_end_ts). Из них вычисляются частоты и доли действий, статистики пауз, активность по времени, разнообразие объявлений, категорий, локаций и поисковых запросов, платформа и User-Agent. Дополнительно используются возраст куки, статистики координат, перемещений и повторов курсора, наличие координат для разных действий.
Пропущенные категории заменяются на missing, числовые агрегаты — на 0. Платформы приводятся к единому написанию. События сортируются по cookie_id, event_ts, eid; идентификатор куки не является признаком. В одном из компонентов полностью одинаковые исходные строки удаляются до расчёта признаков. Остальные компоненты сохраняют повторные записи и могут учитывать их частоту.
Ансамбль состоит из четырёх CatBoost с random_seed=42, depth=6, learning_rate=0.045, l2_leaf_reg=5:
| Набор признаков | Деревьев в прогнозе | Вес |
|---|---|---|
| Основные | 700 | 0,125 |
| Основные и перемещения курсора | 500 | 0,375 |
| После удаления точных дубликатов | 500 | 0,250 |
| Расширенные признаки курсора и устройства | 500 | 0,250 |
Для точного повторения исходного обучения каждый компонент обучается на 700 деревьях; прогноз ограничивается указанным числом. CPU-потоки зафиксированы в bot_detection/model.py. Используются локальные открытые библиотеки NumPy, pandas, scikit-learn и CatBoost. Во время обучения и предсказания внешние API не вызываются.
Модели обучаются только на днях, предшествующих проверочному периоду. Baseline — Random Forest по количеству событий и уникальных объявлений.
| Период проверки | Куки | Боты | Baseline P@R≥0,70 | Ансамбль P@R≥0,70 | Average precision |
|---|---|---|---|---|---|
| 11–13 апреля | 2556 | 199 | 0,0964 | 0,6731 | 0,7562 |
| 14–16 апреля | 2367 | 195 | 0,1050 | 0,7709 | 0,8029 |
| 17–19 апреля | 1951 | 160 | 0,1062 | 0,7943 | 0,7883 |
Среднее основной метрики — 0,7461. Точные значения: artifacts/validation.csv.
Проверялись разные настройки CatBoost, LightGBM, ExtraTrees, HistGradientBoosting, отбор признаков, признаки последовательности и времени, удаление дубликатов и усреднение моделей. Дополнительные признаки не всегда улучшали все периоды, поэтому выбор учитывал несколько временных отрезков. Эти отрезки использовались при выборе решения и не являются независимым финальным тестом. Небольшие различия локальной метрики не гарантируют прироста на платформе. Результат 1,0 не достигнут.
solution.ipynb # объяснение, обучение и проверка совпадения CSV
train.py # запуск без Jupyter
bot_detection/features.py # агрегирование только внутри окна
bot_detection/model.py # обучение, ансамбль и временная валидация
bot_detection/metric.py # метрика с группировкой равных score
verify_submission.py # формат, идентификаторы, диапазон и SHA-256
tests/test_correctness.py # границы окна и обработка одинаковых score
artifacts/ # отправленный CSV, метрики и контрольные суммы
data/ # сюда поместить исходные данные задания
Проверки важных условий:
python -m unittest discover -s tests -vМодель обучается только на train.target. Ручная разметка теста и правила под конкретные cookie_id не используются. Новые эксперименты хранятся отдельно; отправленный результат сохраняется в истории Git.