Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Signal Types Classification

Решение учебной задачи по кластеризации сигналов сцинтилляционного детектора для Kaggle-соревнования Signal types classification.

Кратко о задаче

Дан набор из 23 479 сигналов, полученных со сцинтилляционного детектора. Каждый сигнал представлен набором временных отсчётов. Нужно без использования размеченных ответов разделить сигналы на 3 кластера:

  • два кластера соответствуют двум основным физическим типам сигналов, например гамма-квантам и нейтронам;
  • третий кластер соответствует аномальным, смешанным или неоднозначным сигналам.

Так как задача решается методами обучения без учителя, номера кластеров условны. В ноутбуке отдельно объясняется, как интерпретировать полученные группы и почему требуется согласование номеров кластеров для корректного Kaggle submission.

Итоговый результат

Финальное решение: aligned_tail15_pca7_kmeans

Public score на Kaggle: 0.84083

Результат на Kaggle: 30 место, score 0.84083

Финальный pipeline:

  1. Загрузка данных из Run200_Wave_0_1.txt.
  2. Отделение служебных столбцов от временных отсчётов сигнала.
  3. Вычитание baseline по первым 50 отсчётам.
  4. Разворот импульсов вверх.
  5. Выделение 15 отсчётов хвоста, начиная с максимума сигнала.
  6. Нормировка хвоста на собственный максимум.
  7. Масштабирование через StandardScaler.
  8. PCA на 7 компонент.
  9. KMeans на 3 кластера.
  10. Согласование номеров кластеров с устойчивым reference-решением.
  11. Формирование одного финального submission.csv.

Структура проекта

.
├── Run200_Wave_0_1.txt          # исходные данные
├── signal_clustering.ipynb      # финальный ноутбук с решением
├── submission.csv               # итоговый файл для Kaggle
├── pyproject.toml               # зависимости проекта
├── uv.lock                      # lock-файл окружения
└── scripts/                     # вспомогательные скрипты экспериментов

Основной файл для проверки: signal_clustering.ipynb.

Что есть в ноутбуке

Ноутбук приведён к финальной линейной структуре:

  1. Постановка задачи.
  2. Импорты и настройки.
  3. Загрузка данных.
  4. EDA.
  5. Предобработка данных.
  6. Feature Engineering и подготовка признаков.
  7. PCA.
  8. Сравнение моделей.
  9. Финальная модель.
  10. Интерпретация кластеров.
  11. Создание submission.csv.
  12. Общие выводы.

В ноутбуке оставлены только те шаги, которые нужны для объяснения и воспроизведения финального решения. Черновые переборы и альтернативные submission-файлы не используются в финальной секции.

EDA и предобработка

В ходе анализа проверены:

  • размерность данных;
  • пропуски и дубликаты;
  • базовые статистики временных отсчётов;
  • распределение baseline и амплитуды;
  • примеры исходных и обработанных сигналов;
  • корреляции между временными отсчётами;
  • диагностические признаки формы сигнала.

Основной вывод EDA: временные отсчёты сильно коррелируют, а полезная информация для разделения сигналов находится не только в амплитуде, но и в форме хвоста после максимума. Поэтому в финальном решении используется компактное PCA-представление нормированного хвоста сигнала.

Почему выбран KMeans

В работе сравнивались несколько подходов:

  • KMeans на ручных признаках формы;
  • KMeans на PCA-признаках хвоста;
  • Gaussian Mixture Model;
  • двухэтапная кластеризация с выделением аномалий.

Лучшим по сочетанию простоты, устойчивости, интерпретируемости и результата на Kaggle оказался KMeans на PCA-представлении хвоста сигнала. GMM и двухэтапная схема дали хуже результат на leaderboard, поэтому в финальную модель не вошли.

Интерпретация кластеров

Полученные группы интерпретируются осторожно, так как истинных меток в данных нет:

  • два крупных кластера можно рассматривать как два основных типа сигналов;
  • меньший кластер можно рассматривать как группу аномальных, смешанных или неоднозначных сигналов;
  • различия между кластерами видны по средней форме хвоста и PSD-like диагностическим признакам.

В работе не утверждается, что конкретный номер кластера строго соответствует гамма-квантам или нейтронам. Такая физическая привязка требует размеченных данных или дополнительной экспертной проверки.

Воспроизведение

Проект использует Python >=3.10 и зависимости из pyproject.toml.

Установка зависимостей:

uv sync

Запуск Jupyter:

uv run jupyter lab

Выполнение ноутбука из командной строки:

uv run jupyter nbconvert --to notebook --execute signal_clustering.ipynb --output signal_clustering_executed.ipynb

После выполнения ноутбука в корне проекта создаётся файл:

submission.csv

Он содержит две колонки:

index, cluster

Финальный вывод

Задача кластеризации сигналов решена методами обучения без учителя. Финальное решение использует форму хвоста сигнала после максимума, PCA для снижения размерности и KMeans для разбиения на три группы. Такой подход даёт воспроизводимый результат, хорошо согласуется с физической постановкой задачи и позволяет содержательно интерпретировать два основных типа сигналов и отдельную группу неоднозначных объектов.

About

Кластеризация сигналов сцинтилляционного детектора без учителя: форма хвоста импульса, PCA + KMeans. Public score 0.84083 на Kaggle

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages