据我了解,一类 SVM 是在没有目标/标签数据的情况下进行训练的。
Use of OneClassSVM with GridSearchCV 的一个答案建议当分类器是OneClassSVM
.
该方法如何GridSearchCV
处理这些数据?
它实际上是否在OneClassSVM
没有目标/标签数据的情况下进行训练,并且只使用目标/标签数据进行评估?
我尝试遵循GridSearchCV 源代码,但找不到答案。
据我了解,一类 SVM 是在没有目标/标签数据的情况下进行训练的。
Use of OneClassSVM with GridSearchCV 的一个答案建议当分类器是OneClassSVM
.
该方法如何GridSearchCV
处理这些数据?
它实际上是否在OneClassSVM
没有目标/标签数据的情况下进行训练,并且只使用目标/标签数据进行评估?
我尝试遵循GridSearchCV 源代码,但找不到答案。
它是否真的在没有目标/标签数据的情况下训练 OneClassSVM,并且只使用目标/标签数据进行评估?
两者都是。
GridSearchCV确实在调用中将标签发送到 OneClassSVM fit
,但 OneClassSVM 只是忽略它。请注意,在第二个链接中,如何将一个数组发送到主 SVM 训练器,而不是给定标签数组y
。y
像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_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])))
两者都应该产生完全相同的分数。