Действительно ли он обучает 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])))
Оба должны давать одинаковые результаты.
person
Shihab Shahriar Khan
schedule
11.10.2019