Я получаю значения 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, а для других - нет.