管道中OneVsRestClassifier的自定义评分功能

时间:2019-02-25 05:29:17

标签: python machine-learning scikit-learn multiclass-classification gridsearchcv

我正在尝试为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是pandas DataFrame,其中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适合似乎卡住了。没有我的其他得分理由,它可以正常工作。有人可以在这种情况下以正确的格式帮助我使用自定义评分功能吗?

0 个答案:

没有答案