[Перевод] Обнаружение ценовых аномалий для временных рядов

искусственный интеллект Программа перевода самородков

Photo credit: Pixabay

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

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

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

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

Конечно, есть некоторые аномалии, с которыми вы столкнетесь только один раз в жизни, и мы можем заранее знать, что это не должно повториться в то же время в ближайшие несколько лет. Например, потрясающие цены на номера в Атланте со 2 по 4 февраля 2019 года.

Figure 1

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

данные

Процесс получения данных был трудным, и я получил только некоторые данные, которые не были идеальными.

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

Мы выделим подмножество из training.csv:

  • Выберите отель с наибольшим количеством точек данныхproperty_id = 104517.
  • Выберите visitor_location_country_id = 219 (из другого анализа номер страны 219 представляет США), чтобы унифицироватьprice_usdСписок. Это связано с тем, что в разных странах по-разному отображаются налоги и стоимость номера.Стоимостью номера может быть стоимость за ночь или общая стоимость, но мы знаем, что отели в Соединенных Штатах отображают налоги и сборы за ночь.
  • выберитеsearch_room_count = 1.
  • Выбираем другие функции, которые нам нужны:date_time,price_usd,srch_booking_windowиsrch_saturday_night_bool.
expedia = pd.read_csv('expedia_train.csv')
df = expedia.loc[expedia['prop_id'] == 104517]
df = df.loc[df['srch_room_count'] == 1]
df = df.loc[df['visitor_location_country_id'] == 219]
df = df[['date_time', 'price_usd', 'srch_booking_window', 'srch_saturday_night_bool']]

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

df.info()

Figure 2

df['price_usd'].describe()

Сейчас мы обнаружили серьезное исключение, максимальная цена_usd оказалась равной 5584.

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

expedia.loc[(expedia['price_usd'] == 5584) & (expedia['visitor_location_country_id'] == 219)]

Figure 3

df = df.loc[df['price_usd'] < 5584]

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

визуализация временных рядов

df.plot(x='date_time', y='price_usd', figsize=(12,6))
plt.xlabel('Date time')
plt.ylabel('Price in USD')
plt.title('Time Series of room price by date time of search');

Figure 4

a = df.loc[df['srch_saturday_night_bool'] == 0, 'price_usd']
b = df.loc[df['srch_saturday_night_bool'] == 1, 'price_usd']
plt.figure(figsize=(10, 6))
plt.hist(a, bins = 50, alpha=0.5, label='Search Non-Sat Night')
plt.hist(b, bins = 50, alpha=0.5, label='Search Sat Night')
plt.legend(loc='upper right')
plt.xlabel('Price')
plt.ylabel('Count')
plt.show();

Figure 5

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

Кластерное обнаружение аномалий

алгоритм k-средних

k-means — широко используемый алгоритм кластеризации. Он создает «k» кластеров похожих точек данных. Элементы данных за пределами этих кластеров могут быть помечены как аномальные. Прежде чем мы начнем кластеризацию с помощью k-средних, мы используем правило локтя, чтобы определить оптимальное количество кластеров.

Figure 6

Из кривой локтя на рисунке выше мы видим, что изображение постепенно выравнивается после 10 кластеров, а это означает, что добавление большего количества кластеров не объясняет большую дисперсию коррелированной переменной; коррелированная переменная в этом примереprice_usd.

мы установилиn_clusters=10, используя выходные данные k-средних для построения трехмерных кластеров.

Figure 7

Теперь нам нужно выяснить, сколько компонентов (функций) оставить.

Figure 8

