Индивидуальная функция оценки для OneVsRestClassifier в конвейере - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь создать свою собственную функцию оценки для 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, похоже, застряло.Это прекрасно работает без моего дополнительного аргумента оценки.Может кто-нибудь помочь мне с правильным форматом, чтобы использовать настраиваемую функцию оценки для этого сценария?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...