Этот пост посвящен моему первому участию в соревнованиях kaggle. Конкурс был организован специалистами по машинному обучению курса магистратуры, который я сейчас изучаю. Честно говоря, я понятия не имел, как пройти такого рода конкурс, но поскольку это было обязательное задание, и я должен был его выполнить, мы с моим коллегой действительно потратили много времени, пытаясь получить максимально возможное. счет. Все подробности о проблеме классификации можно найти в kaggle, а полную реализацию модели можно найти в этом публичном репозитории.

Отказ от ответственности:
Этот пост не предназначен для демонстрации строгого и очень формального подхода к решению проблемы, на самом деле он предназначен для полной противоположности. Я постараюсь показать, как я и мой коллега решили проблему, почти ничего не зная о машинном обучении, и как мы получили результат выше 99%. Для более формального подхода к работе вы можете взглянуть на отчет, который мы написали.

Резюме

Ниже приведено краткое описание всего конвейера. В следующих блоках мы углубимся во все показанные модули.

Предварительная обработка

Набор данных

Набор данных был получен из реального развертывания LTE. В течение двух недель каждые 15 минут собирались различные показатели с набора из 10 базовых станций, каждая из которых имела разное количество ячеек. Набор данных предоставляется в виде csv-файла, где каждая строка соответствует выборке, полученной из одной конкретной ячейки в определенное время. Каждый пример данных содержит следующие функции:

  • Time : час дня (в формате чч:мм), когда была создана выборка.
  • CellName: текстовая строка, используемая для уникальной идентификации ячейки, сгенерировавшей текущий образец. CellName имеет вид xαLTE, где x определяет базовую станцию, а α – ячейку внутри этой базовой станции (см. пример на правом рисунке).
  • PRBUsageUL и PRBUsageDL: уровень использования ресурсов в этой ячейке, измеренный как часть физических радиоблоков (PRB), которые использовались (%) за предыдущие 15 минут. Восходящая линия (UL) и нисходящая линия (DL) измеряются отдельно.
  • meanThrDL и meanThrUL: средний трафик (в Мбит/с) за последние 15 минут. Восходящая линия (UL) и нисходящая линия (DL) измеряются отдельно.
  • maxThrDL и maxThrUL: максимальный переданный трафик (в Мбит/с), измеренный за последние 15 минут. Восходящая линия (UL) и нисходящая линия (DL) измеряются отдельно.
  • meanUEDL и meanUEUL: среднее количество устройств пользовательского оборудования (UE), которые были одновременно активны в течение последних 15 минут. Восходящая линия (UL) и нисходящая линия (DL) измеряются отдельно.
  • maxUEDL и maxUEUL: максимальное количество устройств пользовательского оборудования (UE), которые были одновременно активны в течение последних 15 минут. Восходящая линия (UL) и нисходящая линия (DL) измеряются отдельно. maxUE_UL+DL: максимальное количество устройств пользовательского оборудования (UE), которые были активны одновременно за последние 15 минут, независимо от UL и DL.
  • Unusual: метки для контролируемого обучения. Значение 0 определяет, что образец соответствует нормальной работе, значение 1 указывает на необычное поведение.

Использование неколичественных признаков

Первое, что нужно сделать в отношении предварительной обработки данных, — это убедиться, что все функции готовы к использованию, особенно нечисловые: Time и CellName. Time имеет релевантную корреляцию с максимальным количеством часов трафика, хотя день не включен в дату, тем не менее, это достаточно актуальная функция. Чтобы сделать Time готовым к использованию, есть несколько подходов. Тем не менее, выбранный вариант заключался в преобразовании времени (минут) в радианы и разделении их на две функции, одна из которых применяла косинус, а другая — синус. Что касается CellName, было выполнено простое сопоставление 1:1 с числовым идентификатором для каждого имени ячейки.

Визуализация данных

СПС

Что касается PCA, учитывая желаемое количество новых функций, он пытается обеспечить проекцию, используя корреляцию между некоторыми измерениями и сохраняя максимальное количество информации об исходном распределении данных. Как видно на изображении ниже, здесь нет ни четких кластеров, ни четко определенной картины. Обычные и необычные выборки смешиваются во многих отношениях, что ограничивает классификатор, который будет использоваться, например, линейные классификаторы могут быть напрямую исключены.

т-СНЭ

