Как предотвратить использование NaN в решениях для определения углового выброса в PyOd - PullRequest
0 голосов
/ 07 мая 2019

Я получаю значения nan в качестве оценок при использовании Углового детектора выбросов, из-за которого выбросы не обнаруживаются.

from pyod.models.abod import ABOD
from sklearn.preprocessing import MinMaxScaler

def outlier_ABOD(data, outliers_fraction=0.1):
    data = np.array([data]).reshape(-1, 1)

    scaler = MinMaxScaler(feature_range=(0, 1))
    data = scaler.fit_transform(data)

    clf = ABOD(contamination=outliers_fraction)
    clf.fit(data)
    y_pred = clf.predict(data)

    print(clf.decision_scores_)

    return np.where(y_pred)[0]

X1 = np.array([1,1,3,2,1,2,1,2,3,2,1,88,1234,8888,1,2,3,2])
outliers = outlier_ABOD(X1, 0.1)

ВЫВОД:

Decision Scores: [            nan             nan -0.00000000e+00             nan
             nan             nan             nan             nan
 -0.00000000e+00             nan             nan -5.77145973e+03
 -3.60509466e+00 -6.08142776e-03             nan             nan
 -0.00000000e+00             nan]

Outliers: array([], dtype=int64)

Итак, если вы видите выходные данные, есть некоторые значения NaN, из-за которых clf.threshold_ также NaN . Следовательно, clf не может обнаружить выбросы при использовании метода clf.predict , а clf.predict () возвращает все нули, указывающие, что нет выбросов, но на самом деле есть выбросы. Как это предотвратить?

EDIT: Когда я принял за другое значение X1

X1 = np.array([3,2,1,88,9,7, 90, 1, 2, 3, 1, 98, 8888])
outliers = outlier_ABOD(X1, 0.1)

Выводится на экран

Decision scores: [-3.14048147e+14 -5.54457418e+15 -3.46535886e+14 -1.58233289e+12
 -4.38660405e+12 -4.02831074e+13 -2.36040501e+12 -3.46535886e+14
 -5.54457418e+15 -3.14048147e+14 -3.46535886e+14 -7.76901896e+10
 -3.35886302e-05]

Outliers: array([   1,    1,    1,   98, 8888])

Таким образом, для первого значения X1 в оценочных решениях присутствуют NaN, и, следовательно, он не может давать выбросы, а для второго значения X1 в оценочных решениях нет NaN, и, следовательно, он способен генерировать выбросы. Теперь я не мог понять, почему для некоторых значений X1 он дает выходы NaN, а для других - нет.

Ответы [ 2 ]

1 голос
/ 08 мая 2019

По какой-то причине я не чувствую, что ABOD работает в вашем случае, так как все баллы - NaN или zeors (близко к 0).Я чувствую, что есть некоторые другие проблемы, а не NaN.Вы также пробовали другие модели, например, Isolation Forest?

Извините, у меня недостаточно очков для добавления комментария.

0 голосов
/ 10 мая 2019

Я воспроизвожу тот же результат на моем компьютере.Я иду ту же ошибку и решил ее.

В вашем случае, ответ не используйте быстрый метод.выбор «по умолчанию».
В последнее время я занимаюсь общим проектом интеграции обнаружения выбросов, поэтому рассмотрим несколько многомерных и высокоразмерных алгоритмов обнаружения выбросов.Изолированный лес - мой любимый.приемлемая точность и почти быстрая скорость.ABOD или другие алгоритмы, связанные с соседями, слишком сложны и медленны в использовании.Хотя ABOD или другие имеют трюки, такие как быстрый режим, но они основаны на конкретном предположении.

from pyod.models.abod import ABOD
from sklearn.preprocessing import MinMaxScaler,Normalizer,StandardScaler

def outlier_ABOD(data, outliers_fraction=0.1):
    data = np.array([data]).reshape(-1, 1)

    scaler = MinMaxScaler(feature_range=(0,1))
    #scaler = StandardScaler()
    data = scaler.fit_transform(data)

    clf = ABOD(contamination=outliers_fraction,method='default')
    clf.fit(data)
    y_pred = clf.predict(data)

    print(clf.decision_scores_)

    return np.where(y_pred)[0]

X1 = np.array([1,1,3,2,1,2,1,2,3,2,1,88,1234,8888,1,2,3,2])
X2 = np.array([3,2,1,88,9,7, 90, 1, 2, 3, 1, 98, 8888])
X1_outliers = outlier_ABOD(X1, 0.1)
X2_outliers = outlier_ABOD(X2, 0.1)
print(X1_outliers,X2_outliers)




[ -9.76962477e+14  -9.76962477e+14  -7.22132612e+14  -3.40246589e+15  
 -9.76962477e+14  -3.40246589e+15  -9.76962477e+14  -3.40246589e+15   -7.22132612e+14  -3.40246589e+15  -9.76962477e+14  -2.15972387e+07   -3.86731597e+02  -2.68433994e-03  -9.76962477e+14  -3.40246589e+15   -7.22132612e+14  -3.40246589e+15] [ -3.11767543e+14  -1.15742730e+15  -2.45343660e+14  -2.67101787e+11   -3.15072697e+12  -1.01170976e+13  -3.98826857e+11  -2.45343660e+14   -1.15742730e+15  -3.11767543e+14  -2.45343660e+14  -1.51894970e+10   -3.51433434e-05] 
[12 13] [11 12]
...