Действительно ли он обучает OneClassSVM без данных цели / метки и просто использует данные цели / метки для оценки?
Да для обеих сторон.
GridSearchCV действительно действительно отправляет метки OneClassSVM при fit
вызове, но OneClassSVM просто игнорирует его. Обратите внимание во 2-й ссылке, как массив единиц отправляется основному SVM-тренеру вместо заданного массива меток y
. Такие параметры, как y
в 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])))
Оба должны давать одинаковые оценки.