NextStatNextStat

NextStat для специалистов по данным

От sklearn к строгому статистическому выводу

Вы обучаете модели, оцениваете метрики и поставляете предсказания. NextStat добавляет то, чего не хватает многим ML-пайплайнам: статистически строгую оценку неопределенности и проверку гипотез с учетом всех важных для вас систематических неопределенностей. Реализовано на Rust, вызывается из Python и дифференцируемо в PyTorch.

Суть в одном предложении

NextStat позволяет заменить ad-hoc error bars на интервалы на основе профильного правдоподобия, заменить grid search на байесовское семплирование NUTS и обучать нейросети, у которых функция потерьявляется полноценным статистическим тестом.

Что вы уже знаете → как это называется в NextStat

Ваши терминыТермин NextStatЗачем это важно
Важность признаков (feature importance)Ранкинг (impact plot)Показывает, как каждая систематика сдвигает результат (вариации up/down)
Функция потерьОтрицательное лог-правдоподобие (NLL)Профильное правдоподобие автоматически профилирует мешающие параметры
Доверительный интервалИнтервал на основе профильного правдоподобияКонтроль покрытия, а не эвристическое приближение бутстрепом
p-value / значимостьCLs / Z₀ (значимость открытия)Учитывает эффект множественных сравнений и систематические неопределённости
Подбор гиперпараметровПрофильный скан / интеграция OptunaСкан по параметру интереса с полным профилированием
Кросс-валидацияToy Monte Carlo (псевдоэксперименты)Сэмплирование псевдоэкспериментов для проверки покрытия и смещения
DataFrameТаблица Arrow / DataFrame PolarsZero-copy ingest через Arrow IPC, без оверхеда сериализации

Быстрый старт за 5 минут

import nextstat

# 1. Загрузить модель (pyhf JSON workspace - спецификация эксперимента)
model = nextstat.from_pyhf("workspace.json")

# 2. Фит (MLE) - как sklearn .fit(), но с полной оценкой неопределенностей
result = nextstat.fit(model)
print(f"Лучший фит: {result.bestfit}")
print(f"Неопределенности: {result.uncertainties}")
print(f"Матрица корреляций: {result.corr_matrix}")

# 3. Проверка гипотезы: есть ли сигнал
hypo = nextstat.hypotest(model, poi_value=1.0)
print(f"CLs = {hypo.cls:.4f}")  # < 0.05 - исключение на уровне 95% CL

# 4. Важность систематик: какие неопределенности влияют сильнее всего
ranking = nextstat.ranking(model)
for r in ranking[:5]:
    print(f"  {r.name}: +{r.impact_up:.3f} / {r.impact_down:.3f}")

# 5. Профильный скан: ландшафт правдоподобия
scan = nextstat.scan(model, poi_values=[0, 0.5, 1.0, 1.5, 2.0])
# -> scan.deltanll_values для кривой -2ΔlogL

Arrow / Polars: ваши данные без копирования

Если ваши данные живут в Polars, PyArrow, DuckDB или Spark, NextStat читает их напрямую через Arrow IPC и не платит оверхед сериализации.

import polars as pl
import nextstat

df = pl.read_parquet("histograms.parquet")
table = df.to_arrow()

model = nextstat.from_arrow(table, poi="mu", observations={"SR": [10, 20]})
result = nextstat.fit(model)

# Экспорт обратно в Arrow для дальнейшего анализа
yields = nextstat.to_arrow(model, params=result.bestfit, what="yields")

Дифференцируемое обучение: loss = статистический тест

Ключевая фича для ML: обучайте нейросеть, у которой функция потерь равна реальной значимости открытия (Z₀), а все систематические неопределенности профилируются. Градиенты проходят через полную статистическую модель благодаря теореме об огибающей.

from nextstat.torch import SignificanceLoss, SoftHistogram

# Выход нейросети: непрерывные scores -> мягкая гистограмма -> loss по Z₀
loss_fn = SignificanceLoss(model, "signal")
soft_hist = SoftHistogram(bin_edges=torch.linspace(0, 1, 11))

for batch_x, batch_w in dataloader:
    scores = classifier(batch_x)
    histogram = soft_hist(scores, batch_w)
    loss = loss_fn(histogram.double().cuda())   # → scalar -Z₀
    loss.backward()                             # gradients to NN weights
    optimizer.step()

Когда использовать NextStat, а когда sklearn или statsmodels

ЗадачаЛучший инструмент
Быстрая логистическая регрессия на чистом наборе данныхsklearn
GLM с робастными стандартными ошибками и подробной сводкойstatsmodels
Проверка гипотез с множественными систематическими неопределенностямиNextStat
Обучение нейросети, где loss = значимость открытияNextStat
GPU-ускоренный пакетный фит (тысячи моделей)NextStat
Апостериорное распределение: NUTS + диагностикаNextStat
Воспроизводимые артефакты валидации для аудитаNextStat

Следующие шаги

  • Обзор ML - Терминологический мост (physics ↔ ML) Обзор ML
  • Гайд по обучению - End-to-end руководство по SignificanceLoss Гайд по обучению
  • Python API - Полная справка по API Python API
  • Arrow / Polars - Обмен данными без копирования Arrow / Polars
  • Агентные инструменты - Определения tools для LLM-управляемого анализа Агентные инструменты
  • API сервера - Self-hosted GPU-инференс для общей вычислительной среды API сервера
  • Глоссарий - Сопоставление терминов HEP ↔ DS ↔ Quant ↔ Bio Глоссарий