Дорожная карта участия в соревнование ООН по AI 1 - 2.1
SimulacraBench — соревнование ООН по улучшению точности социологических опросов через AI.
Задача: Предсказывать вероятности ответов респондентов на вопросы, которые им не задавали или на которые они не ответили.
Формат:
- 3 датасета: UNICEF, World Bank, UNHCR
- Каждый датасет — таблица "респондент × вопрос"
- Видим только часть ответов (GIVEN), должны предсказать скрытые (PREDICT)
- Метрика: Skill (0 = случайное угадывание, 1 = идеал)
Призы: Не указаны в README, но это престижное соревнование от ООН + Stanford.
Почему это важно?
Это не просто "заполнить пропуски". Это про то, как сделать опросы дешевле и точнее, предсказывая ответы тех, кто не ответил, или кому не задали вопрос из-за логики опроса (gate).
🗺️ РАЗДЕЛ 2: КАРТА МИРА
Структура проекта
SituatedEvals/public/
├── data/
│ ├── sample.json # Тестовая схема (400 респондентов)
│ ├── unicef.json # Реальная схема UNICEF
│ ├── world_bank.json # Реальная схема World Bank
│ └── unhcr.json # Реальная схема UNHCR
├── baseline/
│ ├── marginal_counts/ # Бейзлайн: маргинальные частоты
│ └── bundled_artifact/ # Пример загрузки весов
├── tutorials/
│ ├── ru.ipynb # Туториал на русском
│ └── en.ipynb # Туториал на английском
├── tools/
│ └── check_submission_zip.py # Валидатор архива
├── make_sandbox.py # Генератор песочницы
├── score.py # Локальный скоринг
├── config.yml # Конфигурация (лимиты, фазы)
└── requirements.txt # Зависимости
Ключевые файлы (приоритет изучения)
config.yml— лимиты времени, памяти, правила фазdata/*.json— схемы опросов (структура вопросов, gate-логика)baseline/marginal_counts/main.py— минимальный рабочий шаблонtutorials/ru.ipynb— объяснение механики на примере
Фазы соревнования
Phase 1 (Development):
- Доступны: TRAIN (с ответами), DEV (только GIVEN)
- Лидерборд: шумный (Laplace noise)
- Попытки: 1 в день
- Таймер: 900 секунд на все 3 датасета
Phase 2 (Final):
- Доступны: TRAIN + DEV (оба с ответами), TEST (только GIVEN)
- Лидерборд: точный
- Попытки: 1 за всё время
- Таймер: 3600 секунд
📍 РАЗДЕЛ 3: ТЕКУЩАЯ ТОЧКА (День 3)
Где мы сейчас:
- ✅ Репозиторий склонирован
- ✅ Зависимости установлены
- ✅ Песочница сгенерирована
- ⏳ Следующий шаг: Первый сабмит бейзлайна на Codabench
Что уже знаем:
- Структура данных изучена (схемы
data/*.json) - Понимаем контракт
predict(frame, schema) - Знаем про gate-логику (skip patterns)
- Понимаем метрику Skill
Что НЕ знаем:
- Реальное качество бейзлайна на лидерборде
- Насколько шумный лидерборд в Phase 1
- Какие gate-правила дают максимальный прирост
🎮 РАЗДЕЛ 4: ПУТЬ ГЕРОЯ (Основной план)
УРОВЕНЬ 0: "Первые шаги" (Дни 3-5)
Цель: Получить гарантированно работающий сабмит
Этап 0.1: Локальная валидация бейзлайна
Действия:
# Генерируем песочницу для всех 3 датасетов
python make_sandbox.py --schema data/unicef.json --out _sandbox/unicef
python make_sandbox.py --schema data/world_bank.json --out _sandbox/world_bank
python make_sandbox.py --schema data/unhcr.json --out _sandbox/unhcr
# Проверяем бейзлайн на всех 3 датасетах
python score.py --submission baseline/marginal_counts --data _sandbox/unicef --schema data/unicef.json --phase 1
python score.py --submission baseline/marginal_counts --data _sandbox/world_bank --schema data/world_bank.json --phase 1
python score.py --submission baseline/marginal_counts --data _sandbox/unhcr --schema data/unhcr.json --phase 1
Артефакт: 3 вывода PASS с локальными skill-оценками
Усиление: Понимаем базовый уровень, от которого будем отталкиваться
Критерий успеха: Все 3 команды возвращают PASS
Этап 0.2: Первый сабмит на Codabench
Действия:
# Копируем бейзлайн
cp -R baseline/marginal_counts sub_01_baseline
cd sub_01_baseline
# Упаковываем (ВАЖНО: изнутри папки!)
zip -r ../sub_01_baseline.zip .
cd ..
# Проверяем архив
python tools/check_submission_zip.py sub_01_baseline.zip
# Загружаем на Codabench через VPN
# https://codabench.org/competitions/[ID_конкурса]
Артефакт: Первая строчка на лидерборде
Усиление:
- Понимаем реальный уровень бейзлайна
- Видим, как работает лидерборд
- Получаем уверенность, что всё работает
Критерий успеха: Лидерборд показывает skill > 0
Этап 0.3: Разведка схем данных
Действия:
Запросите Qwen: "Проанализируй data/unicef.json, data/world_bank.json, data/unhcr.json. Для каждого датасета выведи:
- Количество GIVEN, PREDICT, EXCLUDE вопросов
- Количество PREDICT ячеек (сколько нужно предсказать)
- Все gate-правила (parent → observed_if)
- Типичную длину вектора вероятностей (len(values) + 1)"
Артефакт: Таблица с характеристиками всех 3 датасетов
Усиление: Понимаем масштаб задачи и где искать "лёгкие деньги"
Критерий успеха: Можете ответить на вопросы: Сколько всего PREDICT ячеек нужно предсказать? Сколько gate-правил есть в каждом датасете?
УРОВЕНЬ 1: "Охота за лёгкими деньгами" (Дни 6-12)
Цель: Найти и использовать детерминированные правила
Этап 1.1: Анализ gate-логики
Действия:
Запросите Qwen: "Напиши скрипт, который:
- Загружает все 3 схемы из
data/*.json - Для каждого gate-правила выводит: имя родительского вопроса, условие
observed_if, имя дочернего вопроса - Сохраняет результат в
gate_rules_analysis.txt"
Артефакт: gate_rules_analysis.txt со всеми правилами
Усиление: Видите, какие правила можно использовать как детерминированные
Критерий успеха: Список из N gate-правил, где observed_if — конкретное значение
Этап 1.2: Детерминированные gate-правила
Действия:
Запросите Qwen: "На основе gate_rules_analysis.txt напиши функцию apply_gate_rules(frame, schema), которая:
- Для каждого PREDICT вопроса с gate проверяет значение parent-вопроса
- Если parent имеет значение из
observed_if, возвращает вероятность 1.0 для gated_value (последний слот) - Иначе возвращает None (чтобы использовать обычную модель)"
Промпт для интеграции:
"Теперь интегрируй apply_gate_rules в baseline/marginal_counts/main.py. Если apply_gate_rules вернул вектор, используй его. Иначе используй маргинальные частоты."
Артефакт: Новая версия main.py с gate-логикой
Усиление: Детерминированные правила дают огромный прирост (часто +10-20% к skill)
Критерий успеха: Локальный score.py показывает skill > бейзлайна
Этап 1.3: Сабмит с gate-логикой
Действия:
cp -R baseline/marginal_counts sub_02_gate_rules
cd sub_02_gate_rules
zip -r ../sub_02_gate_rules.zip .
cd ..
python tools/check_submission_zip.py sub_02_gate_rules.zip
Артефакт: Вторая строчка на лидерборде
Усиление: Видите реальный прирост от gate-логики, понимаете насколько лидерборд шумный
Критерий успеха: skill(sub_02) > skill(sub_01)
УРОВЕНЬ 2: "Первая модель" (Дни 13-25)
Цель: Построить модель, использующую признаки респондента
Этап 2.1: Анализ маргинальных распределений
Действия:
Запросите Qwen: "Напиши скрипт analyze_marginals.py, который:
- Загружает TRAIN данные из песочницы
- Для каждого PREDICT вопроса считает распределение ответов
- Выводит топ-3 самых "уверенных" вопроса (один вариант >60%)
- Выводит топ-3 самых "равномерных" вопроса (все варианты <20 em="">20>
- Сохраняет маргинальные частоты в
marginals.json"
Артефакт: marginals.json + понимание, где модель может выиграть
Усиление: Понимаете, какие вопросы "лёгкие", а какие "сложные"
Критерий успеха: Скрипт работает и выводит статистику
Этап 2.2: Простая модель (CatBoost/XGBoost)
Действия:
Запросите Qwen: "Напиши скрипт train_catboost.py, который:
- Загружает TRAIN данные из песочницы
- Для каждого PREDICT вопроса обучает CatBoost, где: признаки — все GIVEN колонки, целевая — ответ на PREDICT вопрос
- Сохраняет модели в
models/catboost_{question_name}.cbm - Выводит accuracy на валидации"
Артефакт: Обученные модели для каждого вопроса
Усиление: Модель учитывает индивидуальные признаки респондента
Критерий успеха: Модели обучаются и accuracy > маргинального baseline
Этап 2.3: Интеграция модели в main.py
Действия:
Запросите Qwen: "Напиши main.py, который:
- На уровне модуля загружает все модели из
models/ - В
predict()для каждого PREDICT вопроса: если есть gate-правило и оно сработало → используем его, иначе используем CatBoost - Последний слот (gated_value) = вероятность из gate-правила или 0.0
- Возвращает векторы в правильном порядке"
Артефакт: Рабочий main.py с CatBoost
Усиление: Модель использует признаки респондента + gate-логику
Критерий успеха: Локальный score.py показывает skill > gate-правил
Комментарии
Отправить комментарий
Ваше мнение по этому поводу?