将 OneClassSVM 与 cross_val_score 结合使用

Mil*_*d M 2 python svm scikit-learn cross-validation

我想使用 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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Viv*_*mar 5

我假设您使用 OneClassSVM 进行异常值检测(它是在 scikit 中实现的,而不是用于分类任务)

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)
Run Code Online (Sandbox Code Playgroud)

您的假设是正确的,这OneClassSVM是一个无监督模型,并且不需要参数y。到现在为止一切都很好。

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

accuracy_score(y_true, y_pred, ... ...)
Run Code Online (Sandbox Code Playgroud)

需要实际的和预测的y(不是可选的),这迫使cross_val_score检查y是否提供,从而产生错误。

希望你明白我的意思。

解决方案:

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

为什么我使用 +1 和 -1 是因为 OneClassSVM.predict ()将返回如下值:

预测(X)

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

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

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