OneClassSVM的不稳定行为通过更改' nu'

时间:2018-02-15 14:50:56

标签: scikit-learn svm outliers anomaly-detection

在上面的示例中,我使用我的数据集来识别异常值。在对nu参数进行细微更改后,识别出的异常数量存在巨大差异。

One class SVM

这可能只是数据集的特殊性吗?或scikit-learn中的错误?

P.S。不幸的是我无法共享数据集。

2 个答案:

答案 0 :(得分:1)

注意:不是答案。提供 MCVE。

我最近也遇到了这个。我想了解低值处的拐点

import numpy as np
import pandas as pd
from sklearn.svm import OneClassSVM

X = np.random.rand(100, 1)

nu = np.geomspace(0.0001, 1, num=100)
df = pd.DataFrame(data={'nu': nu})

for i in range(0, len(X)):
    df.loc[i, 'anom_count'] = (OneClassSVM(nu=df.loc[i, 'nu']).fit_predict(X) == -1).sum()

df.set_index('nu').plot();

enter image description here

df.set_index('nu').plot(xlim=(0, 0.2));

enter image description here

df.anom_count.min() # 3
df.anom_count.idxmin() # 62
df.loc[df.anom_count.idxmin(), 'nu'] # 0.031

答案 1 :(得分:1)

如果降低 tolOneClassSVM 参数的值,结果会更好,尽管对于低 nu 值并不完全符合预期。

import numpy as np
from sklearn.svm import OneClassSVM

import matplotlib.pyplot as plt

X = np.random.rand(100, 1)
nus = np.geomspace(0.0001, 0.5, num=100)

outlier_fraction = np.zeros(len(nus))
for i, nu in enumerate(nus):
    outlier_fraction[i] = (OneClassSVM(nu=nu, tol=1e-12).fit_predict(X) == -1).mean()

plt.plot(nus, outlier_fraction)
plt.xlabel('nu')
plt.ylabel('Outlier fraction')
plt.show()

nu_small_tol

使用默认的 tol,您将获得以下内容 enter image description here