Дорожная карта участия в соревнование ООН по 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         # Зависимости

Ключевые файлы (приоритет изучения)

  1. config.yml — лимиты времени, памяти, правила фаз
  2. data/*.json — схемы опросов (структура вопросов, gate-логика)
  3. baseline/marginal_counts/main.py — минимальный рабочий шаблон
  4. 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. Для каждого датасета выведи:

  1. Количество GIVEN, PREDICT, EXCLUDE вопросов
  2. Количество PREDICT ячеек (сколько нужно предсказать)
  3. Все gate-правила (parent → observed_if)
  4. Типичную длину вектора вероятностей (len(values) + 1)"

Артефакт: Таблица с характеристиками всех 3 датасетов

Усиление: Понимаем масштаб задачи и где искать "лёгкие деньги"

Критерий успеха: Можете ответить на вопросы: Сколько всего PREDICT ячеек нужно предсказать? Сколько gate-правил есть в каждом датасете?


УРОВЕНЬ 1: "Охота за лёгкими деньгами" (Дни 6-12)

Цель: Найти и использовать детерминированные правила

Этап 1.1: Анализ gate-логики

Действия:

Запросите Qwen: "Напиши скрипт, который:

  1. Загружает все 3 схемы из data/*.json
  2. Для каждого gate-правила выводит: имя родительского вопроса, условие observed_if, имя дочернего вопроса
  3. Сохраняет результат в 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), которая:

  1. Для каждого PREDICT вопроса с gate проверяет значение parent-вопроса
  2. Если parent имеет значение из observed_if, возвращает вероятность 1.0 для gated_value (последний слот)
  3. Иначе возвращает 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, который:

  1. Загружает TRAIN данные из песочницы
  2. Для каждого PREDICT вопроса считает распределение ответов
  3. Выводит топ-3 самых "уверенных" вопроса (один вариант >60%)
  4. Выводит топ-3 самых "равномерных" вопроса (все варианты <20 em="">
  5. Сохраняет маргинальные частоты в marginals.json"

Артефакт: marginals.json + понимание, где модель может выиграть

Усиление: Понимаете, какие вопросы "лёгкие", а какие "сложные"

Критерий успеха: Скрипт работает и выводит статистику


Этап 2.2: Простая модель (CatBoost/XGBoost)

Действия:

Запросите Qwen: "Напиши скрипт train_catboost.py, который:

  1. Загружает TRAIN данные из песочницы
  2. Для каждого PREDICT вопроса обучает CatBoost, где: признаки — все GIVEN колонки, целевая — ответ на PREDICT вопрос
  3. Сохраняет модели в models/catboost_{question_name}.cbm
  4. Выводит accuracy на валидации"

Артефакт: Обученные модели для каждого вопроса

Усиление: Модель учитывает индивидуальные признаки респондента

Критерий успеха: Модели обучаются и accuracy > маргинального baseline


Этап 2.3: Интеграция модели в main.py

Действия:

Запросите Qwen: "Напиши main.py, который:

  1. На уровне модуля загружает все модели из models/
  2. В predict() для каждого PREDICT вопроса: если есть gate-правило и оно сработало → используем его, иначе используем CatBoost
  3. Последний слот (gated_value) = вероятность из gate-правила или 0.0
  4. Возвращает векторы в правильном порядке"

Артефакт: Рабочий main.py с CatBoost

Усиление: Модель использует признаки респондента + gate-логику

Критерий успеха: Локальный score.py показывает skill > gate-правил

Комментарии

Самое посещаемое за последние 7 дней

Кнопки на рычаге переключения АКПП: O/D, MANU и POWER

TRON - технология точного прогноза силы, места и времени землетрясений

Индикаторы и значки на панели японского авто. Часть 1

Типы личности в соционике: таблица знаменитостей VIP TOP

Сингулярность: от вертикали Г.Д. Снукса - Панова А.Д. к трем сценариям будущего

Alternative to QKV Architecture — STO (Semantics, Time, Operator)

22 июля 2026 г. ИИ OpenAI (создатель ChatGPT) вышла из-под контроля

Инструменты для улучшения доступа к сервису YouTube

Время в ИИ: эмерджентность, а не матрица

«Служу Советскому Союзу» - из Присяги слов не выкинешь

.