Scikit learn 将目标/标签数据传递给Scikit learn GridSearchCV';OneClassSVM的s拟合方法

Scikit learn 将目标/标签数据传递给Scikit learn GridSearchCV';OneClassSVM的s拟合方法,scikit-learn,svm,unsupervised-learning,gridsearchcv,one-class-classification,Scikit Learn,Svm,Unsupervised Learning,Gridsearchcv,One Class Classification,据我所知,一类SVM的训练没有目标/标签数据 一个答案是,当分类器是OneClassSVM时,将目标/标签数据传递给GridSearchCV的拟合方法 GridSearchCV方法如何处理这些数据 它是否真的在没有目标/标签数据的情况下训练OneClassSVM,并且只使用目标/标签数据进行评估 我试着跟着答案走,但找不到答案 它是否真的在没有目标/标签数据的情况下训练OneClassSVM,并且只使用目标/标签数据进行评估 两人都同意 GridSearchCV实际上在fit调用中将标签发送给O

据我所知,一类SVM的训练没有目标/标签数据

一个答案是,当分类器是
OneClassSVM
时,将目标/标签数据传递给GridSearchCV的拟合方法

GridSearchCV
方法如何处理这些数据

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

我试着跟着答案走,但找不到答案

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

两人都同意

GridSearchCV实际上在
fit
调用中将标签发送给OneClassSVM,但OneClassSVM只是简单地发送标签。请注意,在第二个链接中,如何将一个数组发送到主SVM训练器,而不是给定的标签数组
y
fit
中的
y
等参数的存在只是为了使
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_)
记下
cv\u结果中的所有
splitx\u测试得分

现在,让我们在
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])))

两者的得分应该完全相同。

如果您有标签数据,那么为什么要训练OneClassSVM?来测试OneClassSVM。:)如果我训练一个带有训练数据和测试数据的系统,系统将了解测试数据。我创建了一个合成测试用例,我想用它来评估OneClassSVM在遇到数据类型时的表现。如果目的是测试OneClassSVM,那么您可以在没有GridSearchCV的情况下进行测试,因为您不会调整算法。但是,如果您也有火车标签,那么与有监督的分类器从火车标签学习相比,这有什么好处?使用GridSearchCV的原因是为了揭示算法在一个示例假设的合成测试子类上的性能。我可以通过编写自己的代码来实现这一点,但如果可能的话,我希望利用scikit学习框架。这样做而不是使用监督分类器的好处是,我想训练一个系统来学习关于1个普通类的知识&执行新颖性检测。同样,我的测试用例是假设的,不包括所有类型的数据。“GridSearchCV旨在调整参数,以便模型最适合火车标签”的说法至少不总是正确的。我相信,但可能是错误的,它使用的交叉验证根本没有利用训练数据。此外,GridSearchCV支持无监督学习,在培训过程中不使用培训标签。这是描述在伟大的答案!我觉得这应该在scikit learn GridSearchCV和OneClassSVM文档中作为一个例子。