将目标/标签数据传递给 Scikit-learn GridSearchCV 的 OneClassSVM 拟合方法
Posted
技术标签:
【中文标题】将目标/标签数据传递给 Scikit-learn GridSearchCV 的 OneClassSVM 拟合方法【英文标题】:Passing Target/Label data to Scikit-learn GridSearchCV's fit method for OneClassSVM 【发布时间】:2020-01-30 07:01:09 【问题描述】:据我了解,One-Class SVM 是在没有目标/标签数据的情况下进行训练的。
Use of OneClassSVM with GridSearchCV 的一个答案建议当分类器是 OneClassSVM
时将目标/标签数据传递给 GridSearchCV 的 fit 方法。
GridSearchCV
方法如何处理这些数据?
它是否真的在没有目标/标签数据的情况下训练OneClassSVM
,而只使用目标/标签数据进行评估?
我尝试关注GridSearchCV source code,但找不到答案。
【问题讨论】:
如果你有标签数据,那你为什么要训练一个 OneClassSVM? 测试 OneClassSVM。 :) 如果我训练一个带有训练数据和我的测试数据的系统,系统将了解测试数据。我创建了一个综合测试用例,我想用它来评估 OneClassSVM 在遇到数据类型时的表现。 如果目的是测试 OneClassSVM,那么您可以在没有 GridSearchCV 的情况下执行此操作,因为您不会调整算法。但是,如果您也有火车标签,那么与使用监督分类器从您的火车标签中学习相比,这样做有什么好处? 使用 GridSearchCV 的原因是为了揭示该算法在示例假设合成测试子类上的执行情况。我可以编写自己的代码来做到这一点,但如果可能的话,我想使用 scikit-learn 框架。这样做而不是使用监督分类器的好处是我想训练一个系统来学习关于 1 个普通类的东西并执行新奇检测。同样,我的测试用例是假设的,不包括所有类型的数据。 “GridSearchCV 旨在调整参数以使模型最适合火车标签”的陈述至少并不总是正确的。我相信,但可能是错误的,它使用了完全不使用训练数据的交叉验证。此外,GridSearchCV 支持无监督学习,在训练过程中不使用训练标签。这在documentation for the GridSearchCV's fit method 中有描述 【参考方案1】:它是否真的在没有目标/标签数据的情况下训练 OneClassSVM,而只使用目标/标签数据进行评估?
两者都是。
GridSearchCV does 实际上在 fit
调用中将标签发送到 OneClassSVM,但 OneClassSVM 只是 ignores 它。请注意在第二个链接中,如何将一个数组发送到主 SVM 训练器,而不是给定标签数组 y
。 fit
中的 y
之类的参数仅存在以便像 GridSearchCV
这样的元估计器可以以一致的方式工作,而不必担心有监督/无监督的估计器。
要实际测试这一点,我们首先使用 GridSearchCV 检测异常值:
X,y = load_iris(return_X_y=True)
yd = np.where(y==0,-1,1)
cv = KFold(n_splits=4,random_state=42,shuffle=True)
model = GridSearchCV(OneClassSVM(),'gamma':['scale'],cv=cv,iid=False,scoring=make_scorer(f1_score))
model = model.fit(X,yd)
print(model.cv_results_)
注意cv_results_
中的所有splitx_test_score
。
现在让我们手动进行,无需在fit
通话期间发送标签yd
:
for train,test in cv.split(X,yd):
clf = OneClassSVM(gamma='scale').fit(X[train]) #Just features
print(f1_score(yd[test],clf.predict(X[test])))
两者的分数应该完全相同。
【讨论】:
很好的答案!我觉得这应该作为 scikit-learn GridSearchCV 和 OneClassSVM 文档中的示例。以上是关于将目标/标签数据传递给 Scikit-learn GridSearchCV 的 OneClassSVM 拟合方法的主要内容,如果未能解决你的问题,请参考以下文章