Я пытаюсь создать свою собственную функцию оценки для OneVsRestClassifier и столкнулся с некоторыми проблемами.
pipeline = Pipeline([
('tfidf', TfidfVectorizer()),
('clf', OneVsRestClassifier(MultinomialNB(fit_prior=True, class_prior=None)))
])
parameters = {
'tfidf__max_df': (0.25, 0.5, 0.75),
'tfidf__ngram_range': [(1, 1), (1, 2), (1, 3)],
'clf__estimator__alpha': (1e-2, 1e-3)
}
grid_search_cv = GridSearchCV(pipeline, parameters, cv=2, n_jobs=3, verbose=10, scoring=overall_f1_score_cv)
grid_search_cv.fit(train_X, train_y)
Здесь train_X и train_y - это панды DataFrames с train_X, имеющим всего 1 столбец (содержащий текстовые данные), и train_y, имеющим 27 двоичных столбцов (27 различных классов). Моя функция оценки определяется следующим образом.Я заметил, что прогнозируемый результат был np.array.
def overall_f1_score(y_actual, y_predict):
num_genres = y_actual.shape[1]
tp, fp, fn = 0, 0, 0
for idx in range(num_genres):
tp+=((y_actual[:,idx]==1) & (y_predict[:,idx]==1)).sum()
fp+=((y_actual[:,idx]==0) & (y_predict[:,idx]==1)).sum()
fn+=((y_actual[:,idx]==1) & (y_predict[:,idx]==0)).sum()
precision = tp/(tp+fp)
recall = tp/(tp+fn)
f1_score = 2*precision*recall/(precision+recall)
return f1_score
overall_f1_score_cv = make_scorer(overall_f1_score, greater_is_better=True)
При использовании вышеупомянутой функции оценки мое совпадение с GridSearchCV, похоже, застряло.Это прекрасно работает без моего дополнительного аргумента оценки.Может кто-нибудь помочь мне с правильным форматом, чтобы использовать настраиваемую функцию оценки для этого сценария?