将 Target/Label 数据传递给 Scikit-learn GridSearchCV 的 OneClassSVM 拟合方法

Passing Target/Label data to Scikit-learn GridSearchCV's fit method for OneClassSVM

根据我的理解,One-Class SVM 是在没有 target/label 数据的情况下训练的。

Use of OneClassSVM with GridSearchCV 的一个答案建议当分类器是 OneClassSVM.

时将 Target/Label 数据传递给 GridSearchCV 的拟合方法

GridSearchCV 方法如何处理这些数据?

它实际上是在没有Target/label数据的情况下训练OneClassSVM,而只使用Target/label数据进行评估吗?

我尝试按照 GridSearchCV source code 进行操作,但找不到答案。

Does it actually train the OneClassSVM without the Target/label data, and just use the Target/label data for evaluation?

两者都是。

GridSearchCV does actually send labels to OneClassSVM in fit call, but OneClassSVM simply ignores 它。请注意在第二个 link 中如何将一个数组发送到主 SVM 训练器而不是给定的标签数组 yfit 中的 y 等参数的存在只是为了让像 GridSearchCV 这样的元估计器可以以一致的方式工作,而不必担心 supervised/unsupervised 估计器。

为了实际测试这一点,让我们首先使用 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])))

两者应该产生完全相同的分数。