Дополнительные нули добавлены в матрицу путаницы, делая ее 3х3 вместо 2х2, используя IsolationForest для обнаружения аномалий - PullRequest
1 голос
/ 12 апреля 2020

Я использую приведенный ниже код для прогнозирования обнаружения аномалий. Это двоичная классификация, поэтому матрица путаницы должна быть 2x2, а не 3x3. Есть дополнительные нули в Т-образной форме. Подобные вещи произошли с использованием OneClassSVM несколько недель назад, но я подумал, что делаю что-то не так. Не могли бы вы помочь мне исправить это?

import numpy as np
import pandas as pd
import os
from sklearn.ensemble import IsolationForest
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report 
from sklearn import metrics
from sklearn.metrics import roc_auc_score

data = pd.read_csv('opensky_train.csv')

#to make sure that normal data contains no anomaly
sortedData = data.sort_values(by=['class'])
target = pd.DataFrame(sortedData['class'])

Y = target.replace(['surveill', 'other'], [1,0])
X = sortedData.drop(['class'], axis = 1)

x_normal = X.iloc[:200,:]
y_normal = Y.iloc[:200,:]
x_anomaly = X.iloc[200:,:]
y_anomaly = Y.iloc[200:,:]

Отредактировано:

column_values = y_anomaly.values.ravel()
unique_values =  pd.unique(column_values)
print(unique_values)

Вывод: [0 1]

clf = IsolationForest(random_state=0).fit(x_normal)
pred = clf.predict(x_anomaly)

print(pred)

Вывод: [1 1 1 1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 -1 1 1 -1 1 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 -1]

#printing the results 
print(confusion_matrix(y_anomaly, pred))
print (classification_report(y_anomaly, pred))  

Результат:

Confusion Matrix :
[[ 0  0  0]
 [ 7  0 60]
 [12  0 28]]
              precision    recall  f1-score   support

          -1       0.00      0.00      0.00         0
           0       0.00      0.00      0.00        67
           1       0.32      0.70      0.44        40

    accuracy                           0.26       107
   macro avg       0.11      0.23      0.15       107
weighted avg       0.12      0.26      0.16       107

1 Ответ

1 голос
/ 12 апреля 2020

Выбросы помечены 1, а выбросы - -1

Источник: scikit-learn Обнаружение аномалий и выбросов .

Ваш пример преобразовал классы в 0,1 - три возможных варианта -1,0,1

. Вам нужно изменить значение с

Y = target.replace(['surveill', 'other'], [1,0])

на

Y = target.replace(['surveill', 'other'], [1,-1])
...