将 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 浮点数是必需的
将 model.predict() 的结果与原始 pandas DataFrame 合并?