Как предотвратить NaN в оценках решения детектора выбросов на основе угла в PyOd

Я получаю значения 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 () возвращает все нули, указывающие на отсутствие выбросов, но на самом деле выбросы есть. Как этого избежать?

РЕДАКТИРОВАТЬ: Когда я принял другое значение 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, а для других - нет.


person Surya Prakash Reddy    schedule 07.05.2019    source источник
comment
сначала используйте функцию numpy или pandas fillna (). значение заполнения зависит от понимания данных. Пока нет бесплатной догадки.   -  person Yong Wang    schedule 07.05.2019
comment
Если вы говорите, что я должен заполнить NaN в clf.decision_scores_, мой вопрос будет заполнен чем? и почему?   -  person Surya Prakash Reddy    schedule 08.05.2019
comment
нет свободной догадки. использовать отраслевые знания или опыт или пробовать среднее, медианное, конкретное значение и т. д. - это трудоемкая и грязная работа.   -  person Yong Wang    schedule 08.05.2019
comment
@YongWang Пожалуйста, проверьте раздел РЕДАКТИРОВАНИЕ и запросите ваши комментарии по этому поводу.   -  person Surya Prakash Reddy    schedule 09.05.2019


Ответы (2)


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

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

person Yue Zhao    schedule 08.05.2019
comment
Эй, проверьте часть EDIT в моем вопросе. Я не пробовал другие модели, но у этой модели есть проблемы с некоторыми специфическими входами. Для некоторых значений он дает NaN в оценках решения, а для других значений не дает NaN. Я не мог понять причину этого. - person Surya Prakash Reddy; 09.05.2019
comment
Привет, Юэ Чжао. Приятно встретить вас где угодно. Zhihu, github и stackoveflow. Выглядит PyOD, ты, сын, такой горячий. - person Yong Wang; 10.05.2019
comment
Привет Ён. Я тоже рад тебя здесь видеть. Извините, у меня недостаточно очков, чтобы проголосовать за ваш ответ. спасибо, что исследовали это, так как меня так много ловят :( - person Yue Zhao; 10.05.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]
person Yong Wang    schedule 10.05.2019
comment
Спасибо за ваш ответ. Я пробовал использовать "по умолчанию", но проблема в том, что временная сложность "по умолчанию" составляет O (n ^ 3). У меня 10 000 строк в моем наборе данных, и для этих почти 10 000 секунд потребуется огромное количество времени, которого следует определенно избегать, поэтому я пытаюсь использовать «быстрый» метод. Нет ли для этого решения? Вы также сказали, что они основаны на определенных предположениях .. Вы можете сказать мне, что это за предположения? - person Surya Prakash Reddy; 10.05.2019
comment
ну, что касается предположения, вы можете прочитать статью напрямую. Что касается производительности, почему бы не попробовать изолированный лес. - person Yong Wang; 10.05.2019
comment
Лучше вам напрямую прочитать статью об алгоритме или проконсультироваться с автором Pyod YueZhao. Раньше я читал газету и отказывался от ABOD по этой причине, но сейчас не могу найти газету - person Yong Wang; 10.05.2019
comment
@YongWang Могу я обратить ваше внимание на мои question, поскольку вы знакомы с концепцией обнаружения выбросов. - person Mario; 30.07.2020