Мы видим, что первый компонент объясняет почти 50% дисперсии, а второй компонент объясняет более 30% дисперсии. Тем не менее, мы должны отметить, что ни один компонент не может быть пренебрежимо мал. Первые два компонента содержат более 80% информации, поэтому мы установилиn_components=2.

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

  • Вычислите расстояние между каждой точкой и ближайшим к ней центром кластера. Самые большие из этих расстояний являются аномалиями.
  • мы используемoutliers_fractionПредоставляет алгоритму информацию о доле выбросов в наборе данных. Для разных наборов данных он может быть разным, но в качестве отправной точки я оцениваюoutliers_fraction=0.01, что представляет собой долю наблюдений в стандартном нормальном распределении, которые более чем на 3 отличаются от среднего значения с точки зрения абсолютного значения Z-показателя.
  • использоватьoutliers_fractionрассчитатьnumber_of_outliers.
  • будетthresholdУстановите кратчайшее расстояние между выбросами.
  • anomaly1Аномальные результаты включают кластеры вышеуказанных методов (0: нормальный, 1: ненормальный).
  • Визуализируйте аномалии, используя представление кластера.
  • Визуализируйте исключения, используя представление временных рядов.

Figure 9

Figure 10

Результаты показывают, что аномальные показатели комнат, обнаруженные с помощью кластеризации k-средних, либо очень высоки, либо очень низки.

использоватьизолированный леспровестианомальное обнаружение

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

  • мы используемIsolationForestмодели, задайте загрязнение = outliers_fraction, что означает, что доля выбросов в наборе данных равна 0,01.
  • fitиpredict(data)Выполняет обнаружение аномалий в наборе данных, возвращая 1 для нормальных значений и -1 для выбросов.
  • Наконец, у нас есть временное представление исключения.

Figure 11

Обнаружение аномалий на основе метода опорных векторов (SVM)

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

OneClassSVM

Согласно этой статье: Support Vector Method for Novelty Detection. SVM — это метод, основанный на наибольшем интервале, то есть он не моделирует распределение вероятностей. Суть обнаружения аномалий на основе SVM заключается в том, чтобы найти функцию, которая выводит положительные значения для областей с высокой плотностью точек и отрицательные значения для областей с низкой плотностью точек.

  • в примеркеOneClassSVMмодель, мы устанавливаемnu=outliers_fraction, который является верхней границей ошибки обучения и нижней границей опорного вектора, который должен быть между 0 и 1. Это в основном то, сколько мы ожидаем выбросов в данных.
  • Укажите тип функции ядра в алгоритме:rbf. В этот момент SVM использует нелинейную функцию для преобразования гиперпространства в более высокие измерения.
  • gamma— параметр типа ядра RBF, управляющий эффектом одиночной обучающей выборки — он влияет на «гладкость» модели. Поэкспериментировав, я не нашел существенной разницы.
  • predict(data)Выполните классификацию данных. Поскольку наша модель является моделью с одним классом, она будет возвращать только +1 или -1, -1 для ненормального и 1 для нормального.

Figure 12

Обнаружение аномалий с использованием распределения Гаусса

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

Scikit-Learn[**covariance.EllipticEnvelope**](https://scikit-learn.org/stable/modules/generated/sklearn.covariance.EllipticEnvelope.html)Функция предполагает, что наши общие данные являются внешним представлением распределения вероятностей, за которым стоит многомерное гауссово распределение, чтобы попытаться вычислить ключевые параметры общего распределения данных. Процесс аналогичен этому:

  • Создайте два разных набора данных — search_Sat_night, Search_Non_Sat_night на основе определенных ранее категорий.
  • Использование для каждой категорииEllipticEnvelope(распределение Гаусса).
  • мы установилиcontaminationпараметр, который представляет собой долю выбросов, присутствующих в наборе данных.
  • мы используемdecision_functionвычислить решающую функцию для данного наблюдения, что эквивалентно поступательному расстоянию Махаланобиса. Чтобы обеспечить совместимость с другими алгоритмами обнаружения выбросов, пороговое значение для того, чтобы стать выбросом, установлено равным 0.
  • predict(X_train)Используйте подобранную модель, чтобы предсказать метки X_train (1 для нормального, -1 для ненормального).

Figure 13

Интересно, что этот подход выявлял только аномально высокие цены, но не аномально низкие.

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

Jupyter notebookзагружено вGithub. Наслаждайтесь этой неделей!

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

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.