Обнаружение выбросов с помощью библиотеки Python Scikit-learn

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

В этой короткой статье мы рассмотрим основы алгоритма и то, как его можно легко реализовать с помощью Python с помощью Scikit-learn.

Но сначала нам нужно охватить то, чем на самом деле являются выбросы.

Что такое выбросы?

При работе с реальными данными часто встречаются точки данных, выходящие за рамки обычного тренда. Их часто называют выбросами или аномалиями. Обнаружение аномалий может быть полезным по ряду причин, в том числе:

  • Обнаружение мошеннических транзакций по кредитным картам
  • Выявление необычного сетевого трафика, который может указывать на несанкционированный доступ
  • Обнаружение аномальных пятен/пикселей на изображениях дальнего космоса, которые потенциально могут быть новой звездой
  • Обнаружение аномальных «признаков» при медицинском сканировании

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

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

В Python доступно множество алгоритмов, как контролируемых, так и неконтролируемых, которые позволяют обнаруживать эти аномалии.

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

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

Один из неконтролируемых методов называется Изолирующий лес. Полную информацию о том, как работает алгоритм, можно найти в исходной статье Лю и др. (2008 г.), которая находится в свободном доступездесь.

Методология изолированного леса

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

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

Любые аномалии/выбросы будут разделены на ранних этапах процесса, что позволит легко их идентифицировать и изолировать от остальных данных.

Обнаружение аномалий этим методом предполагает:

  • Наличие аномалий небольшое
  • Аномальные значения отличаются от нормальных значений

На изображении ниже показан очень простой пример с использованием одной переменной — объемной плотности (RHOB) и одного дерева.

Поскольку мы используем ансамбль (группу) деревьев, которые случайным образом подобраны к данным, мы можем взять среднее значение глубины внутри дерева, на которой происходят выбросы, и сделать окончательную оценку «выбросов» этой точки данных. .

Преимущества изолированного леса

Isolation Forest имеет ряд преимуществ по сравнению с традиционными моделями на основе расстояния и плотности:

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

Учебное пособие по Python для изолированного леса

В следующих примерах мы увидим, как мы можем улучшить диаграмму рассеяния с помощью морского происхождения.

Источник данных

Для этого мы будем использовать подмножество более крупного набора данных, который использовался в рамках конкурса по машинному обучению, организованного Xeek и FORCE 2020 (Bormann et al., 2020). Он выпущен под лицензией NOLD 2.0 от правительства Норвегии, подробности о которой можно найти здесь: Норвежская лицензия на открытые правительственные данные (NLOD) 2.0.

Полный набор данных доступен по следующей ссылке: https://doi.org/10.5281/zenodo.4351155.

Все примеры в этой статье можно использовать с любым набором данных.

Импорт библиотек и данных

Для этого урока нам нужно будет импортировать морские, панды и IsolationForest из Scitkit-Learn.

После того, как они были импортированы, нам нужно загрузить наши данные каротажа. В этом примере данные хранятся в файле CSV и содержат измерения для одной лунки: 15/9–15.

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

Это возвращает следующую сводку данных:

Вышеприведенная сводка показывает только числовые данные, присутствующие в файле. Если мы хотим просмотреть все функции в кадре данных, мы можем вызвать df.info() , который сообщит нам, что у нас есть 12 столбцов данных и различные уровни полноты.

Как и во многих алгоритмах машинного обучения, нам нужно иметь дело с пропущенными значениями. Как видно выше, у нас есть несколько столбцов, таких как NPHI (нейтронная пористость) с 13 346 значениями и GR (гамма-излучение) с 17 717 значениями.

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

Я бы порекомендовал ознакомиться с этими моими статьями, если вы хотите узнать больше о работе с отсутствующими данными:

Чтобы удалить отсутствующие строки, мы можем вызвать следующее:

И если мы снова вызовем df, мы увидим, что теперь у нас осталось 13 290 значений для каждого столбца.

Создание модели изолированного леса с помощью Scikit-Learn

Из нашего фрейма данных нам нужно выбрать переменные, с которыми мы будем обучать нашу модель изолированного леса.

В этом примере я буду использовать только две переменные (NPHI и RHOB). На самом деле мы бы использовали больше, и мы увидим пример этого позже. Использование двух переменных позволяет нам визуализировать то, что сделал алгоритм.

Сначала мы создадим список имен наших столбцов:

Далее мы создадим экземпляр нашей модели изолированного леса. Для этого сначала создается переменная с именем model_IF, а затем назначается IsolationForest().

Затем мы можем передать ряд параметров для нашей модели. Те, которые я использовал в коде ниже:

  • загрязнение: это то, какую часть общих данных мы ожидаем рассматривать как выброс. Мы можем передать значение от 0 до 0,5 или установить его автоматически.
  • random_state: это позволяет нам контролировать процесс случайного выбора для разделения деревьев. Другими словами, если бы мы повторно запускали модель с теми же данными и параметрами с фиксированным значением этого параметра, мы должны были бы получить повторяющиеся выходные данные.

