我试图为 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 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 拟合似乎卡住了。如果没有我的额外评分参数,它就可以正常工作。任何人都可以帮助我使用正确的格式来为这种情况使用自定义评分功能吗?