Elastic stack, также известный как ELK Stack (аббревиатура из программных компонентов: Elasticsearch, Kibana и Logstash), — это платформа построения озера данных с возможностью аналитики по ним в реальном масштабе времени. В настоящее время широко применяется для обеспечения информационной безопасности, мониторинга бесперебойности и производительности работы ИТ-среды и оборудования, анализа рабочих процессов, бизнес-аналитики.
В соответствии со стратегией компании, исходный код всех продуктов Elastic является открытым, разработка ведётся публично, а базовые функции доступны бесплатно, что выгодно отличает платформу от конкурентов.
Одним из платных наборов функций, в которых Elastic видит коммерческий потенциал и активно развивает, является анализ данных с использованием технологий машинного обучения. О его новых возможностях расскажем в нашей статье.
В текущей версии v7.11 доступны следующие наборы инструментов анализа данных с использованием технологий машинного обучения:
- Обнаружение аномалий на потоке данных (Anomaly detection)
- Аналитика табличных данных (Data frame analytics)
Примечание: Попрактиковаться в использовании перечисленных выше наборов инструментов анализа данных можно будет 24 марта. Совместно с коллегами Elastic мы продемонстрируем, как применять Anomaly detection и Data frame analytics для выявления инцидентов информационной безопасности. Ссылка на регистрацию.
Об инструментах обнаружения аномалий Elastic ранее уже писали на Хабре. С того времени (Elastic версии 7.1) они продолжали активно развиваться, было улучшено качество алгоритмов и удобство их применения для прикладных задач. Но в этой статье мы решили осветить совершенно новый набор функций анализа табличных данных, появившийся в версиях с 7.2 до 7.11.
Data frame analytics — это набор функций Elasticsearch и визуализаций Kibana, позволяющих проводить анализ данных без их привязки к временным меткам. В отличии от Anomaly detection, где предполагается временная последовательность анализируемых данных.
Работа с Data frame analytics осуществляется через графический интерфейс с пошаговым мастером настройки. При этом, за счёт автоматической оптимизации параметров обучения (hyperparameters) пользователю не требуются глубокие знания стоящих за ними математических алгоритмов.
Возможности Data frame analytics Elastic версии 7.11 включают в себя:
- Выявление отклонений в значениях параметров (outlier detection) с использованием алгоритмов машинного обучения без учителя (unsupervised)
Построение моделей машинного обучения с учителем (supervised) для решения задач:
a) Регрессии (regression), как определение зависимости одного значения от одного или нескольких других значений
b) Классификации (classification), как определение принадлежности произвольного объекта к одному из заданных классов
Примечание: Используемые при подготовке статьи датасеты приведены исключительно в целях обзора доступных в Elastic функций машинного обучения, не претендуют на репрезентативность и не могут использоваться для оценки качества алгоритмов.
Выявление отклонений с использованием алгоритмов машинного обучения без учителя (Outlier detection)
Функция Outlier detection, как и ранее существовавшая в Elastic anomaly detection, предназначена для выявления аномальных значений (выбросов) каких-либо параметров и не предполагает обучение с учителем — модель строится каждый раз при запуске. Но в отличие от anomaly detection, значения признаков (фич, особенностей, характерных черт анализируемых объектов) в ней анализируются без учета временной последовательности.
Исходными данными для функции выступает массив записей (JSON документов), в котором данные представлены в виде полей и их значений (поддерживаются числовые и логические типы значений). Каждая запись характеризует поведение какого-либо объекта. Поля в записи включают в себя поле, идентифицирующее объект, и поля со значениями, указывающими на аномальное поведение объекта, их называют признаками (feature).
Результатом функции является оценка отклонения для каждого признака и документа в диапазоне от 0 до 1, где 1 указывает на максимальную вероятность того, что соответствующий признак/документ является выбросом по сравнению с другими документами в анализируемых данных.
В качестве алгоритмов поиска выбросов по умолчанию в Elastic используется ансамбль следующих методов:
- Метод ближайшего соседа (distance of Kth nearest neighbor)
- Метод K ближайших соседей (distance of K-nearest neighbors)
- Локальный уровень выброса (local outlier factor)
- Локальный уровень выброса на основе расстояния (local distance-based outlier factor)
Подробнее про алгоритмы можно почитать здесь и здесь.
Для оценки и интерпретации результатов выявления отклонений Elastic рассчитывает степень влияния признаков на искомое значение.
В качестве иллюстрации приведём несколько примеров применения Outlier detection:
- анализ метрик производительности для выявления отклонений в нагрузке на сервера со стороны сразу нескольких приложений (здесь);
- анализ отпечатков бинарных гистограмм исполняемых файлов для обнаружения обфусцированных и вредоносных файлов (здесь);
- анализ публичных объявлений airnbnb.com (insideairbnb.com) для поиска необычных предложений (здесь).
Ниже рассмотрим функцию анализа выбросов на примере из документации Elastic.
Цель анализа в этом примере — выявить необычное поведение пользователей интернет-магазина. Из магазина в систему поступают события оформления заказа продукции, каждое из которых содержит полное имя заказчика (customer_full_name.keyword), количество покупок в заказе (products.quantity), стоимость заказа (products.taxful_price), id заказа (order_id).
{
"_index": "kibana_sample_data_ecommerce",
"_type": "_doc",
"_id": "_mXypHcB6S7rlhJIFCvB",
"_version": 1,
"_score": null,
"_source": {
"category": [
"Women's Clothing",
"Women's Accessories"
],
"currency": "EUR",
"customer_first_name": "Sonya",
"customer_full_name": "Sonya Smith",
"customer_gender": "FEMALE",
"customer_id": 28,
"customer_last_name": "Smith",
"customer_phone": "",
"day_of_week": "Saturday",
"day_of_week_i": 5,
"email": "sonya@smith-family.zzz",
"manufacturer": [
"Oceanavigations",
"Pyramidustries"
],
"order_date": "2021-03-06T23:31:12+00:00",
"order_id": 592097,
"products": [
{
"base_price": 28.99,
"discount_percentage": 0,
"quantity": 1,
"manufacturer": "Oceanavigations",
"tax_amount": 0,
"product_id": 19238,
"category": "Women's Clothing",
"sku": "ZO0265502655",
"taxless_price": 28.99,
"unit_discount_amount": 0,
"min_price": 13.05,
"_id": "sold_product_592097_19238",
"discount_amount": 0,
"created_on": "2016-12-31T23:31:12+00:00",
"product_name": "Vest - red/white",
"price": 28.99,
"taxful_price": 28.99,
"base_unit_price": 28.99
},
{
"base_price": 13.99,
"discount_percentage": 0,
"quantity": 1,
"manufacturer": "Pyramidustries",
"tax_amount": 0,
"product_id": 13328,
"category": "Women's Accessories",
"sku": "ZO0201102011",
"taxless_price": 13.99,
"unit_discount_amount": 0,
"min_price": 6.86,
"_id": "sold_product_592097_13328",
"discount_amount": 0,
"created_on": "2016-12-31T23:31:12+00:00",
"product_name": "Across body bag - aqua ",
"price": 13.99,
"taxful_price": 13.99,
"base_unit_price": 13.99
}
],
"sku": [
"ZO0265502655",
"ZO0201102011"
],
"taxful_total_price": 42.98,
"taxless_total_price": 42.98,
"total_quantity": 2,
"total_unique_products": 2,
"type": "order",
"user": "sonya",
"geoip": {
"country_iso_code": "CO",
"location": {
"lon": -74.1,
"lat": 4.6
},
"region_name": "Bogota D.C.",
"continent_name": "South America",
"city_name": "Bogotu00e1"
},
"event": {
"dataset": "sample_ecommerce"
}
},
"fields": {
"order_date": [
"2021-03-06T23:31:12.000Z"
],
"products.created_on": [
"2016-12-31T23:31:12.000Z",
"2016-12-31T23:31:12.000Z"
]
},
"sort": [
1615073472000
]
}
Начнём с подготовки данных для анализа. Так как мы сравниваем между собой заказчиков, то исходные события необходимо группировать по полю customer_full_name.keyword. Признаками поведения заказчиков будут выступать суммарные значения количества заказов, количества покупок, стоимость заказов.
Чтобы сгруппировать события, используем функцию трансформации transforms, которая позволяет «на лету» формировать и сохранять в Elasticsearch результаты агрегации ранее собранных данных.
Примечание: Для расчёта нужных признаков используем функции Elastic по агрегации: числовые значения считаем через products.quantity.sum и products.taxful_price.sum, а количество заказов — order_id.value_count.
Результат агрегации, представленный в табличном виде, выглядит следующим образом:
Эти данные будем записывать в индекс ecommerce_customers_outlier_detection. Документы в нём соответствуют строкам указанной выше таблицы, а столбцы — полям в этих документах.
Чтобы просматривать индекс встроенными средствами Kibana, а не только через API, можно включить опцию "Create index template". Тогда соответствующий шаблон отображения индекса будет доступен в Kibana Discovery и при создании дашбордов в Kibana.
Опция "Continuous mode" включит выполнение трансформации в непрерывном режиме. Это обеспечит автоматическое обновление данных в индексе ecommerce_customers_outlier_detection с заданной периодичностью.
Примечание: Функцию транформации можно заменить правилом обработки данных, самостоятельно написанным для корреляционного движка watcher, также являющимся частью Elasticsearch.
{
"_index": "ecommerce_customers_outlier_detection",
"_type": "_doc",
"_id": "QWoH6FA5JvsfN4JjO_LF32QAAAAAAAAA",
"_version": 1,
"_score": 0,
"_source": {
"customer_full_name": {
"keyword": "Abd Adams"
},
"order_id": {
"value_count": 2
},
"products": {
"taxful_price": {
"sum": 98.9765625
},
"quantity": {
"sum": 4
}
}
}
}
Теперь самое интересное — запускаем задачу машинного обучения (job — в терминах Elastic ML). Мастер создания задачи позволяет отфильтровать данные для анализа с использованием встроенных в Elasticsearch языков запросов KQL (Kibana query language) или Lucene.
Здесь же можно посмотреть анализируемые данные, а также наглядно визуализировать данные различных полей на диаграммах рассеяния.
С помощью Advanced configuration параметров создания модели мы можем включить/выключить расчёт степени влияния признаков на модель (Compute feature influence), задать минимальное значение выброса для расчёта этого влияния (Feature influence threshold), а также объём выделенной под модель оперативной памяти (Model memory limit) и количество используемых заданием потоков процессора (Maximum number of threads), тем самым снижая или увеличивая нагрузку на кластер Elasticsearch.
Блок Hyperparameters используется для управления параметрами обучения. Здесь можно выбрать:
- математический алгоритм (Method) обнаружения отклонений (lof, ldof, distance_kth_nn, distance_knn) или использования ансамбля алгоритмов (ensemble), когда значения отклонений определяются путём комбинации и оценки их результатов;
- количество используемых в расчётах соседей (N neighbors);
- переключатель использования предварительной стандартизации значений (Standardization enabled).
Подробнее о параметрах и их значениях можно почитать в референсах на соответствующий эндпоинт API.
На завершающем шаге мастера указываем название и описание для задания, имя целевого индекса для сохранения результатов, имя поля с результатами анализа и необходимость создания шаблона в kibana.
После запуска, задание проходит через этапы:
- создание результирующего индекса и добавление в него исходных данных (reindexing);
- загрузка данных из индекса (loading data);
- анализ данных и расчёт оценок выбросов (analyzing);
- запись значений оценок выбросов в результирующий индекс (writing results).
Результаты работы задания можно подробно рассмотреть через интерфейс Kibana Data frame analytics.
На таблице с результатами анализа видим значение совокупной оценки выброса для каждого заказчика (ml.outlier_score) и оценку влияния признаков по насыщенности цвета соответствующей ячейки. Соответствующее числовое значение оценки сохраняется в служебном индексе с результатами анализа в поле ml.feature_influence.
{
"_index": "ecommerce_customers_outlier_detection_results",
"_type": "_doc",
"_id": "RQzr5SwrcdFVVAr9s9NEOwAAAAAAAAAA",
"_version": 2,
"_score": 1,
"_source": {
"customer_full_name": {
"keyword": "Elyssa Tran"
},
"order_id": {
"value_count": 4
},
"products": {
"taxful_price": {
"sum": 223.9921875
},
"quantity": {
"sum": 5
}
},
"ml__incremental_id": 926,
"ml": {
"outlier_score": 0.9770675301551819,
"feature_influence": [
{
"feature_name": "order_id.value_count",
"influence": 0.9383776783943176
},
{
"feature_name": "products.quantity.sum",
"influence": 0.05973121151328087
},
{
"feature_name": "products.taxful_price.sum",
"influence": 0.0018910884391516447
}
]
}
},
"sort": [
1,
0.9770675301551819
]
}
Графически выбросы отображаются на диаграммах рассеяния. Здесь можно подсвечивать значения выбросов по выбранному порогу оценки.
И включить отображение размера точек в соответствии со значением отклонения.
Примечание: Данные диаграммы разработаны с использованием языка Vega, доступного любому пользователю в конструкторе визуализаций Kibana.
Регрессия и классификация с учителем
Рассмотрим следующий набор функций Data frame analytics — контролируемое обучение (обучение с учителем). Они предоставляют пользователю возможность обучить в Elastic свою собственную модель и использовать её для автоматического предсказания значений. Модель можно загружать и выгружать из системы, а также оценивать её качество. Кроме того, через Eland поддерживается импорт в Elastic моделей, обученных с помощью библиотек scikit-learn, XGBoost или LightGBM. Вместе с возможностями платформы по сбору и обработке данных эти функции помогают реализовать в ней подход CRISP-DM (Cross-Industry Standard Process for Data Mining).
В Elastic две функции обучения с учителем — регрессия и классификация. Если говорить проще, то цель функций — определение неизвестного значения объекта по значениям влияющих на него признаков. В случае регрессии речь идёт о предсказании числового значения, как характеристики объекта, а в случае классификации — об определении класса (группы), к которой относится объект.
Исходными данными (обучающим датасетом) для функции служит массив из уникальных записей (JSON документов). В каждой записи присутствует искомое поле (числовое для регрессии или категориальное для классификации) и поля признаков, влияющих на искомое поле. Значения искомого поля здесь используются для обучения модели и проверки её результатов. Результатом работы функции выступает обученная модель и новый массив данных, включающий исходный датасет, предсказанные значения и данными о степени влияния каждого признака. Датасет при этом можно использовать для оценки качества модели, а саму модель для анализа потока данных, поступающих в Elastic или ранее сохранённых в системе.
В качестве показателей поддерживаются числовые, логические и категориальные типы данных.
Обе функции используют собственные алгоритмы Elastic, построенные на базе градиентного бустинга деревьев решений XGBoost. Также возможно определение важности признаков по методу SHapley Additive exPlanations (SHAP).
Алгоритмы регрессии и классификации применяются для кредитного скоринга, оценки рисков, предсказания стоимости продукции, планирования производственных мощностей, обнаружения вредоносного программного обеспечения, мошеннических действий. Реализация этих функций на базе платформы анализа машинных данных с высокой скоростью сбора, индексации и поиска данных упрощает решение трудоёмких и ресурсоёмких задач, например, обнаружение активности сгенерированных доменов (DGA), анализ удовлетворённости клиентов, определение языка.
Далее разберем примеры использования регрессии и классификации и возможности платформы по интерпретации результатов их работы.
Регрессия
С помощью регрессионного анализа попробуем предсказать продолжительность задержки рейса, на примере из документации Elastic. Для анализа используем метеоданные, данные с табло вылета/прилёта и стоимость билетов.
{
"_index": "kibana_sample_data_flights",
"_type": "_doc",
"_id": "lmX0pHcB6S7rlhJI2kVr",
"_version": 1,
"_score": null,
"_source": {
"FlightNum": "6GZQTCH",
"DestCountry": "IT",
"OriginWeather": "Thunder & Lightning",
"OriginCityName": "Tokyo",
"AvgTicketPrice": 849.1194483923543,
"DistanceMiles": 6127.633563869634,
"FlightDelay": false,
"DestWeather": "Rain",
"Dest": "Pisa International Airport",
"FlightDelayType": "No Delay",
"OriginCountry": "JP",
"dayOfWeek": 2,
"DistanceKilometers": 9861.470310212213,
"timestamp": "2021-02-17T15:41:38",
"DestLocation": {
"lat": "43.683899",
"lon": "10.3927"
},
"DestAirportID": "PI05",
"Carrier": "ES-Air",
"Cancelled": false,
"FlightTimeMin": 493.07351551061066,
"Origin": "Narita International Airport",
"OriginLocation": {
"lat": "35.76470184",
"lon": "140.3860016"
},
"DestRegion": "IT-52",
"OriginAirportID": "NRT",
"OriginRegion": "SE-BD",
"DestCityName": "Pisa",
"FlightTimeHour": 8.217891925176845,
"FlightDelayMin": 0
},
"fields": {
"hour_of_day": [
15
],
"timestamp": [
"2021-02-17T15:41:38.000Z"
]
},
"sort": [
1613576498000
]
}
В данном случае функцию transforms применять не нужно, так как каждый документ датасета содержит данные только об одном полёте, и цель анализа — предсказать задержку в отношении каждого полёта. Но подготовить данные можно — исключим ошибочные записи с расстоянием перелёта 0 километров. В качестве предсказываемого (проверочного) поля указываем FlightDelayMin.
В таблице included Fields выбираем поля признаков длительности задержки рейса, которые будут учтены при построении модели.
Как и при анализе выбросов, зависимости числовых признаков можно визуализировать на диаграмме рассеяния. В данном случае помимо взаимной зависимости параметров интенсивностью цвета на графиках отобразится их соотношение к предсказываемому значению.
Обучение с учителем предполагает возможность проверки результатов предсказаний. Для этого используем исходный датасет, задав пропорцию разделения данных на учебные и тестовые.
Следующий шаг после выбора признаков — настройка параметров.
Advanced configuration:
- количество признаков, для которых в результирующий индекс будет записано значение влияния соответствующего признака на результат предсказания (Feature importance values);
- имя поля, в которое будет записан результат предсказания (Prediction field name);
- лимит на объём используемой заданием оперативной памяти (Model memory limit);
- максимальное количество используемых заданием потоков процессора (Maximum numbers of threads).
Hyperparameters:
- коэффициент регуляризации Лямбда (Lambda);
- максимальное количество деревьев для бустинга (Max trees);
- коэффициент регуляризации Гамма (Gamma);
- размер градиентного шага Эта (Eta);
- доля выборки (Feature bag fraction);
- псевдослучайное число, используемое при выборе из датасета документов для обучения модели (Randomize seed).
Примечание: Описание применения в Elastic этих и дополнительных гиперпараметров приведено в документации к API.
Теперь посмотрим на результаты работы алгоритма. Они записываются в итоговый индекс Elasticsearch и представлены в отчёте в табличном виде.
Здесь можно увидеть новые, по сравнению с датасетом, поля:
- Отметка об использовании данных для обучения (ml.is_training)
- Результаты предсказания задержки рейса (ml.FlightDelayMin_prediction)
Если при создании задания было указано количество признаков, для которых будет рассчитано значение их влияния на результат (Feature importance values), в таблице отобразятся соответствующие значения для каждого признака (ml.feature_importance), а в результатах — бар-чарт средних значений по всему датасету.
При клике на поле ml.feature_importance увидим наглядный график принятия решения алгоритмом SHAP.
Точкой обозначено среднее значение прогнозов для всего датасета. Линией соединены значения степени влияния признаков, от меньшего к большему. Верхний признак сильнее всего влияет на решение, в нашем примере это причина задержки рейса (FlightDelayType).
Например, в Kibana Lens. Ниже построен бар-чарт фактических и предсказанных задержек рейсов с разбивкой по погоде в пункте назначения.
Кроме индекса с предсказанными моделью значениями, основным результатом выполнения задания также является обученная модель. Выгрузить модель из Elastic в JSON файл позволяет эндпоинт trained_models, как указано здесь.
В этом же отчете можно увидеть метрики качества модели:
- среднеквадратическая ошибка (Mean Squared Error, MSE);
- коэффициент детерминации (R-squared, R2 );
- псевдо-функция потерь Хьюбера (Pseudo-Huber loss);
- среднеквадратичная логарифмическая ошибка (Mean squared logarithmic error, MSLE).
Метрики качества считаются отдельно, как для используемых при обучении данных, так и для тестовой выборки, что позволяет оценить применимость модели для новых, не используемых при обучении данных.
После того как модель сформирована, она может применяться для предсказания значений по новым данным. Для этого в Elasticsearch есть две возможности:
- анализ поступающих в Elasticsearch данных (Inference processor);
- анализ ранее сохранённых в Elasticsearch данных (Inference aggregation).
POST /_ingest/pipeline/_simulate
{
"pipeline" : {
"description" : "Flight delay prophecy",
"processors" : [
{
"inference": {
"model_id":"flights_delay_prophecy-1613827670191",
"inference_config": {
"regression": {
"results_field": "FlightDelayMin_prediction"
}
}
}
}
]
},
"docs": [
{
"_index": "index",
"_id": "id",
"_source": {
"FlightNum" : "9HY9SWR",
"Origin" : "Frankfurt am Main Airport",
"OriginLocation" : {
"lon" : "8.570556",
"lat" : "50.033333"
},
"DestLocation" : {
"lon" : "151.177002",
"lat" : "-33.94609833"
},
"DistanceMiles" : 10247.856675613455,
"FlightTimeMin" : 1030.7704158599038,
"OriginWeather" : "Sunny",
"dayOfWeek" : 0,
"AvgTicketPrice" : 841.2656419677076,
"Carrier" : "Kibana Airlines",
"FlightDelayMin" : 0,
"OriginRegion" : "DE-HE",
"FlightDelayType" : "No Delay",
"DestAirportID" : "SYD",
"timestamp" : "2021-02-08T00:00:00",
"Dest" : "Sydney Kingsford Smith International Airport",
"FlightTimeHour" : 17.179506930998397,
"DistanceKilometers" : 16492.32665375846,
"OriginCityName" : "Frankfurt am Main",
"DestWeather" : "Rain",
"OriginCountry" : "DE",
"DestCountry" : "AU",
"DestRegion" : "SE-BD",
"OriginAirportID" : "FRA",
"DestCityName" : "Sydney"
}
}
]
}
GET kibana_sample_data_flights/_search
{
"size":0,
"query": {
"term": {
"FlightNum": {
"value": "00HGV4F"
}
}
},
"aggs": {
"res": {
"composite": {
"size": 1,
"sources": [
{
"FlightNum": {
"terms": {
"field": "FlightNum"
}
}
}
]
},
"aggs" : {
"AvgTicketPrice": {
"max": {
"field": "AvgTicketPrice"
}
},
"Dest": {
"scripted_metric": {
"init_script": "state.Dest = ''",
"map_script": "state.Dest = params._source.Dest",
"combine_script": "return state.Dest",
"reduce_script": "for (d in states) if (d != null) return d"
}
},
"DestAirportID": {
"scripted_metric": {
"init_script": "state.DestAirportID = ''",
"map_script": "state.DestAirportID = params._source.DestAirportID",
"combine_script": "return state.DestAirportID",
"reduce_script": "for (d in states) if (d != null) return d"
}
},
"DestRegion": {
"scripted_metric": {
"init_script": "state.DestRegion = ''",
"map_script": "state.DestRegion = params._source.DestRegion",
"combine_script": "return state.DestRegion",
"reduce_script": "for (d in states) if (d != null) return d"
}
},
"DistanceKilometers": {
"max": {
"field": "DistanceKilometers"
}
},
"DistanceMiles": {
"max": {
"field": "DistanceMiles"
}
},
"FlightDelayType": {
"scripted_metric": {
"init_script": "state.FlightDelayType = ''",
"map_script": "state.FlightDelayType = params._source.FlightDelayType",
"combine_script": "return state.FlightDelayType",
"reduce_script": "for (d in states) if (d != null) return d"
}
},
"FlightTimeMin": {
"max": {
"field": "FlightTimeMin"
}
},
"Origin": {
"scripted_metric": {
"init_script": "state.Origin = ''",
"map_script": "state.Origin = params._source.Origin",
"combine_script": "return state.Origin",
"reduce_script": "for (d in states) if (d != null) return d"
}
},
"OriginAirportID": {
"scripted_metric": {
"init_script": "state.OriginAirportID = ''",
"map_script": "state.OriginAirportID = params._source.OriginAirportID",
"combine_script": "return state.OriginAirportID",
"reduce_script": "for (d in states) if (d != null) return d"
}
},
"OriginRegion": {
"scripted_metric": {
"init_script": "state.OriginRegion = ''",
"map_script": "state.OriginRegion = params._source.OriginRegion",
"combine_script": "return state.OriginRegion",
"reduce_script": "for (d in states) if (d != null) return d"
}
},
"FlightDelayMin_prediction" : {
"inference": {
"model_id": "flights_delay_prophecy-1613827670191",
"buckets_path": {
"AvgTicketPrice": "AvgTicketPrice",
"Dest": "Dest.value",
"DestAirportID": "DestAirportID.value",
"DestRegion": "DestRegion.value",
"DistanceKilometers": "DistanceKilometers",
"DistanceMiles": "DistanceMiles",
"FlightDelayType": "FlightDelayType.value",
"FlightTimeMin": "FlightTimeMin",
"Origin": "Origin.value",
"OriginAirportID": "OriginAirportID.value",
"OriginRegion": "OriginRegion.value"
}
}
}
}
}
}
}
Классификация
Продолжим тему полетов и проанализируем данные об авиарейсах, предсказывая не длительность задержки, как в регрессии, а факт отмены рейса. Используем датасет из предыдущего примера, трансформация в агрегированный индекс здесь тоже не требуется.
Порядок действий по созданию задания классификации совпадает с регрессионным анализом, только проверочным полем будет Cancelled.
Как и в предыдущих типах анализа, для числовых полей можно построить диаграммы рассеяния, при этом соответствующие значениям классы, в нашем случае true и false, выделяются цветом.
Остальные шаги аналогичны алгоритму регрессионного анализа, доступные в интерфейсе параметры тоже совпадают. Но возможности настройки задания ими не ограничиваются, через API доступных для редактирования гиперпараметров будет больше.
После завершения задачи можно оценить результаты предсказания отмены рейса.
В таблице результатов данные датасета дополнены полями:
- отметка об использовании данных для обучения (ml.is_training);
- предсказанный статус отмены рейса (ml.Cancelled_prediction);
- вероятность предсказания (ml.prediction_probability);
- влияние признаков на результат (ml.feature_importance);
- оценка предсказания для всех искомых классов (ml.prediction_score).
"top_classes": [
{
"class_probability": 0.9617513617353418,
"class_score": 0.24080996012552122,
"class_name": false
},
{
"class_probability": 0.03824863826465814,
"class_score": 0.03824863826465814,
"class_name": true
}
]
В понимании параметров оценки поможет документация Elastic.
Как и в регрессии, в результатах доступен график усреднённых значений важности признаков.
Для проверки результатов в классификации доступны следующие метрики:
- матрица ошибок (Confusion matrix);
- площадь кривой ошибок (area under receiver operating characteristic curve, AUC ROC).
Матрица ошибок визуализируется на дашборде с результатами выполнения задания и отображает доли верных, ложноположительных и ложноотрицательных предсказаний для каждого класса.
Кривая ошибок и значение площади AUC ROC в версии 7.11 не отображается, но значения можно получить через API. В 7.12 такая возможность уже будет добавлена.
POST _ml/data_frame/_evaluate
{
"index": "cancelled_flights_prediction_2",
"evaluation": {
"classification": {
"actual_field": "Cancelled",
"predicted_field": "ml.Cancelled_prediction",
"metrics": {
"auc_roc": {
"class_name": "true"
}
}
}
}
}
{
"classification" : {
"auc_roc" : {
"value" : 0.8240223547611558
}
}
}
Сохранённая модель доступна для использования в Inference processor и Inference aggregation, как в предыдущем примере.
Заключение
В заключение отметим, что функции машинного обучения в составе платформы Elastic могут использоваться для решения множества прикладных задач в самых разных отраслях, потенциал их применения только предстоит раскрыть.
В будущем переход от бета-тестирования к релизным версиям описанных алгоритмов должен позволить анализировать большие потоки данных и может стать полезным инструментом для аналитиков центров мониторинга кибербезопасности, ИТ-инфраструктуры, приложений и бизнес-процессов.
Уже сейчас платформа даёт возможность ознакомиться и попробовать на практике технологии машинного обучения как искушённым аналитикам, так и инженерам без специальных знаний.