TanSana: шанс поступления на грант
Модель прогнозирует проходной балл общего конкурса на грант для варианта «вуз × группа образовательных программ (ГОП)» Казахстана на следующий год и считает шанс абитуриента с заданным баллом Единого национального тестирования (ЕНТ). Она работает в продукте TanSana, где шанс показывается словом с подписью «шанс по данным 5 лет, ориентир, не гарантия», а не числом.
Что внутри файла
model-v2.joblib это словарь с полями model (объект BaselineChance), calibrator (изотоническая калибровка Calibrator), shift (сдвиг роста по группам программ), features (last, group), forecast_year (2027), show_number (false), data_hash и sklearn (версия, на которой файл сохранён). Классы лежат в engine/chance.py этого репозитория; кроме него нужны engine/history.py, engine/rules.py, numpy и scikit-learn.
Способ расчёта: прогноз отсечки равен отсечке последнего года плюс сдвиг роста (среднее изменение «год к году» за два последних перехода по группе программ, первые три знака кода ГОП). Распределение изменения берётся из фактических изменений «год к году» вариантов той же группы; группа с малым числом изменений берёт изменения всех вариантов. Шанс равен доле изменений, при которых балл не ниже прогнозной отсечки; квантили 10, 50 и 90 берутся из того же распределения. Сырой шанс проходит изотоническую калибровку.
Как загрузить
import joblib
from engine.chance import History
bundle = joblib.load("model-v2.joblib")
model, calibrator = bundle["model"], bundle["calibrator"]
# условный ряд отсечек варианта по годам
h = History(univ_id="kbtu", gop="B057", cutoffs={2022: 104, 2023: 107, 2024: 108, 2025: 110, 2026: 111})
print(model.predict(h, 2027)) # {'p10': ..., 'p50': ..., 'p90': ...}
raw = model.chance(h, 113, 2027) # сырой шанс балла 113
print(float(calibrator(raw))) # шанс после калибровки
Запускать из папки репозитория, чтобы пакет engine находился рядом с файлом модели.
Данные
Ряды построены по таблице проходных баллов общего конкурса за 2021-2026 годы: 1 748 вариантов «вуз × ГОП». Строки 2022-2025 годов взяты в основном с сайтов-агрегаторов, часть с официальных сайтов вузов, а 2026 год с копии официальной публикации. Таблица в репозиторий модели не входит. Признаки и сдвиг каждого целевого года строятся только по годам до него; модель обучена на целевых годах 2023-2026, калибровка на 2026 годе.
Проверка на 2026 годе
Перед выбором способа базовая линия и машинное обучение (три HistGradientBoostingRegressor с квантильной функцией потерь) прогнозировали отсечки 2026 года по данным прошлых лет. В продукт выбрана базовая линия, потому что её полоса 10-90 накрыла факт у 85 % вариантов при пороге 70 %.
| Показатель (1 054 варианта) | Базовая линия | Машинное обучение | Отсечка прошлого года |
|---|---|---|---|
| Средняя ошибка медианы прогноза (MAE), баллов | 7,68 | 7,72 | 10,38 |
| Медианная ошибка, баллов | 5,02 | 5,86 | 8,00 |
| Покрытие полосы 10-90 | 85 % | 61 % | нет |
| Средняя ширина полосы 10-90, баллов | 30,3 | 17,2 | нет |
| Оценка Брайера до калибровки | 0,1259 | 0,1298 | нет |
| Оценка Брайера после калибровки | 0,1505 | 0,1341 | нет |
Полный отчёт с методикой лежит рядом: report.md и report.json.
Ограничения
Модель даёт ориентир, а не гарантию: отсечка зависит от числа грантов, конкурса и правил года, которых в рядах нет. Средняя ошибка медианы около 8 баллов, поэтому продукт показывает шанс словом и полосой, а числа отсечек и правил считает код по официальным данным. Модель не знает о новых программах без истории и о вузах вне таблицы.