如何减少python sklearn中OneClassSVM中的异常值?

时间:2019-06-03 04:09:15

标签: python scikit-learn outliers

我正在如下使用oneclasssvm。

from sklearn.svm import OneClassSVM

clf = OneClassSVM(random_state=42)
clf.fit(X)
y_pred_train = clf.predict(X)

print(len(np.where(y_pred_train == -1)[0]))

但是,我获得了超过50%的数据作为异常值。我想知道是否有一种方法可以减少一个类svm中离群值的数量。

我尝试了contamination。但是,似乎oneclasssvm不支持污染。

还有其他方法可以使用吗?

很高兴在需要时提供更多详细信息。

2 个答案:

答案 0 :(得分:2)

您可以通过控制OneClassSVM的nu参数来控制训练数据中有多少数据点被标记为离群值。

根据API文档,nu是An upper bound on the fraction of training errors and a lower bound of the fraction of support vectors. Should be in the interval (0, 1]. By default 0.5 will be taken.

我建议您有一个标记的验证集,然后调整您的SVM超参数,例如nukernel等,以在标记的验证集上获得最佳性能。

答案 1 :(得分:1)

我想了解您使用的方差,维数,样本点数量,但我的第一个建议是尝试:

clf = OneClassSVM(random_state=42, gamma='scale')

Docs

  

当前默认值为“自动”,如果gamma ='scale',则使用1 / n_features   传递,然后使用1 /(n_features * X.var())作为伽玛值。   当前的伽玛默认值“ auto”将在以下位置更改为“ scale”   版本0.22。 “ auto_deprecated”,不赞成使用的“ auto”版本是   用作默认值,指示没有显式的gamma值   通过。