- Оригинальный адрес:Time Series of Price Anomaly Detection
- Оригинальный автор:Susan Li
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:kasheemlew
- Корректор:xionglong58,portandbridge
Обнаружение аномалий относится к обнаружению точек данных в наборе данных, которые не следуют статистическим законам других данных.
Обнаружение аномалий, также известное как обнаружение выбросов, представляет собой процесс интеллектуального анализа данных для определения типа аномалии и соответствующих деталей ее возникновения. Автоматическое обнаружение аномалий сегодня имеет решающее значение, потому что объем данных сейчас настолько велик, что ручная маркировка невозможна. Автоматическое обнаружение аномалий имеет широкий спектр применений, таких как защита от мошенничества, системный мониторинг, обнаружение ошибок, обнаружение событий в сенсорных сетях и многое другое.
Но я собираюсь заняться обнаружением аномалий в ценах на гостиничные номера по несколько эгоистичной причине.
Я не знаю, был ли у вас когда-нибудь такой опыт, например, вы регулярно ездите в определенное место по делам и каждый раз останавливаетесь в одном и том же отеле. Обычно стоимость номеров не сильно колеблется. Но иногда даже один и тот же номер в одном и том же отеле стоит ужасно дорого. Из-за ограничений на субсидии на поездки в настоящее время вы можете выбрать только проживание в отеле. После того, как меня несколько раз обманули, я начал думать о создании модели для автоматического обнаружения этой ценовой аномалии.
Конечно, есть некоторые аномалии, с которыми вы столкнетесь только один раз в жизни, и мы можем заранее знать, что это не должно повториться в то же время в ближайшие несколько лет. Например, потрясающие цены на номера в Атланте со 2 по 4 февраля 2019 года.
В этом посте я опробую различные методы обнаружения аномалий, используя неконтролируемое обучение для обнаружения аномалий во временных рядах цен на гостиничные номера. Давайте начнем!
данные
Процесс получения данных был трудным, и я получил только некоторые данные, которые не были идеальными.
Данные, которые мы собираемся использовать,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()
df['price_usd'].describe()
Сейчас мы обнаружили серьезное исключение, максимальная цена_usd оказалась равной 5584.
Если отдельный элемент данных несколько ненормальный по сравнению с другими данными, мы называем этоодноточечное исключение(например, крупные сделки). Мы можем проверить журналы, чтобы увидеть, что происходит. После некоторого расследования я думаю, что это может быть ошибка данных или пользователь случайно искал президентский люкс, но не бронировал и не просматривал. Чтобы найти больше мелких аномалий, я решил удалить эти данные.
expedia.loc[(expedia['price_usd'] == 5584) & (expedia['visitor_location_country_id'] == 219)]
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');
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();
В целом, поиск по субботним вечерам давал более стабильные и низкие цены, тогда как поиск по субботним вечерам давал значительно более высокие цены. Кажется, этот отель более популярен по выходным.
Кластерное обнаружение аномалий
алгоритм k-средних
k-means — широко используемый алгоритм кластеризации. Он создает «k» кластеров похожих точек данных. Элементы данных за пределами этих кластеров могут быть помечены как аномальные. Прежде чем мы начнем кластеризацию с помощью k-средних, мы используем правило локтя, чтобы определить оптимальное количество кластеров.
Из кривой локтя на рисунке выше мы видим, что изображение постепенно выравнивается после 10 кластеров, а это означает, что добавление большего количества кластеров не объясняет большую дисперсию коррелированной переменной; коррелированная переменная в этом примереprice_usd
.
мы установилиn_clusters=10
, используя выходные данные k-средних для построения трехмерных кластеров.
Теперь нам нужно выяснить, сколько компонентов (функций) оставить.
Мы видим, что первый компонент объясняет почти 50% дисперсии, а второй компонент объясняет более 30% дисперсии. Тем не менее, мы должны отметить, что ни один компонент не может быть пренебрежимо мал. Первые два компонента содержат более 80% информации, поэтому мы установилиn_components=2
.
При обнаружении аномалий на основе кластеров подчеркивается предположение, что мы кластеризуем данные, нормальные данные принадлежат кластерам, а аномалии не принадлежат ни одному кластеру или принадлежат очень маленьким кластерам. Ниже мы обнаруживаем аномалии и визуализируем их.
- Вычислите расстояние между каждой точкой и ближайшим к ней центром кластера. Самые большие из этих расстояний являются аномалиями.
- мы используем
outliers_fraction
Предоставляет алгоритму информацию о доле выбросов в наборе данных. Для разных наборов данных он может быть разным, но в качестве отправной точки я оцениваюoutliers_fraction=0.01
, что представляет собой долю наблюдений в стандартном нормальном распределении, которые более чем на 3 отличаются от среднего значения с точки зрения абсолютного значения Z-показателя. - использовать
outliers_fraction
рассчитатьnumber_of_outliers
. - будет
threshold
Установите кратчайшее расстояние между выбросами. -
anomaly1
Аномальные результаты включают кластеры вышеуказанных методов (0: нормальный, 1: ненормальный). - Визуализируйте аномалии, используя представление кластера.
- Визуализируйте исключения, используя представление временных рядов.
Результаты показывают, что аномальные показатели комнат, обнаруженные с помощью кластеризации k-средних, либо очень высоки, либо очень низки.
использоватьизолированный леспровестианомальное обнаружение
изолированный лесОбнаружение основано исключительно на том, что количество выбросов невелико, а значения разные. Изоляция аномалии может быть достигнута без измерения какого-либо расстояния или плотности. Это полностью отличается от кластерных или дистанционных алгоритмов.
- мы используемIsolationForestмодели, задайте загрязнение = outliers_fraction, что означает, что доля выбросов в наборе данных равна 0,01.
-
fit
иpredict(data)
Выполняет обнаружение аномалий в наборе данных, возвращая 1 для нормальных значений и -1 для выбросов. - Наконец, у нас есть временное представление исключения.
Обнаружение аномалий на основе метода опорных векторов (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 для нормального.
Обнаружение аномалий с использованием распределения Гаусса
Распределение Гаусса также известно как нормальное распределение. Мы разработаем алгоритм обнаружения аномалий, используя распределение Гаусса, другими словами, мы предполагаем, что данные следуют нормальному распределению. Это допущение справедливо не для всех наборов данных, и после его установления можно эффективно идентифицировать выбросы.
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 для ненормального).
Интересно, что этот подход выявлял только аномально высокие цены, но не аномально низкие.
До сих пор мы выполняли обнаружение ценовых аномалий четырьмя методами. Поскольку мы используем неконтролируемое обучение для обнаружения аномалий, после построения модели нам нечего сравнивать и тестировать, поэтому у нас нет возможности узнать, как она работает. Следовательно, эти методы должны быть проверены на предмет их результатов, прежде чем решать критические проблемы.
Jupyter notebookзагружено вGithub. Наслаждайтесь этой неделей!
использованная литература:
- Introduction to Anomaly Detection
- sklearn.ensemble.IsolationForest - scikit-learn 0.20.2 documentation
- sklearn.svm.OneClassSVM - scikit-learn 0.20.2 documentation
- sklearn.covariance.EllipticEnvelope - scikit-learn 0.20.2 documentation
- Unsupervised Anomaly Detection | Kaggle
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.