将 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 训练器而不是给定的标签数组 y
。 fit
中的 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])))
两者应该产生完全相同的分数。
根据我的理解,One-Class SVM 是在没有 target/label 数据的情况下训练的。
Use of OneClassSVM with GridSearchCV 的一个答案建议当分类器是 OneClassSVM
.
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 训练器而不是给定的标签数组 y
。 fit
中的 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])))
两者应该产生完全相同的分数。