Scikit learn 基于scikit学习的一类SVM偏态数据离群点检测

Scikit learn 基于scikit学习的一类SVM偏态数据离群点检测,scikit-learn,svm,Scikit Learn,Svm,我正在使用带有scikit学习的一类SVM检测数据集中的异常值。我将试着用一个例子来解释我的问题: 想象一个具有高度和性能特征的简单数据集(这只是一个简化,我的数据集要大得多)。我想检测的是当这两个特性之间存在奇怪的组合时的异常值,例如: h - height p - performance h p class ---------- 10 0.1 1 12 0.5 1 20 3.2 1 24

我正在使用带有scikit学习的一类SVM检测数据集中的异常值。我将试着用一个例子来解释我的问题:

想象一个具有高度和性能特征的简单数据集(这只是一个简化,我的数据集要大得多)。我想检测的是当这两个特性之间存在奇怪的组合时的异常值,例如:

h - height
p - performance

h p class
----------
10       0.1         1

12       0.5         1

20       3.2         1

24       2.9         1

23       0.4        -1

...
我正在扩展数据集,我正在使用这样的配置来训练和检测异常值:

clf = svm.OneClassSVM(kernel="rbf", nu=0.01, gamma=0.01)
当我的数据集成比例时,就没有问题了。但是,当数据集以以下方式倾斜时,我有一个问题:

  • 所有高度都在3或4左右,但10左右的高度在0左右。 然后oneclass SVM选择10左右的高度作为异常值,而不是选择高度30和性能0.2等值
我已经解决了训练2个SVM将高度分成两组的问题(一个数据集中的高度约为10,另一个数据集中的高度约为10)


有没有一种方法可以在不拆分数据集的情况下解决它?

你应该考虑缩放数据和改变伽玛。用2d绘制数据,看看结果是否有意义。@AndreasMueller谢谢你的回答。然而,我展示的数据只是一个例子。我的真实数据有更多的特征,因此,我想在2d中绘图并不能真正看到问题。我已经在训练前缩放了数据。当您建议更改gamma时,是朝哪个方向?我一直在使用不同的值,结果保持不变。你是如何缩放数据的?使用MinMaxScaler或StandardScaler会很好,gamma的默认值可能会起作用。通常对于RBF核,我会用网格搜索gamma和C,但如果你没有任何基本事实,那就很难了。顺便说一句,如果你说你有更多的功能,我不明白你的观察是如何应用的。你对价值观非常具体。你在高维空间的观察结果是什么?@AndreasMueller,我认为你说问题在于伽马的选择是正确的。我希望我能在这里画出一些视觉测试,向其他有同样怀疑的人解释我的结论。谢谢你的提示!