Сессионное задание · Классическое машинное обучение · НИЯУ МИФИ (Skillfactory) · 2026
Задача — автоматическая кластеризация 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(устойчив к выбросам)
Извлечено 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 — наименьший, самое чёткое разделение).
| Алгоритм | 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 даёт вероятности принадлежности, необходимые для уточнения в граничной зоне.
Перебор по сетке: 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