将 OneClassSVM 与 cross_val_score 一起使用

Posted

技术标签:

【中文标题】将 OneClassSVM 与 cross_val_score 一起使用【英文标题】:Use of OneClassSVM with cross_val_score 【发布时间】:2017-09-27 03:12:39 【问题描述】:

我想使用 cross_val_score 来验证我的 OneClassSVM 训练集。这样做会导致以下错误消息。

难道是因为 OneClassSVM 是一种无监督算法,没有“y”向量传递给 cross_val_score,所以算法失败了?

clf = svm.OneClassSVM(nu=_nu, kernel=_kernel, gamma=_gamma, random_state=_random_state, cache_size=_cache_size)
scores = cross_val_score(estimator=clf, X=X_scaled, scoring='accuracy', cv=5)

PS:我意识到“y”向量在 cross_val_score 中是可选的。但是,错误仍然让我假设“y”向量会导致错误。


File "/usr/local/lib/python2.7/site-packages/sklearn/model_selection/_validation.py", line 140, in cross_val_score
    for train, test in cv_iter)
  File "/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 758, in __call__
    while self.dispatch_one_batch(iterator):
  File "/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 608, in dispatch_one_batch
    self._dispatch(tasks)
  File "/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 571, in _dispatch
    job = self._backend.apply_async(batch, callback=cb)
  File "/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 109, in apply_async
    result = ImmediateResult(func)
  File "/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 326, in __init__
    self.results = batch()
  File "/usr/local/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 131, in __call__
    return [func(*args, **kwargs) for func, args, kwargs in self.items]
  File "/usr/local/lib/python2.7/site-packages/sklearn/model_selection/_validation.py", line 260, in _fit_and_score
    test_score = _score(estimator, X_test, y_test, scorer)
  File "/usr/local/lib/python2.7/site-packages/sklearn/model_selection/_validation.py", line 286, in _score
    score = scorer(estimator, X_test)
TypeError: __call__() takes at least 4 arguments (3 given)

【问题讨论】:

【参考方案1】:

我假设您将 OneClassSVM 用于异常值检测原因(为此它在 scikit 中实现,而不是用于分类任务)

documentation of cross_val_score 说的是y

y :类数组,可选,默认值:无

在监督学习的情况下尝试预测的目标变量。

请参阅那里的“监督学习”。

所以当你这样做时:

clf = svm.OneClassSVM(nu=_nu, kernel=_kernel, gamma=_gamma, 
                      random_state=_random_state, cache_size=_cache_size)

scores = cross_val_score(estimator=clf, X=X_scaled, scoring='accuracy', cv=5)

您的假设是正确的,OneClassSVM 是一个无监督模型,它不需要y 参数。到目前为止一切顺利。

但您也将scoring 参数设置为“准确度”。这就是错误的来源。当您使用字符串“accuracy”时,将使用默认的 [accuracy_score] (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html) 指标,该指标具有签名:

accuracy_score(y_true, y_pred, ... ...)

实际和预测的y 是必需的(不是可选的),这会强制cross_val_score 检查是否提供了y,因此会出现错误。

希望你明白我的意思。

解决方案:

正如this answer here 中所述,“在一类 SVM 中,准确性的概念是不合适的。”但是,如果您仍然打算使用“准确性”,那么您需要为y 所提供的数据准备好基本事实。基本上,y 应该由 +1 或 -1 组成,具体取决于实际样本是内点还是异常点。

我为什么使用 +1 和 -1 是因为 OneClassSVM.predict() 会返回这样的值:

预测(X)

对 X 中的样本执行回归。对于一类模型,返回 +1 或 -1。

否则您需要找到任何其他评分指标,它可以为您的预测 X(没有实际的基本事实 y)提供一些有意义的分数,或者设计您自己的评分方法来计算数据的异常值检测。

如果需要更多帮助,请随时询问。

【讨论】:

感谢您的回复!这说得通。 scikit-learn 中的标准评分指标都不符合我的需要。听起来稳健的行动方案是设计一个适合我的数据集的独立评分函数。 是否可以使用OneClassSVM.decision_function(X) 作为指标? Its documentation 表示 到分离超平面的有符号距离。有符号距离对于内点是正数,对于离群点是负数。因此,也许您可​​以将其在您的示例中的平均值作为衡量标准,然后尝试将其最大化。我不确定它是否会起作用,我想要@Vivek Kumar 的观点......

以上是关于将 OneClassSVM 与 cross_val_score 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将目标/标签数据传递给 Scikit-learn GridSearchCV 的 OneClassSVM 拟合方法

Classifier.fit for oneclassSVM 抱怨浮点类型。 TypeError 浮点数是必需的

用于二进制分类的 OneClassSVM

将 model.predict() 的结果与原始 pandas DataFrame 合并?

scikit learn Pipeline中的后处理分类器输出

图像的深度学习异常检测