Skip to content

manasbegaliev777-dev/scintillation-detector-clustering

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Кластеризация сигналов сцинтилляционного детектора

Сессионное задание · Классическое машинное обучение · НИЯУ МИФИ (Skillfactory) · 2026

Python 3.10 scikit-learn 1.3 Kaggle Score Status

О проекте

Задача — автоматическая кластеризация 23 479 сигналов органического сцинтилляционного детектора на три группы методами машинного обучения без учителя.

Физическая основа разделения — метод Pulse Shape Discrimination (PSD): нейтроны и гамма-кванты создают импульсы с разной скоростью затухания, что позволяет разделить их без меток.

Три кластера:

Кластер Тип частицы Число сигналов Доля
0 Гамма-кванты 12 003 51.1%
1 Нейтроны 11 467 48.8%
2 Аномальные сигналы (насыщение АЦП) 9 0.04%

Структура репозитория

.
├── notebooks/
│   └── Сессионное_задание_Классическое_МО_Бегали_уулу_Манас.ipynb
├── data/
│   └── README.md          # Описание датасета и инструкция по получению
├── report/
│   └── README.md          # Скриншот результата с Kaggle
├── requirements.txt
└── README.md

Данные

Датасет Run200_Wave_0_1.txt (71 МБ) — не включён в репозиторий (данные соревнования Kaggle).

Для воспроизведения результатов скачайте файл с Kaggle и положите его рядом с ноутбуком или по пути:

D:/SF/Классическое машинное обучение/Сессионное задание. Классическое машинное обучение/Run200_Wave_0_1.txt

Ноутбук автоматически ищет файл в нескольких путях.

Формат: текстовый файл, 23 479 строк, каждая строка — сигнал из 500 временных отсчётов + служебные столбцы.

Методология

Предобработка

  • Инверсия сигнала: 2¹⁴ − x − 1560 (детектор фиксирует отрицательные импульсы)
  • Нормировка на пиковую амплитуду для вычисления PSD
  • Масштабирование: RobustScaler (устойчив к выбросам)

Feature Engineering

Извлечено 21 признак:

Группа Признаки
PSD-признаки (7 шт.) psd_2_25, psd_3_30, psd_5_40, psd_8_50, psd_10_60, psd_15_70, psd_20_80
Нормированные амплитуды (9 шт.) norm_3 ... norm_50
Скорость затухания log_slope
Отношение хвостов tail_ratio
Амплитуда peak_amplitude, log_amplitude

Ключевой признак — psd_5_40 (score двумодальности = 0.1555 — наименьший, самое чёткое разделение).

Сравнение алгоритмов (на 20% подвыборке, K=3)

Алгоритм Silhouette ↑ Davies-Bouldin ↓ Calinski-Harabasz ↑
Agglomerative (average) 0.5055 1.0242 52.1
K-Means 0.3275 1.6581 2070.1
GMM (spherical) 0.2391 3.1403 960.5

Несмотря на то что Agglomerative показал лучший Silhouette, для финальной классификации выбрана GMM (diag) — она моделирует перекрывающиеся гауссовы распределения, что физически соответствует задаче. Кроме того, GMM даёт вероятности принадлежности, необходимые для уточнения в граничной зоне.

Подбор гиперпараметров GMM

Перебор по сетке: covariance_type × n_init × max_iter:

cov n_init max_iter Silhouette
full 30–100 300–500 0.0112
tied 30–100 300–500 0.1196
diag 50 500 0.2320
spherical 30–100 300–500 0.2391

Выбраны: covariance_type='diag', n_init=50, max_iter=500.

Финальная классификация

Амплитудно-стратифицированный PSD-порог + GMM-уточнение в граничной зоне:

Диапазон амплитуд Число сигналов Порог PSD
< 300 (шумный сигнал) 5 676 0.320
300–5000 (основная группа) 15 353 0.303
≥ 5000 (надёжный PSD) 2 450 0.295
  • Граничная зона (±0.035 от порога): 4 303 сигнала (18.3%) → уточняется двумя независимыми GMM (diag + spherical), выбирается более уверенный ответ
  • Аномалии: 9 сигналов с насыщением АЦП (амплитуда ≥ 14 820)

Результат

Kaggle Public Score: 0.84671

Соревнование: Scintillation Detector

Как запустить

# 1. Клонировать репозиторий
git clone https://github.com/manasbegaliev777-dev/scintillation-detector-clustering.git
cd scintillation-detector-clustering

# 2. Установить зависимости
pip install -r requirements.txt

# 3. Положить датасет рядом с ноутбуком
# Run200_Wave_0_1.txt → notebooks/

# 4. Запустить ноутбук
jupyter notebook notebooks/

Ноутбук выполняется последовательно, ячейка за ячейкой. Время выполнения ~5–10 минут (зависит от процессора).

Зависимости

pandas>=1.5
numpy>=1.23
scikit-learn>=1.3
matplotlib>=3.6
seaborn>=0.12
scipy>=1.9
jupyter>=1.0

Полный список — в requirements.txt.

Об авторе

Бегали уулу Манас — студент курса «Машинное обучение», НИЯУ МИФИ (Skillfactory), 2026.

GitHub: @manasbegaliev777-dev

About

Кластеризация сигналов сцинтилляционного детектора методами машинного обучения без учителя. Kaggle score: 0.84671

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors