【问题标题】:Confused about sklearn’s implementation of OSVM对 sklearn 的 OSVM 实现感到困惑
【发布时间】:2018-09-27 04:12:43
【问题描述】:
我最近开始尝试使用 OneClassSVM(使用 Sklearn)进行无监督学习,然后我跟随
this example 。
我为这些愚蠢的问题道歉但我对两件事有点困惑:
我应该同时针对常规示例和异常值训练我的 svm,还是仅针对常规示例进行训练?
OSVM 预测并代表异常值的标签是 1 还是 -1
我再次为这些问题道歉,但由于某种原因,我找不到任何记录在案的任何软件
【问题讨论】:
标签:
machine-learning
scikit-learn
svm
libsvm
sklearn-pandas
【解决方案1】:
您引用的这个例子是关于新奇检测,docs 说:
新奇检测:
训练数据没有被异常值污染,我们有兴趣在新的观察中检测异常。
意思:你应该只训练常规例子。
该方法基于:
Schölkopf、Bernhard 等人。 “估计高维分布的支持。”神经计算 13.7 (2001): 1443-1471。
摘录:
假设您有一些从潜在概率分布 P 中提取的数据集,并且您想要估计输入空间的“简单”子集 S,使得从 P 中提取的测试点位于 S 之外的概率等于某个先验0 到 1 之间的指定值。
我们提出了一种方法来解决这个问题,方法是尝试估计在 S 上为正而在补码上为负的函数 f。
上面的文档还说:
内部点标记为 1,而异常点标记为 -1。
这也可以在您的示例代码中看到,提取:
# Generate some regular novel observations
X = 0.3 * np.random.randn(20, 2)
X_test = np.r_[X + 2, X - 2]
...
# all regular = inliers (defined above)
y_pred_test = clf.predict(X_test)
...
# -1 = outlier <-> error as assumed to be inlier
n_error_test = y_pred_test[y_pred_test == -1].size