Чтобы использовать другой подход, была опробована нелинейная редукция, такая как t-SNE. t-SNE — это неконтролируемый метод, который минимизирует расхождение между распределением, которое измеряет попарное сходство входных данных, и распределением, которое измеряет сходство соответствующих низкоразмерных точек во встраивании. Как видно на рисунке ниже, t-SNE построил набор разделимых кластеров, но с образцами разных классов, смешанных в одних и тех же кластерах, без четкого визуального паттерна.

Простые ванильные классификаторы

Из-за характера набора данных линейный классификатор не обеспечивает приемлемой производительности. Нейронная сеть тоже не работала из-за небольшого набора данных. Также была протестирована SVM с ядром Гаусса, но результаты оказались не такими хорошими, как результаты, полученные с помощью дерева решений. Наилучшая производительность достигается с простым ванильным деревом решений. Поэтому мы решили углубиться в этот подход.

Решение проблемы классификации

XGBoost. Обучение классификатора

Одним из широко используемых методов являются деревья решений с градиентным усилением. Обобщая, повышение использует итеративный подход к моделям обучения. Он обучает модели последовательно, при этом каждая новая модель обучается исправлять ошибки, допущенные предыдущими. Широко используемой реализацией описанного выше обучения является XGBoost. XGBoost — это оптимизированная распределенная библиотека повышения градиента, разработанная с учетом высокой эффективности, гибкости и портативности.
Всю необходимую информацию о XGBoost можно найти на Странице документации XGBoost.

Примечание.

Если вы хотите избежать процесса обучения и использовать предварительно обученную модель, убедитесь, что xgb_model.joblib загружен в anomaly-4G-detection/xgb_model.joblib.

Если вы хотите пройти тренировочный процесс, есть два пути:

  • Быстрый способ: Наиболее подходящие параметры, которые мы нашли, уже жестко запрограммированы в пайп и в этой части вообще не задействован процесс обучения.
  • Весь процесс обучения: если вы хотите выполнить весь процесс обучения самостоятельно, прокомментируйте параметры в трубе, прокомментируйте
  • clf_GS = RandomizedSearchCV(estimator=pipe, param_distributions=parameters, n_jobs=10, verbose=1, cv=[(slice(None), slice(None))], n_iter= 1)
  • и раскомментировать
  • clf_GS = RandomizedSearchCV(estimator=pipe, param_distributions=parameters, n_jobs=10, verbose=1, cv=5, n_iter= 500)

Выберите функции из модели

Последний эксперимент, который приводит к значительному улучшению, заключается в использовании функций, выбранных моделью, для выполнения сокращения функций. Примите во внимание, что XGBoost, по сути, представляет собой набор деревьев решений ансамбля, поэтому мы могли бы оценить важность его функций после обучения модели.

Оценивая эти данные, мы получаем оптимизированный порог для снижения точности, используя всего 3 функции (проверьте следующий блок кода). Модуль «SelectFromModel» позволил нам передать пороговые значения уже обученной модели и, как только лучший порог будет проверен, преобразовать наборы данных, используя только те функции, которые проходят пороговое значение. Этот последний эксперимент позволил нам сократить количество отзывов с 44 ошибок при проверке до 14. В тестовом наборе мы получили результат 99,83%, что стало нашим лучшим результатом в испытании.

Обучайте и прогнозируйте данные с лучшим сокращением признаков

И результаты лучшего оценщика:

Проницательная визуализация данных

Здесь есть некоторая визуализация данных, чтобы увидеть и понять, почему и что улучшилось, выполнив сокращение функций.

Эволюция ошибки для разных порогов

На этом графике показано улучшение, которое мы получили, внедрив модуль «Feature Selection».

Лучшее снижение производительности

Наше лучшее сокращение функций имеет 3 функции, поэтому мы можем построить результирующий набор данных.

Важность функции

На этом графике показаны функции, которые более важны для XGBoost, когда дело доходит до классификации.

Выводы

В ходе этого исследования мы изучили огромное количество возможных классификаторов и методов для решения проблемы бинарной классификации, представленной в этом отчете. Среди всех этих классификаторов XGBoost оказался подходящим для выполнения этой задачи, как предлагали другие связанные ресурсы.

использованная литература

Некоторые хорошие ссылки, которые мы проверили, чтобы решить проблему:

первоначально опубликовано в https://sergio-gimenez.github.io