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