将OneClassSVM与cross_val_score一起使用

时间:2017-04-28 22:29:25

标签: python scikit-learn svm cross-validation

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

可能是因为OneClassSVM是一个无监督的算法,并且没有传递给cross_val_score的“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)

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 个答案:

答案 0 :(得分:3)

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

documentation of cross_val_scorey

  

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_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中所述,&#34;在单类SVM中,准确性的概念不合适。&#34;但是,如果您仍然打算使用&#34;准确度&#34;,那么您需要为y提供的数据准备就绪。基本上y应该包含+1或-1,具体取决于实际样本是内部还是异常值。

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

  

预测(X)

     

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

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

随时询问是否需要更多帮助。