Насколько различны реальные выбросы с PyOD?

#python #sample #outliers

#python #пример #выбросы

Вопрос:

Я работаю над проектом обнаружения аномалий в записи сведений о вызове для телефонного оператора, я подготовил выборку из 10000 наблюдений и 80 измерений, которые представляют совокупность наблюдений за день трафика, данные представлены следующим образом:

введите описание изображения здесь

это небольшая часть всего набора данных.

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

 from pyod.models.knn import KNN
knn= KNN(contamination= 0.1)
result = knn.fit_predict(conso)
  

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

 from sklearn.manifold import TSNE
result_f = TSNE(n_components = 2).fit_transform(df_final_2)
result_f = pd.DataFrame(result_f)
color= ['red' if row == 1 else 'blue' for row in result_list]
  

‘df_final_2’ — это версия фрейма данных ‘conso’.

затем я раскрасил все это в нужные цвета:

 import matplotlib.pyplot as plt
plt.scatter(result_f[0],result_f[1], s=1, c=color)
  

введите описание изображения здесь

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

Спасибо.

Ответ №1:

Есть несколько вещей, которые нужно проверить:

  • используя knn, lof и аналогичные модели, которые основаны на измерениях расстояния, данные должны быть сначала стандартизированы (с использованием sklearn StandardScaler)
  • tsne теперь может работать в этом случае, и уменьшение размерности может быть отключено
  • возможно, не используйте fit_predict, но сделайте это (используйте y_train_pred):
     # train kNN detector
    clf_name = 'KNN'
    clf = KNN(contamination=0.1)
    clf.fit(X)

    # get the prediction labels and outlier scores of the training data
    y_train_pred = clf.labels_  # binary labels (0: inliers, 1: outliers)
    y_train_scores = clf.decision_scores_  # raw outlier scores
  

Если ничего из этого не сработает, не стесняйтесь открыть отчет о проблеме на GitHub, и мы проведем дальнейшее расследование.