После инициализации нашей модели мы можем обучить ее на данных. Для этого мы вызываем функцию .fit() и передаем ее в наш фрейм данных (df). Когда мы передаем параметр dataframe, мы также выбираем столбцы, которые мы определили ранее.

После подгонки модели мы теперь можем сделать некоторые прогнозы. Мы сделаем это, добавив два новых столбца в наш фрейм данных:

  • anomaly_scores : создается путем вызова model_IF.decision_function() и предоставляет оценку аномалии для каждой выборки в наборе данных. Чем ниже оценка, тем более аномальным является образец. Отрицательные значения указывают на то, что образец является выбросом.
  • anomaly : Генерируется вызовом model_IF.predict() и используется для определения того, является ли точка выбросом (-1) или выбросом (1).

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

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

Визуализация данных об аномалиях с использованием matplotlib

Глядя на числовые значения и пытаясь определить, была ли точка идентифицирована как выброс или нет, может быть утомительно.

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

Эта простая функция предназначена для создания графика и предоставления некоторых дополнительных показателей в виде текста. Функция принимает:

  • data : кадр данных, содержащий значения
  • outlier_method_name : Название метода, который мы используем. Это только для наглядности
  • xvar , yvar : переменные, которые мы хотим отобразить по осям x и y соответственно.
  • xaxis_limits, yaxis_limits : диапазоны осей x и y

Как только наша функция определена, мы можем передать необходимые параметры.

Что генерирует следующий сюжет.

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

Повышение степени загрязнения изолированного леса

В предыдущем примере для параметра загрязнения используется значение 0,1 (10%), что, если мы увеличим его до 0,3 (30%)?

Когда мы запускаем приведенный выше код, мы получаем следующий график. Мы видим, что значительно больше точек было выбрано и идентифицировано как выбросы.

Как мы узнаем, какое значение загрязнения установить?

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

Не существует жестких и быстрых правил для выбора этого значения, и оно должно основываться на знании предметной области, связанной с данными и их предполагаемым приложением (ями).

Для этого конкретного набора данных, с которым я очень хорошо знаком, я бы рассмотрел другие функции, такие как скважинный кавернер и дельта-ро (DRHO), чтобы помочь выявить потенциально плохие данные.

Использование более двух функций для изолированного леса

Теперь, когда мы ознакомились с основами использования Isolation Forest всего с двумя переменными, давайте посмотрим, что произойдет, если мы используем еще несколько.

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

Визуализация выбросов с помощью парного графика Seaborn

Вместо того, чтобы просто смотреть на две переменные, мы можем посмотреть на все переменные, которые мы использовали. Это делается с помощью парного графика Seaborn.

Во-первых, нам нужно установить палитру, которая позволит нам управлять цветами, используемыми в графике.

Затем мы можем вызвать sns.pairplot и передать необходимые параметры.

Что возвращает:

Это дает нам гораздо лучший обзор данных, и теперь мы можем видеть некоторые выбросы, четко выделенные среди других функций. Особенно в рамках функций PEF и GR.

Краткое содержание

Isolation Forest — это простой в использовании и понятный неконтролируемый метод машинного обучения, который может изолировать аномальные точки данных от достоверных данных. При необходимости алгоритм можно масштабировать для обработки больших и многомерных наборов данных.

Если вам интересно посмотреть, как этот метод сравнивается с другими методами, вам может понравиться следующая статья:



Спасибо, что прочитали. Прежде чем идти, вы должны обязательно подписаться на мой контент и получать мои статьи в свой почтовый ящик. Ты можешь сделать это здесь! Кроме того, вы можете подписаться на мою рассылку новостей, чтобы бесплатно получать дополнительный контент прямо в свой почтовый ящик.

Во-вторых, вы можете получить все возможности Medium и поддержать меня и тысячи других авторов, подписавшись на членство. Это стоит всего 5 долларов в месяц, и у вас есть полный доступ ко всем потрясающим статьям на Medium, а также возможность зарабатывать деньги своим текстом. Если вы зарегистрируетесь, используя мою ссылку, вы поддержите меня напрямую частью вашего гонорара, и это не будет стоить вам больше. Если вы это сделаете, большое спасибо за вашу поддержку!

Рекомендации

Борман, Питер, Аурсанд, Педер, Дилиб, Фахад, Манраль, Сдача и Дишингтон, Питер. (2020). FORCE 2020 Набор данных ГИС и литофаций для соревнований по машинному обучению [Набор данных]. Зенодо. http://doi.org/10.5281/zenodo.4351156