5

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

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

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

它实际上是否在OneClassSVM没有目标/标签数据的情况下进行训练,并且只使用目标/标签数据进行评估?

我尝试遵循GridSearchCV 源代码,但找不到答案。

4

1 回答 1

4

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

两者都是。

GridSearchCV确实在调用中将标签发送到 OneClassSVM fit,但 OneClassSVM 只是忽略它。请注意,在第二个链接中,如何将一个数组发送到主 SVM 训练器,而不是给定标签数组yy像in这样的参数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_scorecv_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])))

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

于 2019-10-11T10:59:26.367 回答