将目标/标签数据传递到Scikit学习GridSearchCV的适用于OneClassSVM的fit方法

时间:2019-10-01 01:40:53

标签: scikit-learn svm unsupervised-learning gridsearchcv one-class-classification

据我了解,一类SVM在没有目标/标签数据的情况下进行了培训。

Use of OneClassSVM with GridSearchCV的一个答案建议,当分类器为itemsInBackpack时,将Target / Label数据传递到GridSearchCV的fit方法。

itemsInBackpack = ["book", "computer", "keys", "travel mug"]方法如何处理此数据?

它是否真的在没有目标/标签数据的情况下训练了OneClassSVM,而只是使用目标/标签数据进行评估?

我尝试遵循GridSearchCV source code,但找不到答案。

1 个答案:

答案 0 :(得分:4)

  

它真的训练没有目标/标签数据的OneClassSVM,而只是使用目标/标签数据进行评估吗?

是的。

GridSearchCV does实际上是在fit调用中将标签发送到OneClassSVM,而OneClassSVM只是ignores。注意在第二个链接中,如何将一个数组发送给主SVM训练器,而不是给定的标签数组yy中的fit之类的参数仅存在,以便像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_)

请注意splitx_test_score中的所有cv_results_

现在让我们手动进行操作,而无需在yd通话期间发送标签fit

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])))

两个分数都应该完全相同。