我想使用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)
答案 0 :(得分:3)
我假设您使用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_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)或设计你自己的评分方法来计算你的数据的离群值检测。
随时询问是否需要更多帮助。