为什么我的 SVM 不能学习一系列重复元素

数据挖掘 Python scikit-学习 支持向量机
2022-02-22 17:11:35

我最近开始使用 SVM 进行一类分类,我能够从真实数据中得到一些合理的分类,但是当我遇到这个例子时,我试图优化 nu 和 gamma 参数:

在下面的代码中,我用一组 1 训练一个 SVM,然后我呈现相同的一组 1 进行分类,并将所有的都分类为异常值。

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

nu = 0.01
gamma = 1
ones = pd.DataFrame(np.ones(100))
clf = svm.OneClassSVM(nu=nu, kernel="rbf", gamma=gamma)
clf.fit(ones)
ones["predicted"] = clf.predict(ones)
#Returns -1 for all entries

我的问题是:为什么会发生这种情况?我认为这些数据对于任何参数配置都是微不足道的。

1个回答

您面临的是一个很小但至关重要的定义差异:

新奇检测:

训练数据没有被异常值污染,我们有兴趣在新的观察中检测异常。

异常值检测:

训练数据包含异常值,我们需要拟合训练数据的中心模式,忽略偏差观察。

OneClassSVM 是一种无监督异常值检测。因此,您的数据需要有异常值才能让算法检测到它们。我最好的猜测,为什么它预测每个输入都是异常值,如果没有真正的异常值,那么一切都必须是异常值。

让我快速演示一下。我将内核调整为线性

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

nu = 0.5
gamma = 1.0
ones= pd.DataFrame(np.ones(100))

clf = svm.OneClassSVM(nu=nu, kernel="linear", gamma=gamma)
clf.fit(ones)
clf.predict(-1) # -1
clf.predict(1) # -1
clf.predict(1.00001) # 1
clf.predict(2) # 1
clf.predict(10) # 1