Описание задачи Хакатона по идентификации аномалий

в данных волномерного буя Spotter, полученных в экспедиции АИ-63 Института океанологии РАН (29.09.2022 - 05.12.2022).

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

outliers_classification.ipynb - решение в подходе классификации с использованием модели Random Forests

outliers_detection_LR_model.ipynb - решение в подходе идентификации аномалий по ошибке линейной авторегрессионной модели

outliers_detection_RF_model.ipynb - решение в подходе идентификации аномалий по ошибке авторегрессионной модели на базе модели машинного обучения Random Forests

outliers_detection_dummy_model.ipynb - примитивные решения для оценки минимального разумного уровня меры качества

import numpy as np
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pickle
from tqdm import tqdm_notebook
from sklearn.metrics import f1_score
with open('./public_bouy_data.pkl', 'rb') as f:
    data = pickle.load(f)
len(data)
40
with open('./public_bouy_target.pkl', 'rb') as f:
    targets = pickle.load(f)
data[0].shape
(8693, 5)
targets[0].shape
(8693,)

Отобразим данные

# item = np.random.randint(len(data))
item=23
# start = np.random.randint(data[item].shape[0]-200)
start = 6090
data[item].head()
dx dy dz t station
0 -0.447491 0.609415 1.05373 1.665209e+09 0606_4339
1 -0.062228 0.528534 1.28533 1.665209e+09 0606_4339
2 0.360255 0.337573 1.59773 1.665209e+09 0606_4339
3 0.730211 0.018035 1.70275 1.665209e+09 0606_4339
4 0.983110 -0.428559 1.69486 1.665209e+09 0606_4339
displacements = data[item][['dx','dy','dz']].values
displacements.shape
(6751, 3)
f = plt.figure(figsize=(6,4), dpi=300)
plt.scatter(np.arange(200), displacements[start:start+200, 1], s=3)
plt.xlabel('tick number')
plt.ylabel('bouy displacement, m');

png

На диаграмме выше виден участок временного ряда измерений волномерного буя Spotter из экспедиции АИ-63, которая проходила с 29 сентября по 5 декабря 2022 г.

Измерения производятся заходами по 25-60 минут, за которые с буя получаются ряды измерений смещения по трем координатам.

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

Задача, которую следует решить - найти такие аномалии с применением методов машинного обучения.

Мера качества в задаче - F1-score

Precision:

$$ P = \frac{TP}{TP+FP} $$

Recall:

$$ R = \frac{TP}{TP+FN} $$

F-score:

$$ F_{\beta} = (1+\beta^2)\frac{PR}{\beta^2P + R} $$

F1-score:

$$ F_1 = 2\frac{PR}{P+R} = \frac{2TP}{2*TP+FP+FN} $$

Вычисление меры F1-score

from sklearn.metrics import f1_score
pred_targets = ...

### BLAH BLAH BLAH computing pred_targets

### pred_targets: одномерный бинарный массив numpy,
###               по размеру совпадающий с массивом целевой переменной разметки аномалий true_targets
pred_targets = np.concatenate(pred_targets)
pred_targets.shape
(234482,)
true_targets = np.concatenate(targets)
true_targets.shape
(234482,)
f1_score(true_targets, pred_targets)
0.3687473147977659

Оценка качества на тестовой выборке

Тестовая выборка хранится у организатора соревнования.

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

Первичная проверка:

  • результатом должен быть массив numpy, то есть, результат операции type() на этом массиве должен выдавать numpy.ndarray.

Например, вот так:

type(pred_targets_test)
numpy.ndarray
  • массив должен быть размером 136430 значений
  • массив должен быть одномерным, то есть, атрибут .shape должен выдавать следующий результат: (136430,)

например, вот так:

pred_targets_test.shape
(136430,)
  • массив должен содержать бинарные значения (тип bool), то есть, атрибут .dtype этого массива должен выдавать dtype('bool')
pred_targets_test.dtype
dtype('bool')

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

with open('./pred_targets_test.pkl', 'wb') as f:
    pickle.dump(pred_targets_test, f)