Python 如何防止PyOd中基于角度的离群点检测器的决策得分出现NaN

Python 如何防止PyOd中基于角度的离群点检测器的决策得分出现NaN,python,data-science,outliers,anomaly-detection,Python,Data Science,Outliers,Anomaly Detection,当使用基于角度的异常值检测器时,我将nan值作为决策分数,因为没有检测到异常值 从pyod.models.abod导入abod 从sklearn.preprocessing导入MinMaxScaler def异常值(数据,异常值分数=0.1): data=np.数组([data])。重塑(-1,1) scaler=MinMaxScaler(功能范围=(0,1)) 数据=缩放器.拟合变换(数据) clf=ABOD(污染=异常值\分数) clf.fit(数据) y_pred=clf.predict(

当使用基于角度的异常值检测器时,我将nan值作为决策分数,因为没有检测到异常值

从pyod.models.abod导入abod
从sklearn.preprocessing导入MinMaxScaler
def异常值(数据,异常值分数=0.1):
data=np.数组([data])。重塑(-1,1)
scaler=MinMaxScaler(功能范围=(0,1))
数据=缩放器.拟合变换(数据)
clf=ABOD(污染=异常值\分数)
clf.fit(数据)
y_pred=clf.predict(数据)
打印(clf.决策评分)
返回np.where(y_pred)[0]
X1=np.数组([1,1,3,2,1,2,2,3,2,1,8812348888,1,2,3,2])
离群值=离群值(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_uu也是NaN。因此,当使用clf.predict方法时,clf无法检测到异常值,而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输出,而有些则不会。

出于某种原因,我觉得ABOD在您的情况下不起作用,因为所有分数都是NaN或zeors(接近0)。我觉得还有其他一些问题,而不是NaN。您是否也尝试过其他模式,例如隔离林


很抱歉,我没有足够的分数发表评论。

我在我的计算机上复制了相同的结果。我也犯了同样的错误并解决了它

在您的情况下,答案是不要使用快速方法。选择“默认值”。
最近,我做了一个通用的离群点检测集成项目,所以我研究了一些多维和高维离群点检测算法。与世隔绝的森林是我最喜欢的。可接受的精度和几乎最快的速度。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]

首先使用numpy或fillna()函数。填充值取决于对数据的洞察理解。还没有自由的预感。如果你说我应该在clf.decision_分数中填入NaN,我的问题是填入什么?为什么?没有自由的预感。使用行业知识或经验,或尝试平均值、中值、特定值等。这既耗时又肮脏。@YongWang请检查编辑部分并征求您的意见。嘿,检查我问题中的编辑部分。我没有尝试其他模型,但该模型在某些特定输入方面存在问题。对于某些值,它在决策得分中给出了NaN,而对于其他值,它没有给出NaN。我不明白这背后的原因。嗨,赵悦。很高兴在任何地方见到你。智湖、github和stackoveflow。看起来派德,你的儿子很性感。嘿,勇。很高兴在这里见到你。对不起,我没有足够的分数来支持你的回答。谢谢你的探究,因为我被很多事情吸引住了:(谢谢你的回答。我试过在中使用'default',但问题是'default'的时间复杂性是O(n^3)。我的数据集中有10000行,这将花费大量时间来完成这近10000秒的任务,这是我尝试使用“快速”方法的原因。没有任何解决方案吗?你也说过“它们基于特定的假设。”.你能告诉我这些假设是什么吗?好吧,关于假设,你可以直接阅读论文。关于性能,为什么不试试孤立森林。最好你直接阅读算法的论文,或者与pyod作者YueZhao核实一下。我以前读过论文,因此放弃了ABOD,但找不到论文now@YongWang请注意我的问题,因为您对异常值检测概念感兴趣。